Skip to content

보스 레이드 HTTP API 서버 개발 (동시성 고려, Redis 캐싱 및 랭킹) #4차

Notifications You must be signed in to change notification settings

coldrain-f/boss-raid-api-server

Folders and files

NameName
Last commit message
Last commit date
Sep 21, 2022
Sep 19, 2022
Sep 19, 2022
Sep 19, 2022
Sep 19, 2022
Sep 21, 2022
Sep 19, 2022
Sep 21, 2022
Sep 19, 2022
Sep 19, 2022

Repository files navigation

Boss Raid HTTP API Server

Nest Logo

🏹 기술 스택

NestJS TypeScript MySQL Redis


🛰️ 게임듀오 요구사항 분석

보스 레이드 기록 엔티티 필요 속성 분석

  • 보스 레이드 번호
  • 보스 레이드 점수
  • 보스 레이드 입장 시간(Date)
  • 보스 레이드 종료 시간(Date)
  • 클리어한 레벨
  • 입장한 사용자

유저 엔티티 필요 속성 분석

  • 유저 번호
  • 생성일
  • 수정일

요구사항 분석 및 구현 방법

유저 생성
  • 중복되지 않는 userId 생성
  • 생성된 userId 응답
유저 조회
  • 해당 유저의 보스레이드 총 점수와 참여 보스 레이드 기록 응답
보스레이드 상태 조회
  • 보스레이드 현재 상태 응답

  • canEnter: 입장 가능한지

  • enteredUserId: 현재 진행중인 유저가 있다면, 해당 유저의 id

  • 입장 가능 조건: 한 번에 한 명의 유저만 보스레이드 진행이 가능하다.

  • 아무도 보스 레이드를 시작한 기록이 없다면 시작 가능하다.

  • 시작한 기록이 있다면 마지막으로 시작한 유저가 보스레이드를 종료했거나,

    시작한 시간으로부터 레이드 제한시간만큼 경과되어야 한다.

보스레이드 시작
  • 한 번에 한 명의 유저만 보스레이드 진행이 가능하다.

    ( node-redlock을 사용하여 redis lock을 걸어서 동시성 고려하도록 구현 )

  • 레이드 시작이 가능하다면 중복되지 않은 raidRecordId를 생성하여

    isEntered:true와 함께 응답

  • 레이드 시작이 불가하다면 isEntered: false 반환

보스레이드 종료
  • raidRecordId 종료 처리

  • 레이드 level에 따른 score 반영

    ( 보스 레이드 staticData는 Redis에 캐싱하여 사용 )

  • 저장된 userId와 raidRecordId가 일치하지 않는다면 예외 처리

  • 시작한 시간으로부터 레이드 제한시간이 지났다면 예외 처리

랭킹 조회
  • 보스레이드 totalScore 내림차순으로 랭킹 조회

  • Redis에 캐싱하여 랭킹 기능 구현

    ( Redis Sorted set 자료구조를 활용하여 랭킹 기능 구현 )

  • 탑 랭커 리스트 반환(1위부터 10위까지)

  • 나의 랭킹 반환


🛰️ API 명세서

포스트맨 API 문서

https://documenter.getpostman.com/view/15230748/2s7Z7Wqb6x


🔀 ERD(Entity Relationship Diagram)

image

✨ 프로젝트 구조

project/
├─ src/
│  ├─ boss-raid/
│  ├─ boss-raid-history
│  ├─ rank
│  ├─ common
│  ├─ database
│  ├─ users
├─ app.controller.ts
├─ app.module.ts
├─ app.service.ts
├─ main.ts

About

보스 레이드 HTTP API 서버 개발 (동시성 고려, Redis 캐싱 및 랭킹) #4차

Topics

Resources

Stars

Watchers

Forks