사용자:Senouis/도전과제 서버 명세: 두 판 사이의 차이
둘러보기로 이동
검색으로 이동
(Create까지 작성) |
잔글 (→예상 기술 스택) |
||
(같은 사용자의 중간 판 5개는 보이지 않습니다) | |||
1번째 줄: | 1번째 줄: | ||
'미디어위키:Gadget-Achievement.js'를 통해 다음 과정을 수행 | '미디어위키:Gadget-Achievement.js'를 통해 다음 과정을 수행 | ||
== 예상 기술 스택 == | 모든 결과에는 HTTP 응답 코드와 메세지를 응답 헤더에 포함할 것 | ||
==예상 기술 스택== | |||
** DB: MongoDB 확정 | *백엔드 개발 환경: Java + Spring<ref>Apache Tomcat이 포함됩니다.</ref> 기반 or Javascript + Node.js + Express.js | ||
**3월까지 Spring을 제대로 익히지 못하면 Express.js로 개발을 시작합니다. | |||
**현재 만든 [https://github.com/Xen-alpha/Libertymedia-backend 임시 리포지토리]에는 Node.js 기반으로 환경이 구축되어 있습니다.(아직 작업 시작 안함) | |||
*DB: MongoDB 확정 | |||
**도전과제 서버의 진행도 데이터는 금융권 DB마냥 ACID가 중요한 데이터 종류가 아님: 빠른 로드가 우선됨 | |||
== 기능 == | **기존의 JSON 파일 저장 방식 대신 BSON 스키마로 저장하는 MongoDB 채택 | ||
=== 처음 시작할 때 === | ***Spring을 사용할 경우 Spring Data for MongoDB로 DB를 연결할 예정 | ||
* 안내문(수집하게 되는 개인정보 등을 공시)과 함께 OAuth 2.0 인증 절차를 수행하는 링크를 | ***Express.js를 사용할 경우 Mongoose로 연결 예정 | ||
** 웹 페이지에 진입했을 때 Authorization Token과 Refresh 토큰이 모두 없는 경우 | |||
*** [[mw:Extensions:OAuth|OAuth 확장 기능]]의 절차대로 리버티게임 서버 내 OAuth 기능에 Authorization 토큰 발급 요청 | ==기능== | ||
*** Authorization 코드 발급 기능을 먼저 구현한 후 PKCE 과정을 추가해 code_challenge 수행 필요 | ===처음 시작할 때=== | ||
*** Redirect URI는 요청한 페이지로 설정 | *안내문(수집하게 되는 개인정보 등을 공시)과 함께 OAuth 2.0 인증 절차를 수행하는 링크를 추가 | ||
** 웹 페이지에 진입했을 때 Authorization 토큰이 있는 경우 or Refresh 토큰이 있는 경우 | **웹 페이지에 진입했을 때 Authorization Token과 Refresh 토큰이 모두 없는 경우 | ||
*** 즉시 [[mw:Extensions:OAuth|OAuth 확장 기능]]의 절차대로 리버티게임 서버 내 OAuth 기능에 Access 토큰 및 Refresh 토큰 발급 요청 | ***[[mw:Extensions:OAuth|OAuth 확장 기능]]의 절차대로 리버티게임 서버 내 OAuth 기능에 Authorization 토큰 발급 요청 | ||
*** 쿠키에 Access 토큰 및 Refresh 토큰을 1주 유효기간으로 설정 | ***Authorization 코드 발급 기능을 먼저 구현한 후 PKCE 과정을 추가해 code_challenge 수행 필요 | ||
=== Create === | ***Redirect URI는 요청한 페이지로 설정 | ||
libertyga.me/achievement/ | **웹 페이지에 진입했을 때 Authorization 토큰이 있는 경우 or Refresh 토큰이 있는 경우 | ||
** 웹 페이지에 진입하면 READ를 시도하고, 없다는 오류 응답이 왔을 때 Access Token이 있는 경우에만 사용자 이름과 토큰을 헤더에 삽입하여 Create 수행 | ***즉시 [[mw:Extensions:OAuth|OAuth 확장 기능]]의 절차대로 리버티게임 서버 내 OAuth 기능에 Access 토큰 및 Refresh 토큰 발급 요청 | ||
*** 요청 종류는 PUT으로 설정 | ***쿠키에 Access 토큰 및 Refresh 토큰을 1주 유효기간으로 설정 | ||
*** PUT 요청을 받은 서버는 profile 리소스를 요청하여 인증 성공시 DB에 사용자 이름으로 된 스키마를 생성 | * 아래 CRUD 요청에서 Access Token 뿐만 아니라 Refresh 토큰까지 만료된 경우 mw.notification으로 재연동을 요청할 것 | ||
**** 스키마 내부에는 | |||
** 성공/실패할 경우 [https://doc.wikimedia.org/mediawiki-core/REL1_39/js/#!/api/mw.notification mw.notification.notify()]로 알려야 함 | ===Create=== | ||
=== Read === | libertyga.me/achievement/v0/initialization | ||
=== Update === | *스키마 초기화 과정 | ||
=== Delete === | **웹 페이지에 진입하면 READ를 시도하고, 없다는 오류 응답이 왔을 때 Access Token이 있는 경우에만 사용자 이름과 토큰을 헤더에 삽입하여 Create 수행 | ||
***요청 종류는 PUT으로 설정 | |||
***PUT 요청을 받은 서버는 profile 리소스를 요청하여 인증 성공시 DB에 사용자 이름으로 된 스키마를 생성 | |||
****스키마 내부에는 항목 이름을 문자와 숫자로 자유롭게 생성 가능하도록 이름 제약을 특수 문자 필터링 외에 걸지 않음 | |||
****타입의 경우 integer로 강제해야 함 | |||
**성공/실패할 경우 [https://doc.wikimedia.org/mediawiki-core/REL1_39/js/#!/api/mw.notification mw.notification.notify()]로 알려야 함 | |||
libertyga.me/achievement/v0/addition/{user}/{itemname} | |||
* 웹 페이지에 진입하면 READ를 시도하고, 없다는 오류 응답이 왔을 때 Access Token이 있는 경우에만 사용자 이름과 토큰을 헤더에 삽입하여 Create 수행 | |||
** 다음과 같은 상황에서 스키마에 항목을 추가 | |||
*** 특정 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)을 붙여 결과 반환 | |||
*성공/실패할 경우 [https://doc.wikimedia.org/mediawiki-core/REL1_39/js/#!/api/mw.notification mw.notification.notify()]로 알려야 함 | |||
===Read=== | |||
libertyga.me/achievement/v0/item/{user}/{itemname} | |||
* 아이템 조회 과정 | |||
* 파라미터: user와 itemname은 특수문자 필터링 필요 | |||
** 필터링 통과 실패 -> '제작자가 도전과제 이름을 잘못 지정했습니다.'라는 오류 메세지를 반환하여 mw.notification으로 송출하도록 함 | |||
libertyga.me/achievement/v0/renovation/{user} | |||
* 브라우저 캐싱 기능 추가할 경우 개발할 것 | |||
* 브라우저에 저장된 도전 과제 값을 전부 갱신하는 요청 | |||
** 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 해시값을 헤더에 포함해 반환할 것 | |||
** 반환한 해시값이 다르면 통짜 조회 | |||
<references /> |
2024년 12월 1일 (일) 15:14 기준 최신판
'미디어위키:Gadget-Achievement.js'를 통해 다음 과정을 수행
모든 결과에는 HTTP 응답 코드와 메세지를 응답 헤더에 포함할 것
예상 기술 스택
- 백엔드 개발 환경: Java + Spring[1] 기반 or Javascript + Node.js + Express.js
- 3월까지 Spring을 제대로 익히지 못하면 Express.js로 개발을 시작합니다.
- 현재 만든 임시 리포지토리에는 Node.js 기반으로 환경이 구축되어 있습니다.(아직 작업 시작 안함)
- DB: MongoDB 확정
- 도전과제 서버의 진행도 데이터는 금융권 DB마냥 ACID가 중요한 데이터 종류가 아님: 빠른 로드가 우선됨
- 기존의 JSON 파일 저장 방식 대신 BSON 스키마로 저장하는 MongoDB 채택
- Spring을 사용할 경우 Spring Data for MongoDB로 DB를 연결할 예정
- Express.js를 사용할 경우 Mongoose로 연결 예정
기능
처음 시작할 때
- 안내문(수집하게 되는 개인정보 등을 공시)과 함께 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주 유효기간으로 설정
- 웹 페이지에 진입했을 때 Authorization Token과 Refresh 토큰이 모두 없는 경우
- 아래 CRUD 요청에서 Access Token 뿐만 아니라 Refresh 토큰까지 만료된 경우 mw.notification으로 재연동을 요청할 것
Create
libertyga.me/achievement/v0/initialization
- 스키마 초기화 과정
- 웹 페이지에 진입하면 READ를 시도하고, 없다는 오류 응답이 왔을 때 Access Token이 있는 경우에만 사용자 이름과 토큰을 헤더에 삽입하여 Create 수행
- 요청 종류는 PUT으로 설정
- PUT 요청을 받은 서버는 profile 리소스를 요청하여 인증 성공시 DB에 사용자 이름으로 된 스키마를 생성
- 스키마 내부에는 항목 이름을 문자와 숫자로 자유롭게 생성 가능하도록 이름 제약을 특수 문자 필터링 외에 걸지 않음
- 타입의 경우 integer로 강제해야 함
- 성공/실패할 경우 mw.notification.notify()로 알려야 함
- 웹 페이지에 진입하면 READ를 시도하고, 없다는 오류 응답이 왔을 때 Access Token이 있는 경우에만 사용자 이름과 토큰을 헤더에 삽입하여 Create 수행
libertyga.me/achievement/v0/addition/{user}/{itemname}
- 웹 페이지에 진입하면 READ를 시도하고, 없다는 오류 응답이 왔을 때 Access Token이 있는 경우에만 사용자 이름과 토큰을 헤더에 삽입하여 Create 수행
- 다음과 같은 상황에서 스키마에 항목을 추가
- 특정 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/achievement/v0/item/{user}/{itemname}
- 아이템 조회 과정
- 파라미터: user와 itemname은 특수문자 필터링 필요
- 필터링 통과 실패 -> '제작자가 도전과제 이름을 잘못 지정했습니다.'라는 오류 메세지를 반환하여 mw.notification으로 송출하도록 함
libertyga.me/achievement/v0/renovation/{user}
- 브라우저 캐싱 기능 추가할 경우 개발할 것
- 브라우저에 저장된 도전 과제 값을 전부 갱신하는 요청
- 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 해시값을 헤더에 포함해 반환할 것
- 반환한 해시값이 다르면 통짜 조회
- ↑ Apache Tomcat이 포함됩니다.