최종 갱신 (KST)

← 일감 목록
T-077

공용 상수 시트 — 클라·서버가 같은 값을 코드에 박지 않고 엑셀에서 읽는다

진우 Closed 우선순위 보통 목표 미정 · 보관됨

⚠️ 이 일감은 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은 시트에 한 줄 넣는 것으로 끝난다

관련 커밋

  • 없음

참고