Skip to content

Cat-Nile/03_GameDuo_Backend

 
 

Repository files navigation

과제 03 - GameDuo_Backend

목차

👨‍👨‍👦‍👦 Team "F" member

이승민 임혁 전재완 정용수
Github Github Github Github

💻 Team work 📒 Project page
공지사항, 컨벤션 공유 등
우리 팀을 위한 룰
요구사항 분석, 정보 공유 및
원할한 프로젝트를 위해 사용

⌛ 개발 기간

2022/07/11 ~ 2022/07/15

💻 프로젝트

프로젝트 설명

  • 보스레이드 PVE 컨텐츠 관련 6가지 라우터를 작성해주세요.
    • 유저 생성
    • 중복되지 않는 userId 생성
      • 생성된 userId 응답
    • 유저 조회
      • 해당 유저의 보스레이드 총 점수와 참여기록 응답
    • 보스레이드 상태 조회
      • 보스레이드 현재 상태 응답
        • canEnter: 입장 가능 여부
        • enteredUserId: 현재 진행중인 유저가 있다면, 해당 유저의 id
      • 입장 가능 조건: 한번에 한명의 쥬저만 보스레이드 진행, 레이드 제한 시간 고려
    • 보스 레이드 시작
      • 중복되지 않는 raidRecordId를 생성 후 isEntered:true 응답
      • 시작이 불가능 하다면 isEntered: false
    • 보스레이드 종료
      • 레이드 level에 따른 score 반영
      • 유효성 검사: userId와 raidRecordId가 일치하지 않다면 예외 처리
      • 시작한 시간으로부터 레이드 제한 시간이 지났다면 예외처리
    • 보스레이드 랭킹 조회

프로젝트 분석

  • Static Data를 Redis에 캐싱하여 사용
  • 보스레이드 입장 제한 시간에 따라 재입장 처리
  • 저장된 userId와 raidRecordidId 일치하지 않다면 예외 처리
  • 동시성 고려
    • 유저A와 유저B가 같은 보스레이드에 입장했을 때 처리
  • 랭킹 데이터는 웹 서버에 캐싱 또는 Redis에 캐싱
  • 레이어 계층 분리
  • 발생할 수 있는 다양한 예외 처리

패턴


데이터 다이어그램


API 명세서

ID URI METHOD 기능
1 /users/register POST 유저 생성
2 /users/login POST 로그인
3 /users/<int: user_id> GET 유저 정보 조회
4 /bossRaid GET 보스레이드 상태 조회
5 /bossRaid/enter POST 보스레이드 시작
6 /bossRaid/end PATCH 보스레이드 종료
7 /bossRaid/<int:game_id> GET 보스레이드 접속
8 /bossRaid/topRankerList?user_id=<int:user_id> GET 랭킹조회
1. 유저 생성
[POST]
users/register
  • Request
{
"username": "testuser",
"password": "password@"
}

  • Response
SUCCESS {
"username": "testuser"
}

2. 로그인
[POST]
/users/login
  • Request
{
"username": "testuser",
"password": "password@"
}

  • Response
SUCCESS {
"username": "testuser"
}

3. 유저 정보 조회
[GET]
/users/<int: user_id>
  • Response
SUCCESS {
  "totalScore": 199,
  "bossRaidHistory": [
      {
          "id": 22,
          "score": 85,
          "enter_time": "2022-07-15T14:51:03.665203+09:00",
          "end_time": "2022-07-15T14:51:03.665203+09:00"
      },
      ...
  ]
}
4. 보스레이드 상태 조회
[GET]
/bossRaid 
  • Response
SUCCESS {
"status": [
  {
    "bossRaidId": 1,
    "canEnter": false,
    "enteredUserId": 103
  }
]

5. 보스레이드 시작
[POST]
/bossRaid/enter
(보스레이드 입장 전에 보스 레이드 게임 접속 API /bossRaid/{game_id}/를 먼저 실행시켜주어야 합니다. game_id = 1, name = '닌자대전')
  • Request
{
  "user": 1,
  "level": 1,
  "boss_raid": 1
}
  • Response
{
  "isEntered": false,
  "raidRecordId": 1
}
6. 보스레이드 종료
[PATCH]
/bossRaid/end
  • Request
{
  "userId": 1,
  "raidRecordId": 1,
  "boss_raid": 1
}
  • Response
{
}
7. 보스레이드 접속
[GET]
/bossRaid/\<int:game_id\>
  • Response
SUCCESS {
"Boss Raid": {
  "id": 1,
  "name": "닌자대전"
}
}

8. 랭킹 조회
[GET]
/bossRaid/topRankerList?user_id=\<int:user_id\>
  • Response
SUCCESS {
  "topRankerInfoList": [
      {
          "ranking": 1,
          "userId": 21,
          "totalScore": 217
      },
      {
          "ranking": 2,
          "userId": 1,
          "totalScore": 199
      },
      {
          "ranking": 3,
          "userId": 45,
          "totalScore": 190
      },
      ...
  ],
  "myRankingInfo": {
      "ranking": 33,
      "userId": 3,
      "totalScore": 0
  }
}


ERD

Users: 회원 정보
필드명 타입 비고
id Int PK
user_name String
password String
Total Score: 보스레이드에서 얻은 유저 별 총 점수
필드명 타입 비고
id Int PK
user_id Int Foreign Key (users:id)
total_score Int
BossRaid: 보스레이드
필드명 타입 비고
id Int PK
is_entered Boolean
BossRaidHistory: 보스레이드 시작 및 종료 기록
필드명 타입 비고
id Int PK
user_id Int Foreign Key (users:id)
bossraid_id Int Foreign Key (bossraid:id)
level Int
score Int
enter_time Datetime
end_time Datetime
BossRaidStatus: 보스레이드 상태
필드명 타입 비고
id Int PK
user_id Int Foreign Key (users:id)
bossraid_id Int Foreign Key (bossraid:id)
level Int
last_entertime Datetime


🚥 개발 조건

🙆‍♂️ 필수사항

- Python, Django
- Static Data Redis 캐싱
- 동시성 고려
- 레이어 계층 분리

🔥 선택사항

- Docker
- Unit test codes  
- REST API Documentation (Swagger UI)  

실행 방법

📌 Dependency

# 로컬에서 바로 서버 구동
pip install -r requirements.txt
python manage.py makemigrations
python manage.py migrate
python manage.py runserver

# 도커 실행 (prod branch)
pip install docker
pip install docker-compose
docker-compose up -d

(장고 서버는 15초 대기 시간을 걸었습니다.)

🔥 배포

docker를 이용해 프로젝트 api를 컨테이너화 하여 GCP에 배포했습니다

API Link

GCP 배포, 테스트 및 동작을 확인하였으며, 비용 등의 이유로 현재는 접속불가할 수 있습니다.

swagger

API 명세서 (Swagger)



기술 스택

  • Back-End :      

  • ETC   :    

Releases

No releases published

Packages

No packages published

Languages

  • Python 98.2%
  • Dockerfile 1.8%