상세 컨텐츠

본문 제목

#2. 아이템 시뮬레이터 개발 - Node.Js(1)

내일배움캠프 학습/진행 프로젝트

by 남민우_ 2024. 11. 30. 00:14

본문

이번 프로젝트는 '아이템 시뮬레이터'를 개발해보도록 한다.

정확히 말하자면 아이템에 대해서만 시뮬레이션 하는 클라이언트 개발이 아니라, 일반적인 게임 서버에서 이루어지는 백엔드 API 를 개발하는 것이다.

 

그럼 요구사항부터 하나씩 살펴보도록 하자.

개발 요구사항

1. 데이터 베이스 모델링

1. 아이템 테이블 : 아이템 자체의 데이터를 관리

2. 계정 테이블 : 접속한 계정에 관한 데이터 관리

3. 캐릭터 테이블 : 계정에 따른 캐릭터, 캐릭터 자체의 데이터 관리

4. 캐릭터 - 인벤토리 테이블 : 캐릭터가 보유한 아이템들의 데이터를 관리

5. 캐릭터 - 장비 테이블 : 캐릭터가 장착한 아이템들의 데이터를 관리

 

이렇게 5가지의 테이블로 이루어진 데이터 베이스를 만들어야 한다.

2. API 개발

1. 회원가입 API : 아이디/비밀번호/비밀번호 확인/이름 을 넘겨받아 회원가입 요청

2. 로그인 API : 아이디/비밀번호 를 넘겨받아 로그인 - 성공 시 JWT 토큰 반환

3. 캐릭터 생성 API : 닉네임 을 넘겨받아 특정 계정 내에 캐릭터 생성

4. 캐릭터 삭제 API : 특정 계정 내의 캐릭터 삭제

5. 캐릭터 상세 조회 API : 캐릭터의 이름,수치 등 데이터 조회

6. 아이템 생성 API : 이름/수치/가격 을 넘겨받아 아이템 생성

7. 아이템 수정 API : 이름/수치 를 넘겨받아 기존 아이템의 데이터 수정

8. 아이템 목록 조회 API : 아이템 테이블의 전체 데이터 조회

9. 아이템 상세 조회 API : 특정 아이템의 수치 조회

10. 아이템 구입 API : 캐릭터 정보, 아이템 이름, 구매 수량을 넘겨받아 아이템 구매

11. 아이템 판매 API : 아이템 이름, 판매 수량을 넘겨받아 아이템 판매 - 가격의 60%로 정산

12. 인벤토리 조회 API : 특정 캐릭터의 인벤토리 전체 조회

13. 장비칸 조회 API : 특정 캐릭터의 장비칸 전체 조회

14. 아이템 장착 API : 인벤토리에서 아이템 장착 - 장비칸으로 이동, 캐릭터 수치 상승

15. 아이템 해제 API : 장비칸에서 아이템 해제 - 인벤토리로 이동, 캐릭터 수치 감소

16. 게임 재화 증가 API : 캐릭터의 게임 재화 일정량 상승

 

적고 나니 양이 꽤 많다. 다만 전체적으로 봤을 때 어떤 테이블에서 로직이 수행되냐 가 주로 다를 뿐 요구하는 행동(조회, 생성, 삭제 등) 은 다 비슷비슷한 감이 있다.

 

그럼 먼저 프로젝트 세팅부터 해보자.

프로젝트 세팅

이번 프로젝트에서는 데이터베이스를 연결하는 등의 과정을 진행하기 위해 다양한 라이브러리를 설치해야 한다.

설치할 라이브러리로는

1. Yarn

2. Express

3. Prisma

4. Jsonwebtoken

5. Nodemon

으로 5가지를 먼저 설치하고 프로젝트의 구조를 정립한다.

# 프로젝트를 초기화합니다.
yarn init -y

# 라이브러리를 설치합니다.
yarn add express prisma @prisma/client cookie-parser jsonwebtoken bcrypt

# nodemon 라이브러리를 DevDependency로 설치합니다.
yarn add -D nodemon

# 설치한 Prisma를 초기화 하여, Prisma를 사용할 수 있는 구조를 생성합니다.
npx prisma init

$ 추가
"type":"module"

 

프로젝트를 모두 구축하고 나면 자동적으로 기본 파일들이 생성된다.

이후 이미지처럼 용도에 따라 파일을 분리하여 프로젝트를 설계했다.

기본 프로젝트 세팅은 이렇게 마칠 수 있고 이제 데이터 베이스를 모델링 해야 한다.

데이터 베이스 모델링

필요한 테이블은 모두 5개였다.

model Items {
  itemId          Int       @map("itemId")  @id  @default(autoincrement())

  name            String    @map("name")
  health          Int       @map("health")
  power           Int       @map("power")
  price           Int       @map("price")

  @@map("Items")

  char_Inven Char_Invens[]
  char_Item  Char_Items[]
}

model Accounts {
  accountId       Int       @map("accountId")   @id @default(autoincrement())

  email           String    @map("email")       @unique 
  password        String    @map("password")
  accountName     String    @map("accountName") @unique
  createdAt       DateTime  @default(now())     @map("createdAt")
  updatedAt       DateTime  @updatedAt          @map("updatedAt")

  @@map("Accounts")

  characters Characters[]
}

model Characters {
  characterId     Int       @map("characterId") @id @default(autoincrement())
  accountId       Int       @map("accountId")

  name            String    @map("name")    @unique
  health          Int       @map("health")  @default(500)
  power           Int       @map("power")   @default(100)
  money           Int       @map("money")   @default(10000)

  @@map("Characters")

  account       Accounts    @relation(fields:[accountId], references: [accountId], onDelete:Cascade)
  char_Inven    Char_Invens[]
  char_Item     Char_Items[]
}

model Char_Invens {
  invenItemId Int @map("invenItemId") @id @default(autoincrement())
  characterId Int @map("characterId")
  itemId      Int @map("itemId")      @unique
  itemCount   Int @map("itemCount")
  itemName    String @map("itemName")

  @@map("Char_Invens")

  character Characters      @relation(fields: [characterId], references: [characterId])
  item      Items           @relation(fields: [itemId],      references: [itemId],      onDelete:Cascade)
}

model Char_Items {
  setItemId Int @map("setItemId") @id @default(autoincrement())
  characterId Int @map("characterId")
  itemId      Int @map("itemId")  @unique
  itemName    String @map("itemName")

  @@map("Char_Items")

  character Characters      @relation(fields: [characterId], references: [characterId])
  item      Items           @relation(fields: [itemId],      references: [itemId],      onDelete:Cascade)
}

 

schema.prisma 파일에서 다음과 같이 코드를 작성해 테이블을 모델링하였다.

Accounts 테이블과 Characters 테이블의 연관 관계 등 이 테이블들은 서로 연관 관계를 맺고 있는 것을 볼 수 있는데, 다이어그램으로 그려보면

다음과 같이 나타낼 수 있겠다.

해서 이 데이터 테이블들을 만들면

다음과 같이 나타난다.

물론 이 데이터 베이스는 별도의 사전 작업을 거쳐서 이루어진 결과로, AWS 의 RDS 를 대여해 데이터베이스의 URL 을 받아와 연결하는 과정을 거쳤다.

 

이제 본격적으로 API 를 구현해볼 것인데, 이에 대해서는 다음 파트에서 소개한다.

관련글 더보기