👉 목차 | |
---|---|
1. 요구사항 분석 | 각 요구사항 분석 |
2. API 명세서 | swagger url |
3. 구현 과정 | 기술스택, 모델링, 폴더 구조, 작업 내역 |
4. 테스트 | 각 서비스 unit test / e2e test |
5. 서비스 배포 | service url 및 배포 화면 |
보스레이드(Boss Raid) PVE 컨텐츠 관련 기능을 제공하는 백엔드 서비스입니다. 레이드(Raid)
란 비디오 게임에서 미션의 한 종류로 다수의 플레이어가 다수의 NPC(Non Player Character)를 상대로 공격하여 승리하는 것을 말합니다. 본 서비스에서 제공하는 기능으로는 유저 생성
, 유저 조회
, 보스레이드 상태 조회
, 보스레이드 시작/종료
, 랭킹 조회
가 있습니다.
- 한 번에 한 명의 유저만 보스레이드를 진행할 수 있다는 제약 조건을 만족시키기 위해
동시성(Concurrency)
을 고려하여 서비스를 구현하였습니다(Distributed Locks with Redis 사용). - 또한 static 데이터 또는, 일정 시간동안 변하지 않는 데이터(ex. ranking)에 대한 요청을 효율적으로 처리하기 위해 이러한 요청에 대한 응답을
레디스(Redis)에 캐싱
하여 응답하도록 구현하였습니다.
-
유저를 생성한다.
- API:
POST /user
- 중복되지 않는 userId를 생성
- 생성된 userId를 응답
- API:
-
유저를 조회한다.
- API:
GET /user/:userId
- 해당 유저의 보스레이드 총 점수와 참여 기록 응답
- API:
-
보스레이드 상태 조회
- API :
GET /bossRaid
- 보스레이드 현재 상태 응답
- canEnter: 입장 가능 여부
- enteredUserId: 현재 진행중인 유저가 있다면, 해당 유저의 id
- 입장 가능 조건: 한 번에 한 명의 유저만 보스레이드를 진행할 수 있다.
- 아무도 보스레이드를 시작한 기록이 없다면 시작 가능
- 시작한 기록이 있다면
a. 마지막으로 시작한 유저가 보스레이드를 종료했거나
b. 마지막으로 시작한 시간으로부터레이드 제한 시간
만큼 경과되었어야 함
- API :
-
보스레이드 시작
- API :
POST /bossRaid/enter
- 레이드 시작 가능하다면 중복되지 않는 raidRecordId를 생성하여
isEntered: true
와 함께 응답 - 레이드 시작이 불가능하다면
isEntered: false
- API :
-
보스레이드 종료
- API :
PATCH /bossRaid/end
- raidRecordId 종료 처리
- 레이드 level에 따른 score 반영
- 유효성 검사
- 저장된 userId와 raidRecordId 일치하지 않다면 예외 처리
- 시작한 시간으로부터
레이드 제한 시간
이 지났다면 예외 처리
- API :
-
보스레이드 랭킹 조회
- API :
GET /bossRaid/topRankerList
- 보스레이드
totalScore 내림차순
으로 랭킹을 조회한다.
- API :
-
추가 고려 사항
- 랭킹 데이터는 레디스에 캐싱한다.
- staticData도 캐싱을 고려한다.
- 동시성을 고려한다.
- 발생할 수 있는 다양한 에러 상황을 잘 처리한다.
swagger를 사용하여 제작한 API Docs
데이터베이스는 AWS RDS - mysql로 생성했습니다.
concurrency-aware-game-backend-service/
├─ src/
│ ├─ app.service.ts
│ ├─ app.module.ts
│ ├─ main.ts
│ ├─ boss-raid-history/
│ ├─ user/
│ ├─ common/
│ ├─ database/
│ ├─ redis/
├─ test/
백엔드 서비스에 필요한 리소스들을 기준으로 폴더로 나누고, 각 폴더에 DTO 및 Entity를 작성하여 테이블 생성
각 리소스 폴더에 module, controller, service, unit test가 정의되어 있음
- boss-raid-history: 보스레이드 리소스
- user: 유저 리소스
- common: enum, interface, type등 프로젝트에서 공통으로 사용되는 파일 저장
- database: 데이터베이스 리소스
- redis: 캐싱을 위한 Redis 리소스
- test: e2e 테스트
✔️ 서버 초기 세팅
✔️ Redis 세팅
✔️ User 기능 구현
✔️ Boss Raid 기눙 구현
✔️ Swagger API Documentation
✔️ Readme.md 작성
⭐️ Unit test 수행
⭐️ e2e test 수행
⭐️ 배포
- 유저 생성 기능
- 유저 생성기 고유한 id 생성
-
보스레이드 상태 조회
- 보스레이드를 시작한 기록이 없다면 canEnter: true
- 보스레이드를 플레이중인 유저가 있다면 canEnter: false
- 시작한 시간으로부터 레이드 제한 시간 만큼 경과되었으면 canEnter: true
-
보스레이드 입장
- 존재하지 않는 userId 로 요청시 예외 처리
- 존재하지 않는 level 로 요청시 예외 처리
- canEnter: false 일 때 입장 요청시 isEntered: false (입장 거부)
-
보스레이드 종료
- 저장된 userId와 raidRecordId에 해당하는 user 불일치일 경우 예외처리
- 존재하지 않는 raidRecordId일 경우 예외처리
- 이미 종료된 레이드일 경우 예외 처리
- 시작한 시간으로부터 레이드 제한시간이 지났다면 예외처리
- 보스레이드 입장 성공시 서버 응답값 검증
- 보스레이드 입장 실패시 서버 응답값 검증
- 보스레이드 종료시 level에 따른 score 반영 검증
- 랭킹 정보 조회 서버 응답값 검증