2024. 9. 9. 21:18ㆍ[Node.js_6기 본캠프 TIL]
개인과제 안내 페이지를 들어간 순간, 익숙한 애증의 향이 진하게 풍기는 이미지가 보였다. 옛날에 한참 보던 장비 시뮬레이터를 (다운그레이드 버전이지만) 구현해보게 되다니... 데이터베이스 모델링 부분에서 실수하면 머리가 꽤 아플 것 같다.
기본적으로 구현해야 하는 테이블은 하기와 같다.
- 아이템 테이블
- 계정 테이블
- 캐릭터 테이블 (계정 당 여러개의 캐릭터 보유 가능)
- 캐릭터-인벤토리 테이블 (캐릭터가 보유는 하고있으나, 장착하고 있지 않은 아이템 정보)
- 캐릭터-아이템 테이블 (실제로 캐릭터가 장착한 아이템 정보)
각 테이블의 특성에 따라 관계를 설정해주어야 하기 때문에, 도식화를 먼저 해보기로 했다.
▶ 아이템 status를 한번에 호출하기
다이어그램으로 정리하다보니, 데이터 타입을 정하는 것부터 혼란스러웠다. 각 아이템들은 캐릭터의 health나 power에 영향을 주는 status 값이 있는데, 무의식 중에 Int 값으로 분할해서 정리하다가 예시를 보니 Json 객체 형태로 불러오는 것 같았다.
{
"item_code": 3,
"item_name": "파멸의 반지",
"item_stat": { "health": 20, "power": 2 },
"item_price": 200
}
Int, String, Varchar, Text로 선언하는 예제만 보다가 본 과제의 API 예시를 보니 객체 타입의 새로운 데이터 형식을 지정해야 하는 것인가 싶어 구글링을 시작했다.
Prisma 문법 관련 사이트에 가보니, Json 형태로 불러오는 데이터 타입이 존재했다. API 예시에서 봤던 것과 동일한 형태였기 때문에, 아이템 status 관련 데이터들은 모두 Json으로 일단 설정해보기로 했다.
model Items {
item_code Int @id @default (autoincrement()) @map("item_code")
item_name String @unique @map("item_name")
item_status Json @default("{ \"health\": 0, \"power\": 0 }") @map("item_status")
item_price Int @map("item_price")
@@map("Items")
}
model Inventory {
inventory_id Int @id @default (autoincrement()) @map("inventory_id")
character_id Int @unique @map("character_id")
item_list Json @default("{ \"item_code\": 0, \"item_name\": 0, \"count\": 0 }") @map("item_list")
// Characters 테이블과 관계를 설정합니다.
character Characters @relation(fields: [character_id], references: [character_id], onDelete: Cascade)
@@map("Inventory")
}
위와 같은 형태로 Prisma를 통한 데이터베이스 모델링은 1차로 완성할 수 있었다. 아직 router와 app.js 세팅을 하지 못했기 때문에, Json으로 세팅한 부분이 실제로 어떻게 작동하는지 확인하려면 선행되어야 할 작업이 많았다. 내일의 트러블 슈팅에서 다시 한번 점검해보기로 하자.
▶ 유효성 체크하기
보통 사이트에서 회원가입을 할 때, ID가 중복이 아닌지- PW가 몇글자 이상이고 영문+숫자+특수문자로 조합되었는지 등을 체크한다. 이를 유효성 검사라고 하는데, 본 과제에서도 동일하게 구현해야 했다.
- 아이디: 다른 사용자와 중복될 수 없으며 오로지 영어 소문자 + 숫자 조합으로 구성이 되어야 합니다.
- 비밀번호: 최소 6자 이상이며, 비밀번호 확인과 일치해야 합니다.
Prisma에서 바로 조건을 걸어버리려고 했으나, 생각해보니 데이터 타입을 선언하는 것 외에 글자수를 제한하는 등 디테일한 조건을 거는 예제를 본 적이 없었다. 아직 익숙하지 않은 툴인 만큼, 단순히 모르는 기능일 가능성을 염두에 두고 구글링을 시작했다.
역시나 같은 고민을 하는 사람이 있었다.
그리고 아직 maximum length만 지원한다는 답변에 조금 슬퍼졌다. schema.prisma 파일에서 깔끔하게 정리하고 싶다는 작은 소망은 버리고, router에서 if문 등을 적극 활용해야 할 것 같다.
'[Node.js_6기 본캠프 TIL]' 카테고리의 다른 글
CH3 아이템 시뮬레이터 과제 - 트러블슈팅 0911 (0) | 2024.09.12 |
---|---|
CH 3 아이템 시뮬레이터 과제 - 트러블슈팅 0910 (1) | 2024.09.10 |
AWS에서 사라진 EC2 찾기 (1) | 2024.09.06 |
[프로그래머스] 푸드 파이트 대회(JavaScript) (1) | 2024.09.05 |
[Node.js] 미들웨어와 라이브러리 훑어보기 (0) | 2024.09.04 |