⚠️ 이 일감은 T-085로 흡수됐다 (2026-09-24). 조사 내용·근거·처리 항목은 전부 그쪽에 합쳐져 있다 — 여기서는 굴러가지 않는다. 이 파일은 그때의 경위 기록으로만 남긴다.
배경
"창고 200칸" 같은 값이 지금은 코드 두 곳에 따로 박혀 있다.
| 값 | 어디에 | 문제 |
|---|---|---|
| 창고 칸 200 | 클라 씬의 프레임 개수 + 두 파일의 주석 | 서버엔 한도가 아예 없다(T-063) |
| 즉시 판매가 비율 100% | 서버 상수 | 거래 3.1이 "서버 상수 한 곳에 둔다"로 확정 |
| 치트 캐릭터 지급 상한 10 | 서버 User.CheatMaxCharacterCount + 클라 CheatWindow.MaxCharacterCount |
두 곳에 같은 숫자. 클라 주석이 "서버와 같다"고 손으로 적어 놓았다 |
| 뽑기 허용 횟수 1·10 | 서버 판정 + 클라 GachaPresenter.ResolveCost 검사 |
위와 같다 |
한 쪽만 고치면 조용히 어긋난다. 클라가 먼저 막으면 사용자는 영문을 모르고, 서버만 막으면 클라는 보낼 수 없는 요청을 계속 그린다.
이미 엑셀 → 서버/Unity 파이프라인이 있으므로(GameDesign/Excel → GameTable.*Table + .bytes)
상수도 같은 길로 보내면 한 곳만 고치면 된다.
⚠️ 이 일감은 틀을 만드는 것이다. 개별 값을 정하는 것은 각자의 일감이다 (창고 한도는 T-063, 판매가 비율은 거래 기획).
할 일
기획 · 설계
- [ ] 시트 이름·컬럼을 사용자에게 확인받는다 (
excel-table-creator— 만들기 전에 확인이 규약이다). 초안:Constant.xlsx/ConstantTable/ConstantTID · Key · Value · Description - [ ] 값 타입을 어떻게 나를지 정한다.
long하나로 통일할지, 문자열 + 파싱인지.long하나면 비율(100%)은 천분율처럼 정수로 접어 넣는 규칙이 필요하다 — 서버가 이미SpeedAddPermille로 쓰는 방식과 맞춘다 - [ ] 무엇을 넣고 무엇을 안 넣을지 선을 긋는다. 밸런스 수치는 각 시트의 몫이다. 여기 들어갈 것은 "클라·서버 양쪽이 알아야 하는 단일 값" 뿐이다
서버
- [ ]
ConstantCatalog(가칭) — 키 상수 + 조회. 문자열 키를 코드 곳곳에 뿌리지 않는다(enum 또는static readonly) - [ ] 시트에 없는 키를 읽으면 기동 시 바로 터뜨린다 — 런타임에 0으로 조용히 떨어지면 못 찾는다
- [ ] 위 표의 값들을 시트로 옮긴다 (판매가 비율 · 치트 상한 · 뽑기 허용 횟수)
- [ ] 테스트(
server-tdd) · 미러 커밋
클라
- [ ]
GameDataLoader에 조회 하나 — 다른 테이블 조회와 같은 모양 - [ ] 코드에 박힌 값을 조회로 바꾼다 (
CheatWindow.MaxCharacterCount등) - [ ] 창고 칸 프레임 수는 씬 오브젝트라 시트로 바로 못 옮긴다 — 한도와 프레임 수가 어긋나면 알리는 검사만 둔다(T-064와 함께 본다)
완료 조건
클라·서버가 공유하는 값이 엑셀 한 곳에 있고, 양쪽이 거기서 읽는다. 값을 하나 고치고 파이프라인을 돌리면 서버·클라 둘 다 바뀐다. 코드에 같은 숫자가 두 번 남아 있지 않다.
막고 있는 것 / 선행 일감
- 없음. T-063의 "한도 값의 위치 결정(코드 상수인가 엑셀인가)" 항목이 이 일감의 답을 기다린다 — 이쪽이 먼저 서면 T-063은 시트에 한 줄 넣는 것으로 끝난다
관련 커밋
- 없음
참고
GameDesign/CLAUDE.md— 엑셀 → 서버/Unity 파이프라인excel-table-creatorUser.Cheat.cs·CheatWindow.cs