리버티게임토론:청사진/리버티게임 도전 서버 명세: 두 판 사이의 차이

리버티게임, 모두가 만들어가는 자유로운 게임
(완성)
 
 
(같은 사용자의 중간 판 8개는 보이지 않습니다)
5번째 줄: 5번째 줄:
2025년 1월에 계획을 시작할 예정, 6월 전까지 동작하는 물건을 만드는 것이 목표, 2025년 9월까지 보강함
2025년 1월에 계획을 시작할 예정, 6월 전까지 동작하는 물건을 만드는 것이 목표, 2025년 9월까지 보강함


코드는 리버티게임 위키 GitHub Organization에 2025년 말에 공개
코드는 리버티게임 위키 [[GitHub:LibertygameWikiKorea|GitHub Organization]]에 2025년 말에 공개


==예상 기술 스택==
==예상 기술 스택==
*백엔드 개발 환경: Java + Spring<ref>Apache Tomcat이 포함된다.</ref> 기반 or Javascript + Node.js + Express.js
*백엔드 개발 환경: Java + Spring<ref>Apache Tomcat이 포함된다.</ref> 기반 or Javascript + Node.js + Express.js
**우선 Spring으로 구현을 시도하되, 3월까지 Spring을 제대로 익히지 못하면 계획을 엎고 Express.js로 개발을 시작한다.
**우선 Spring으로 구현을 시도하되, 3월까지 Spring을 제대로 익히지 못하면 계획을 엎고 Express.js로 개발을 시작한다.
**현재 임시로 만든 임시 리포지토리에는 Node.js 기반으로 환경이 구축되어 있다. 하지만 아직 작업 시작한 부분이 없다.
**현재 임시로 만든 리포지토리에는 Node.js 기반으로 환경이 구축되어 있다. 하지만 아직 작업 시작한 부분이 없다.
*DB: MongoDB로 확정
*DB: MongoDB로 확정
**도전과제 서버의 진행도 데이터는 금융권 DB마냥 ACID가 중요한 데이터 종류가 아님: 빠른 로드가 우선됨
**도전과제 서버의 진행도 데이터는 금융권 DB마냥 ACID가 중요한 데이터 종류가 아님: 빠른 로드가 우선됨
19번째 줄: 19번째 줄:
* 개발을 주도하는 Senouis가 PHP를 제대로 파고 들려면 시간이 더 걸림
* 개발을 주도하는 Senouis가 PHP를 제대로 파고 들려면 시간이 더 걸림
** 여기에는 현재 Java와 Javascript 쪽으로 구직 준비 중인 개인 사정도 있음
** 여기에는 현재 Java와 Javascript 쪽으로 구직 준비 중인 개인 사정도 있음
* Java와 Javascript는 상대적으로 개발자를 구할 기회가 크게 열려 있고, SecionRatings<ref>현재 DocumentRatings로 이름 전환 중</ref> 때와 달리 무거운 미디어위키 엔진에 무언가 직접 더 추가하고 싶지 않음
** Java와 Javascript는 상대적으로 개발자를 구할 기회가 크게 열려 있음
따라서 최소 몇 년 후 위키 엔진을 교체하는 작업을 진행하기 쉽게 서비스를 분리하고 마이크로서비스 아키텍처화를 진행하기 위한 첫 타자로 도전과제 서버를 PHP가 아닌 언어로 개발할 필요가 있음
* 미디어위키 문서에 직접 관계가 있는 SecionRatings<ref>현재 DocumentRatings로 이름 전환 중</ref> 때와 달리 다른 위키 엔진에서도 사용할 법한 기능을 가진 프로젝트를 무거운 미디어위키 엔진에 직접 접착하는 방식은 비효율적임
** 따라서 MSA로의 구조 전환에 대한 첫 타자로 이 프로젝트를 선정했으며, 추후 미디어위키 시스템까지 아예 [https://github.com/librewiki/liberty-engine 리버티엔진]의 추가 개발 작업에 참여하여 교체할 여유가 생기면 완전한 MSA의 형태를 갖출 것으로 예상됨
따라서 최소 몇 년 후 위키 엔진을 교체하는 강수까지 선택지에 넣기 쉽게 서비스를 분리하고 마이크로서비스 아키텍처화를 진행하기 위한 첫 타자로 도전과제 서버를 PHP가 아닌 언어로 개발할 필요가 있음


==기능==
==기능==
39번째 줄: 41번째 줄:
     User->>OAuth Server: Request Access token(AT) and refresh token(RT)
     User->>OAuth Server: Request Access token(AT) and refresh token(RT)
     OAuth Server-->>User: Give AT and RT
     OAuth Server-->>User: Give AT and RT
     User-->>Achievement Server: Request Collection creation with AT
     User->>Achievement Server: Request Collection creation with AT
     Achievement Server-)OAuth Server: Request Profile with AT
     Achievement Server-)OAuth Server: Request Profile with AT
     OAuth Server-->>Achievement Server: Give User Profile if it is right
     OAuth Server--)Achievement Server: Give User Profile if it is right
     Achievement Server-)MongoDB: Create database
     Achievement Server-)MongoDB: Create database
     MongoDB -> Achievement Server: Response Success
     MongoDB --) Achievement Server: Response Success
     Achievement Server-)User: Response Success
     Achievement Server-->>User: Response Success
}}
}}


