Skip to content

템플릿 메타데이터를 표시용 정보로 단순화한다#99

Merged
NaMinhyeok merged 2 commits into
mainfrom
codex/template-metadata-demotion
Apr 21, 2026
Merged

템플릿 메타데이터를 표시용 정보로 단순화한다#99
NaMinhyeok merged 2 commits into
mainfrom
codex/template-metadata-demotion

Conversation

@NaMinhyeok
Copy link
Copy Markdown
Contributor

@NaMinhyeok NaMinhyeok commented Apr 21, 2026

개요

템플릿의 gameType, 선수의 position을 도메인 규칙이 아니라 FE가 관리하는 표시용 메타데이터로 재정의했습니다. 기존에는 템플릿/방/게임 전반에서 이 값들이 규칙 검증과 제약 계산에 섞여 있었고, 특히 positionLimit까지 경매 규칙으로 사용되면서 화면 표현을 위한 값이 서버 도메인 제약으로 승격되어 있었습니다.

이번 변경은 메타데이터와 실제 게임 규칙을 분리하는 데 목적이 있습니다. 서버는 더 이상 gameTypeposition의 허용값을 해석하거나 강제하지 않고, FE가 내려주는 문자열을 저장해서 템플릿/로비/게임 응답으로 그대로 전달합니다.

AS-IS

  • gameType이 enum 기반 도메인 값이었고 템플릿 생성 시 허용값이 강제됐습니다.
  • position도 정규화/검증 대상이었고, 경매에서는 positionLimit과 결합되어 실제 입찰 거부 규칙으로 사용됐습니다.
  • GET /api/v1/templates는 요약 응답이라 FE가 카드 렌더링을 위해 추가 상세 조회를 해야 했습니다.
  • DB 스키마에도 position_limit이 남아 있어 메타데이터와 규칙의 경계가 불분명했습니다.

TO-BE

  • gameType은 nullable String 메타데이터로 저장/전달합니다.
  • position은 nullable/blank 허용 메타데이터로 저장/전달합니다.
  • positionLimit은 템플릿/방/게임 도메인과 API, 스키마에서 제거합니다.
  • GET /api/v1/templates는 FE가 한 번에 카드 렌더링을 끝낼 수 있도록 상세형 메타데이터를 포함해 응답합니다.
  • 방 생성과 게임 시작 이후에도 gameType 메타데이터가 room/game 응답으로 이어지도록 전달 경로를 추가했습니다.

주요 변경사항

  • 템플릿 도메인에서 gameType을 규칙이 아닌 aggregate 메타데이터로 이동했습니다.
  • 템플릿 요청/응답 계약에서 positionLimit을 제거하고, gameType/position을 자유 문자열 메타데이터로 완화했습니다.
  • 경매 도메인에서 positionLimit 기반 입찰 제한 로직을 제거했습니다.
  • room/game query 응답에 gameType 메타데이터를 노출하도록 확장했습니다.
  • Liquibase에 메타데이터 강등용 변경셋을 추가해 game_type 컬럼을 room/game에 추가하고, position_limit 제거 및 nullable 제약 변경을 반영했습니다.
  • legacy null position 데이터가 cleanup migration에서 먼저 막히지 않도록 보강했고, 관련 migration/smoke/API 회귀 테스트를 확장했습니다.
  • OpenAPI 예제와 schema nullable 문서를 실제 계약과 맞췄습니다.

주의할 점

  • 이미 운영 중이던 legacy room/game에는 gameType의 원천 데이터가 없어 null로 남을 수 있습니다.
  • 이번 변경에서 gameType은 optional metadata로 취급하므로, legacy 데이터에 대해서도 null을 허용하는 방향으로 정리했습니다.

검증

  • ./gradlew test
  • ./gradlew integrationTest
  • ./gradlew check

리뷰 포인트

  • positionLimit 제거가 현재 제품 의도와 맞는지
  • GET /api/v1/templates를 상세형 목록으로 확장한 결정이 FE 소비 방식과 맞는지
  • legacy room/game의 gameType = null 허용이 optional metadata 정책과 맞는지

@NaMinhyeok NaMinhyeok marked this pull request as ready for review April 21, 2026 15:09
@NaMinhyeok NaMinhyeok merged commit b3f8fa9 into main Apr 21, 2026
2 checks passed
@NaMinhyeok NaMinhyeok deleted the codex/template-metadata-demotion branch April 21, 2026 15:09
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant