리버티게임토론:청사진/리버티게임 도전 서버 명세

리버티게임, 모두가 만들어가는 자유로운 게임

'미디어위키: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로 이름 전환 중