63번째 줄: 65번째 줄:
     OAuth Server-->>Achievement Server: Give User Profile if it is right
     OAuth Server-->>Achievement Server: Give User Profile if it is right
     Achievement Server-)MongoDB: Purge Document and Empty the collection
     Achievement Server-)MongoDB: Purge Document and Empty the collection
     MongoDB -> Achievement Server: Response Success
     MongoDB --) Achievement Server: Response Success
     Achievement Server-)User: Response Success
     Achievement Server-)User: Response Success
}}
}}
89번째 줄: 91번째 줄:
     OAuth Server-->>Achievement Server: Give User Profile if it is right
     OAuth Server-->>Achievement Server: Give User Profile if it is right
     Achievement Server-)MongoDB: Request update to MongoDB
     Achievement Server-)MongoDB: Request update to MongoDB
     MongoDB -> Achievement Server: Response Success
     MongoDB --) Achievement Server: Response Success
     Achievement Server-)User: Response Success
     Achievement Server-)User: Response Success
}}
}}
106번째 줄: 108번째 줄:
     OAuth Server-->>Achievement Server: Give User Profile if it is right
     OAuth Server-->>Achievement Server: Give User Profile if it is right
     Achievement Server-)MongoDB: Request read database
     Achievement Server-)MongoDB: Request read database
     MongoDB -> Achievement Server: Response Success
     MongoDB --) Achievement Server: Response Success
     Achievement Server-)User: Response Success
     Achievement Server-)User: Response Success
}}
}}
122번째 줄: 124번째 줄:
     OAuth Server-->>Achievement Server: Give User Profile if it is right
     OAuth Server-->>Achievement Server: Give User Profile if it is right
     Achievement Server-)MongoDB: Request read all of collection in database
     Achievement Server-)MongoDB: Request read all of collection in database
     MongoDB -> Achievement Server: Response Success
     MongoDB --) Achievement Server: Response Success
     Achievement Server-)User: Response Success
     Achievement Server-)User: Response Success
}}
}}
141번째 줄: 143번째 줄:
     Achievement Server-)OAuth Server: Request Profile with AT
     Achievement Server-)OAuth Server: Request Profile with AT
     OAuth Server-->>Achievement Server: Give User Profile if it is right
     OAuth Server-->>Achievement Server: Give User Profile if it is right
     Achievement Server-)MongoDB: Request read database
     Achievement Server -) MongoDB: Request read database
     MongoDB -> Achievement Server: Response Success(Fail이면 User에게 다시 입력 요청)
     MongoDB --) Achievement Server: Response Success(Fail이면 User에게 다시 입력 요청)
     Achievement Server-)MongoDB: Request update database
     Achievement Server -) MongoDB: Request update database
     MongoDB -> Achievement Server: Response Success
     MongoDB --) Achievement Server: Response Success
     Achievement Server-)User: Response Success
     Achievement Server -) User: Response Success
}}
}}


