이승민 | 임혁 | 전재완 | 정용수 |
---|---|---|---|
Github | Github | Github | Github |
💻 Team work | 📒 Project page |
공지사항, 컨벤션 공유 등 우리 팀을 위한 룰 |
요구사항 분석, 정보 공유 및 원할한 프로젝트를 위해 사용 |
- 보스레이드 PVE 컨텐츠 관련 6가지 라우터를 작성해주세요.
- 유저 생성
- 중복되지 않는 userId 생성
- 생성된 userId 응답
- 유저 조회
- 해당 유저의 보스레이드 총 점수와 참여기록 응답
- 보스레이드 상태 조회
- 보스레이드 현재 상태 응답
- canEnter: 입장 가능 여부
- enteredUserId: 현재 진행중인 유저가 있다면, 해당 유저의 id
- 입장 가능 조건: 한번에 한명의 쥬저만 보스레이드 진행, 레이드 제한 시간 고려
- 보스레이드 현재 상태 응답
- 보스 레이드 시작
- 중복되지 않는 raidRecordId를 생성 후 isEntered:true 응답
- 시작이 불가능 하다면 isEntered: false
- 보스레이드 종료
- 레이드 level에 따른 score 반영
- 유효성 검사: userId와 raidRecordId가 일치하지 않다면 예외 처리
- 시작한 시간으로부터 레이드 제한 시간이 지났다면 예외처리
- 보스레이드 랭킹 조회
- Static Data를 Redis에 캐싱하여 사용
- 보스레이드 입장 제한 시간에 따라 재입장 처리
- 저장된 userId와 raidRecordidId 일치하지 않다면 예외 처리
- 동시성 고려
- 유저A와 유저B가 같은 보스레이드에 입장했을 때 처리
- 랭킹 데이터는 웹 서버에 캐싱 또는 Redis에 캐싱
- 레이어 계층 분리
- 발생할 수 있는 다양한 예외 처리
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
}
}
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에 배포했습니다
GCP 배포, 테스트 및 동작을 확인하였으며, 비용 등의 이유로 현재는 접속불가할 수 있습니다.