완료 2026-09-17. 설계
docs/superpowers/specs/2026-09-17-equipment-design.md· 계획docs/superpowers/plans/2026-09-17-equipment.md
배경
유저-캐릭터 구조로 전환하면서 인벤토리는 유저 소유, 장비 슬롯은 캐릭터 소유로 정했다. 설계는 매핑 테이블 + 유저 소유 장비 개체 — 행을 테이블 사이로 옮기는 방식은 쓰지 않는다. DB 계층에 트랜잭션 경계가 없어서 옮기는 도중 실패하면 아이템이 사라진다.
결정 (2026-09-17)
| # | 항목 | 결정 |
|---|---|---|
| 1 | 효과 | 대상 산업 지정 + 속도 가산. Industry(None=전 산업) · SpeedAddPermille. 속도식의 가산 항에 합산. 적성은 바꾸지 않는다 → T-022 사유 소멸 |
| 2 | 정의 테이블 | 별도 Equip.xlsx/EquipTable. ItemTable은 건드리지 않는다 |
| 3 | 종류 vs 칸 | 테이블은 종류 EquipKind(Weapon·Accessory·Gem), 매핑은 칸 EquipSlot(Weapon=1·Accessory1=2·Accessory2=3·Gem=4). 장신구는 두 칸 어디든 |
| 4 | 칸 선택 | 클라가 지정. 서버는 종류가 칸에 맞는지만 검사(EquipKindMismatch) |
| 5 | 착용 중인 장비 재장착 | 자동 이동. 이전 캐릭터에서 해제 → 새 캐릭터 착용. 같은 칸의 장비는 창고로. 매핑 변경 최대 3개를 한 트랜잭션으로 |
| 6 | 강화 | 필드 없음. 규칙이 생기면 ALTER TABLE ADD COLUMN |
| 7 | 창고 칸 | slot_position 컬럼·EquipInfo.SlotPosition + 새 장비는 첫 빈 칸. 정렬·이동 요청은 T-058 |
| 8 | 획득 | 치트 GiveEquip = 8만. 정식 경로(가챠·상자·드롭)는 미정 — User.GrantEquip이 진입점 |
| 9 | 보석 | 독립 부위 |
만든 것
- 엑셀:
Enum.xlsx(EquipKind·EquipSlot) ·Equip.xlsx(EquipTable테스트 행 5개) - DB:
t_user_equip(개체 · 창고 칸) ·t_character_equip((캐릭터, 칸) PK ·equip_idUNIQUE) - 서버:
Common/EquipCatalog.cs·User/Equip/Equip.cs·User/User.Equip.cs(적재·장착·해제·지급) ·Repository/EquipRepository.cs·ResolveSlotSpeed에GetEquipSpeedAdd가산 - 패킷:
EquipInfo·S_EquipListResponse(27) ·S_EquipSyncResponse(28) ·C_EquipRequest(29) ·C_UnequipRequest(30) ·S_EquipResponse(31) ·EResultCode600대 ·EEquipSlot - Unity 미러·
ServerPacketHandler수신 핸들러 3개 · 더미 클라 메뉴 - 테스트:
EquipCatalogTest·EquipRepositoryTest(:memory: 트랜잭션) ·UserEquipTest(20) ·UserCheatTest2 ·PacketEnumTest1
완료 조건 확인
Unity CLI로 실서버 왕복: 치트 지급 → 낚시 슬롯 배치(속도 6000) → 낚싯대(1002, 낚시 +30%) 장착 → 슬롯 속도 7800 →
보석 칸 장착 요청 EquipKindMismatch → 해제 → 6000 → 다시 장착 후 재접속 → S_EquipListResponse 1개 · 슬롯 속도 7800 복원.
남은 것 (별도 일감)
- 장비 획득 경로 — 상자(T-029)·가챠·드롭 중 결정. 지급은
GrantEquip을 부르면 된다 - 창고 장비 탭 정렬·자리 이동 — T-058이 자원·캐릭터와 함께
- 클라 장비 탭·착용 UI — T-043
- 강화 — 기획 없음
- T-022 — 장비가 적성을 안 바꾸므로 사유 소멸. 폐기 여부는 사용자 결정
관련 커밋
13792a5 엑셀·enum · 2f9cd11 DDL · db87d47 EquipCatalog · e860066 패킷 · 36b7087 저장소 · 3bed931 장착·해제·속도 · 4cd9213 핸들러·치트
참고
Server/docs/채취-정산.md5장 ·Server/docs/데이터-카탈로그.md5장 ·Server/docs/치트.md.claude/Agent/2026-09-17-equip-server.md