160번째 줄: 162번째 줄:
     OAuth Server-->>Achievement Server: Give User Profile if it is right
     OAuth Server-->>Achievement Server: Give User Profile if it is right
     Achievement Server-)MongoDB: Request delete database
     Achievement Server-)MongoDB: Request delete database
     MongoDB -> Achievement Server: Response Success
     MongoDB --) Achievement Server: Response Success
     Achievement Server-)User: Response Success
     Achievement Server-)User: Response Success
}}
}}

2024년 12월 25일 (수) 16:07 기준 최신판

'미디어위키:Gadget-Achievement.js'를 통해 다음 과정을 수행

모든 결과에는 HTTP 응답 코드와 메세지를 응답 헤더에 포함할 것

2025년 1월에 계획을 시작할 예정, 6월 전까지 동작하는 물건을 만드는 것이 목표, 2025년 9월까지 보강함

코드는 리버티게임 위키 GitHub Organization에 2025년 말에 공개

예상 기술 스택[원본 편집]

  • 백엔드 개발 환경: Java + Spring[1] 기반 or Javascript + Node.js + Express.js
    • 우선 Spring으로 구현을 시도하되, 3월까지 Spring을 제대로 익히지 못하면 계획을 엎고 Express.js로 개발을 시작한다.
    • 현재 임시로 만든 리포지토리에는 Node.js 기반으로 환경이 구축되어 있다. 하지만 아직 작업 시작한 부분이 없다.
  • DB: MongoDB로 확정
    • 도전과제 서버의 진행도 데이터는 금융권 DB마냥 ACID가 중요한 데이터 종류가 아님: 빠른 로드가 우선됨
    • 기존의 JSON 파일 저장 방식 대신 BSON 스키마를 사용해 저장하는 MongoDB 채택
      • Spring을 사용할 경우 Spring Data for MongoDB로 DB를 연결할 예정
      • Express.js를 사용할 경우 Mongoose로 연결 예정

왜 PHP로 개발하지 않는가?[원본 편집]

  • 개발을 주도하는 Senouis가 PHP를 제대로 파고 들려면 시간이 더 걸림
    • 여기에는 현재 Java와 Javascript 쪽으로 구직 준비 중인 개인 사정도 있음
    • Java와 Javascript는 상대적으로 개발자를 구할 기회가 크게 열려 있음
  • 미디어위키 문서에 직접 관계가 있는 SecionRatings[2] 때와 달리 다른 위키 엔진에서도 사용할 법한 기능을 가진 프로젝트를 무거운 미디어위키 엔진에 직접 접착하는 방식은 비효율적임
    • 따라서 MSA로의 구조 전환에 대한 첫 타자로 이 프로젝트를 선정했으며, 추후 미디어위키 시스템까지 아예 리버티엔진의 추가 개발 작업에 참여하여 교체할 여유가 생기면 완전한 MSA의 형태를 갖출 것으로 예상됨

따라서 최소 몇 년 후 위키 엔진을 교체하는 강수까지 선택지에 넣기 쉽게 서비스를 분리하고 마이크로서비스 아키텍처화를 진행하기 위한 첫 타자로 도전과제 서버를 PHP가 아닌 언어로 개발할 필요가 있음

기능[원본 편집]

처음 시작할 때[원본 편집]

  • 안내문(수집하게 되는 개인정보 등을 공시)과 함께 OAuth 2.0 인증 절차를 수행하는 링크를 추가
    • 웹 페이지에 진입했을 때 Authorization Token과 Refresh 토큰이 모두 없는 경우
      • OAuth 확장 기능의 절차대로 리버티게임 서버 내 OAuth 기능에 Authorization 토큰 발급 요청
      • Authorization 코드 발급 기능을 먼저 구현한 후 PKCE 과정을 추가해 code_challenge 수행 필요
      • Redirect URI는 요청한 페이지로 설정
    • 웹 페이지에 진입했을 때 Authorization 토큰이 있는 경우 or Refresh 토큰이 있는 경우
      • 즉시 OAuth 확장 기능의 절차대로 리버티게임 서버 내 OAuth 기능에 Access 토큰 및 Refresh 토큰 발급 요청
      • 쿠키에 Access 토큰 및 Refresh 토큰을 1주 유효기간으로 설정
  • 아래 CRUD 요청에서 Access Token 뿐만 아니라 Refresh 토큰까지 만료된 경우 mw.notification으로 재연동을 요청할 것

Create[원본 편집]

libertyga.me/achievement/v0/initialization

  • 스키마 초기화 과정
    • 웹 페이지에 진입하면 READ를 시도하고, 없다는 오류 응답이 왔을 때 Access Token이 있는 경우에만 사용자 이름과 토큰을 헤더에 삽입하여 Create 수행
      • 요청 종류는 PUT으로 설정
      • PUT 요청을 받은 서버는 profile 리소스를 요청하여 인증 성공시 DB에 사용자 이름으로 된 스키마를 생성
        • 스키마 내부에는 항목 이름을 문자와 숫자로 자유롭게 생성 가능하도록 이름 제약을 특수 문자 필터링 외에 걸지 않음
        • 타입의 경우 integer로 강제해야 함
    • 성공/실패할 경우 mw.notification.notify()로 알려야 함

libertyga.me/achievement/v0/addition/{user}/{itemname}

  • 웹 페이지에 진입하면 Access Token이 있는 경우에만 사용자 이름과 토큰을 헤더에 삽입하여 Create 수행, 없으면 로그인 요청을 mw.notification.notify()로 알림
    • 다음과 같은 상황에서 스키마에 항목을 추가
      • 특정 classname을 가진 링크를 클릭했을 때
      • 특정 classname을 가진 div 태그를 발견했을 때 innerHTML에 있는 데이터를 itemname에 밀어넣음
    • 요청 종류는 PUT으로 설정
    • PUT 요청을 받은 서버는 profile 리소스를 요청하여 인증 성공시 DB에 사용자 이름으로 된 스키마 내에 항목을 하나 추가
      • 스키마 내부에는 항목 이름을 문자와 숫자의 조합으로 자유롭게 생성 가능하도록 이름 제약을 특수 문자 필터링 외에 걸지 않음
      • max_value를 설정해야 함: data-value 커스텀 HTML attribute에 기록된 값을 읽어야 함, 기본값은 1로 할 것
      • value는 1로 초기화
    • 결과 반환은 상황에 따라 다름
      • value == maxvalue == 1이면 즉시 달성으로 결과 반환
      • value < maxvalue면 (1/n)을 붙여 결과 반환, 이후 달성할 때마다 왼쪽 숫자를 늘림
  • 성공/실패할 경우 mw.notification.notify()로 알려야 함

Read[원본 편집]

libertyga.me:6400/achievement/v0/item/{user}/{itemname}

  • 아이템 조회 과정
  • 파라미터: user와 itemname은 특수문자 필터링 필요
    • 필터링 통과 실패 -> '제작자가 도전과제 이름을 잘못 지정했습니다.'라는 오류 메세지를 반환하여 mw.notification으로 송출하도록 함

libertyga.me:6400/achievement/v0/allitem/{user}

  • 브라우저 캐싱 기능 추가할 경우 개발할 것
  • 브라우저에 저장된 도전 과제 값을 전부 갱신하기 위해 전체 아이템을 요청(자주 사용하지 않는 API)
    • IndexedDB 필요

Update[원본 편집]

libertyga.me/achievement/v0/modification/{user}/{itemname}

  • POST 요청으로, 헤더에 Access 토큰 부착할 것
  • 진행도 향상용
    • 특정 classname을 가진 링크를 클릭했을 때
    • 특정 classname을 가진 div 태그를 발견했을 때 innerHTML에 있는 데이터를 itemname에 밀어넣음
  • 스키마에 항목이 있고, 달성하지 않은 경우(value < maxvalue) 값을 +1
  • 스키마에 항목이 없는 경우 addition API를 호출

Delete[원본 편집]

libertyga.me/achievement/v0/deletion/{user}/{itemname}

  • 도전과제를 초기화하고 스키마만 남김
  • DELETE 요청이므로 헤더에 Access 토큰 부착할 것

기타[원본 편집]

  • 브라우저 캐싱 기능을 후에 추가할 것
    • HEAD 요청이 추가로 필요하며, 자신의 데이터베이스 스키마의 SHA-256 해시값을 헤더에 포함해 반환할 것
    • 반환한 해시값이 다르면 통짜 조회
  1. Apache Tomcat이 포함된다.
  2. 현재 DocumentRatings로 이름 전환 중