아이템을 생성하는 부분인데 이 부분에 대해서 나는 정말 많이 헤맨거 같다...
특히 아이템과 인벤,장비의 관계에 대해서 정말 엄청나게 헤맨것 같다.
model items {
itemId Int @id @default(autoincrement()) @map("itemId")
itemCode Int @unique @map("itemCode") // 기존 필드 유지
invenId Int? @map("invenId")
equipId Int? @map("equipId")
itemName String @map("itemName")
image String @map("image")
itemPower Int @map("itemPower")
itemHealth Int @map("itemHealth")
Price Int @map("Price")
equip equips? @relation(fields: [equipId], references: [equipId], onDelete: Cascade)
inven invens? @relation(fields: [invenId], references: [invenId], onDelete: Cascade)
@@unique([invenId, itemCode]) // 복합 고유 키 설정
@@map("items")
}
아이템의 구조만 봐도 벌써부터 복잡함이 느껴진다.
이런 아이템 구조에서 itemCode나 itemId를 통해서 equip,invens 생성에서 불러오고자 하니 unique key error / where argument is missing 등등 정말 끝도 없이 에러가 발생해서 골머리를 썩혔다.
그렇기에 그냥 간단하게 아이템을 분리해버렸다.
해당 구조를 통해서 그냥 간단하게 인벤토리나 장비가 생성되면 해당 캐릭터의 아이디랑 아이템 아이디만 불러오는 방식으로 처리했다.
진작에 이럴걸...
기본적으로 아이템을 생성하는 코드이다.
가격을 제외한 나머지 것들을 수정할 수 있게끔 하였다.
간단하게 목록을 조회하는 코드이다.
해당하는 아이템을 찾아서 아이템 정보를 보여준다.
처음 언급한 오류는 다 여기서 생긴거다..
먼저 아이템을 구매하려면
1. params로 받은 charId와 header에서 받은 accountId로 선택한 캐릭터가 현재 계정에 존재하는 캐릭터인지 확인한다. ( 내 캐릭터가 아닌데 물건을 어캐팔수있겟나)
해당하는 아이템이 존재하는지 안하는지, 캐릭터가 가진 돈이 모자란지를 확인한다.(아이템이 존재하지 않는데 어캐사나)
인벤토리에 내가 사려는 아이템이 있는지 없는지 확인한다.
3-1. 만약 인벤토리에 내가 사려는 아이템이 존재한다.
=> 그냥 수량(quantity)만 사려는 갯수(count)만큼 올려주면 된다.
3-2. 그렇지 않다면?
새롭게 만들면 그만이다.
여기는 더 복잡하다.
1. 캐릭터가 존재하는지 확인하고 인벤토리에 해당하는 아이템이 존재하는지 또한 수량은 충분한지를 확인한다.
2.아이템의 가격 정보를 가져옴과 동시에 inven에서 존재하는 item의 갯수가 현재 받는 갯수와 같다면
2-1.해당하는 인벤에서 그 아이템을 가진 갯수가 0이 되므로 => 아이템을 전부다 팔았다. => 아이템이 인벤토리에 존재하지 않는다.
여기서 인벤토리를 지우지 않는다고 했었는데 실은 위에 인벤토리 값을 먼저 받았기 때문에 순서가 뒤바뀌어도 상관이 없다.
3.만약 아이템이 가진 갯수가 더 크다면?
아이템의 수량을 줄이고 캐릭터의 돈을 올려주면 된다.
이런식으로 오늘은 필수 + 도전 기능의 구현에 대해서 집중해보았다.
처음에 말했던대로 DB관련해서 아직 미숙한 부분이 있는거 같애서 좀더 공부해야할 것 같다.