Skip to content

test: production-equivalent 조립과 상태 머신 회귀 테스트 보강 - #152

Merged
krestar merged 13 commits into
mainfrom
test/issue-132-production-equivalent-regressions
Oct 26, 2026
Merged

krestar merged 13 commits into
mainfrom
test/issue-132-production-equivalent-regressions

Conversation

@krestar

@krestar krestar commented Oct 26, 2026 •

Copy link
Copy Markdown
Owner

왜 필요한가요?

테스트 간편 생성자가 운영 Spring bean graph와 다른 Jackson 의존성을 조립하고, 턴 고유 제약 충돌을 문자열로 판정하여 잘못된 409 분류가 발생할 수 있습니다.

무엇이 바뀌나요?

  • 게임 규칙·상태: 기존 canonical 상태 및 판정 변경 없음.
  • Backend / API / DB: GamePersistenceService/GameStateRecovery의 누락 의존성 생성자 제거, 필수 객체 null 차단, PostgreSQL SQLState 23505 및 구조화된 constraint 정보로 TURN_CONFLICT 분류.
  • AI narrative / prompt: 변경 없음.
  • Image generation: image_asset의 턴 unique 충돌 PostgreSQL 테스트 추가.
  • Frontend / UX: 중복 progress/resume 방지, 재인증 시 미완료 비동기 응답 무효화 및 동일 key 재시도 계약 고정.
  • Build / deploy / docs: JDBC 드라이버를 compile classpath에 노출해 구조화된 PostgreSQL 예외를 직접 판별. Schema/API 변경 없음.

책임 경계

  • 서버가 결정하는 사실: canonical turn, uniqueness, 충돌 및 세션 재개 상태.
  • LLM이 서술하는 내용: 변경 없음.
  • LLM이 변경하면 안 되는 사실: 기존과 동일한 canonical game state.

어떻게 검증했나요?

  • PR 작성 전 변경 diff를 비판적으로 검토하고 타당한 지적을 반영했습니다.
  • ./gradlew clean test
  • ./gradlew postgresIntegrationTest
  • ./gradlew build
  • cd frontend && npm ci && npm test && npm run lint && npm run build
  • 정상 흐름을 직접 확인했습니다.
  • 잘못된 입력/실패 흐름을 확인했습니다.
  • 중복 요청 또는 상태 전이가 관련되면 이를 검증했습니다.

비판적 검토에서 드라이버가 runtimeOnly인 상태로 PSQLException을 production source에서 참조하면 컴파일되지 않는 문제를 발견하여 implementation으로 전환했습니다. 또한 메시지에 constraint 문자열만 있는 경우 false-positive를 방지하는 테스트를 추가했고, 동일 key 재시도 로직을 함수로 분리해 검증했습니다. CI #40373193169에서 backend unit, PostgreSQL integration, build와 frontend test/lint/build의 성공 step을 확인했습니다. PostgreSQL 테스트는 실제 unique 충돌을 만들고, frontend는 실제 App이 사용하는 요청 게이트와 key 유지 규칙을 단위 테스트합니다. 실제 브라우저 환경의 UI 상호작용 테스트는 별도로 수행하지 않았습니다. 이전 CI 실패 원인인 누락 생성자, 잘못된 null 기반 fixture, Mockito 중첩 stubbing도 수정했습니다. 수동 브라우저 smoke는 수행하지 않았습니다.

게임 상태·AI 안전성

Schema와 canonical state 계산·LLM 호출 경로는 변경하지 않았습니다. Snapshot codec과 감사 로그 codec을 실제 Spring bean으로 검증합니다. 이전 저장 데이터는 변환하지 않습니다.

  • 게임의 결정적 상태는 서버에서 검증·저장됩니다.
  • LLM 출력만으로 HP, 보상, 성공/실패 등 결정적 상태가 임의 변경되지 않습니다.
  • AI 요청에 필요한 최소 문맥만 전달합니다.
  • AI 응답 파싱 실패와 provider 오류가 게임 상태를 오염시키지 않습니다.
  • 기존 저장 데이터 또는 GameState 호환성 영향을 확인했습니다.

보안·비용

새로운 외부 호출, credential 전달 또는 공개 endpoint는 없습니다.

  • API Key, 토큰, 비밀번호가 코드·로그·URL·클라이언트 응답에 노출되지 않습니다.
  • 외부 AI/Image 호출 횟수와 실패 시 동작을 검토했습니다.
  • 사용자 입력 길이와 외부 API 비용 증가 가능성을 검토했습니다.
  • CORS 또는 공개 endpoint 변경이 있다면 의도된 변경입니다.

API·DB·운영 영향

API와 DB schema 및 환경변수 변경 없음. Deploy 후 회귀 확인은 저장 세션 재개 및 중복 진행·재시도 시나리오입니다.

  • API 계약 변경 시 Frontend 호출부와 문서를 함께 갱신했습니다.
  • DB schema 변경 시 migration 전략을 포함했습니다.
  • 환경변수는 이름과 용도만 문서화했고 실제 Secret은 포함하지 않았습니다.
  • 배포 후 확인할 smoke test가 있습니다.

화면 / 응답 예시

UI 텍스트 및 API 응답 계약 변경 없음.

CI 증거

  • Workflow run #40373193169: ./gradlew clean test, ./gradlew postgresIntegrationTest, ./gradlew build, npm ci, npm test, npm run lint, npm run build 모두 성공. 실제 브라우저 smoke 미실시.

@krestar
krestar merged commit 9e44828 into main Oct 26, 2026
2 checks passed
@krestar
krestar deleted the test/issue-132-production-equivalent-regressions branch October 26, 2026 18:29
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Projects

None yet

Development

Successfully merging this pull request may close these issues.

[Test] production-equivalent 조립과 핵심 session/frontend 상태 머신 회귀 테스트 보강

1 participant