Skip to content

feat: 사용자 시나리오 조회와 무상태 평가 API - #812

Merged
Whale0928 merged 2 commits into
mainfrom
feat/scenario-stateless-evaluation
Oct 24, 2026
Merged

Whale0928 merged 2 commits into
mainfrom
feat/scenario-stateless-evaluation

Conversation

@Whale0928

@Whale0928 Whale0928 commented Oct 24, 2026 •

Copy link
Copy Markdown
Collaborator

관리자가 게시한 N개의 시나리오를 Product에서 같은 조회·평가 API로 실행합니다. 브라우저가 보관한 전체 답변을 다시 검증하며, 어제 50병이던 후보가 관리자 수정 후 45병이 되면 현재 45병을 반환합니다. 실행·답변·결과 스냅샷은 저장하지 않습니다.

  • GET /api/v1/scenarios/{scenarioId}: 활성 게시본의 버전과 첫 질문·선택지
  • POST /api/v1/scenarios/{scenarioId}/evaluate: 전체 {questionId, optionId} 답변, QUESTION/RESULT, 과거 질문 조회와 결과 keyset 페이징
  • 관리자 미리보기와 경로·입력 검증 및 검색 조건 합성을 공유합니다. 공통 필터 DTO를 Admin 요청에서 분리하며 기존 Admin JSON 필드와 의미를 유지합니다.
  • 숫자 선택지는 DB 분위 경계로 최대 네 구간을 만들고 중복·빈 구간을 제거합니다. 배타 하한을 지원하며 소수 값이 경계 사이에서 빠지지 않습니다. 선택지 개수는 DB 조건 집계 한 번으로 계산합니다.
  • 선택지는 시나리오·버전·질문·선행 조건과 실제 구간을 HMAC으로 결합합니다. 분포가 바뀌어도 저장한 조건은 유지합니다. 기존 커서 키 설정을 사용하되 서명 용도를 구분하고 현재·이전 키를 검증합니다. 선택지는 시간 만료 없이 키 폐기 시 재선택하며 결과 커서는 1시간 후 만료합니다.
  • Redis와 JVM 캐시는 도입하지 않습니다. 활성 상태·정의·속성 연결·주류·맛 태그를 매 요청 현재 DB에서 조회하므로 캐시 무효화 누락에 의존하지 않습니다.
  • 참여 이벤트는 기존 캠페인 API의 책임으로 유지합니다. 평가 호출은 이벤트를 자동 기록하지 않습니다. Local Storage와 캠페인 화면 연결은 이번 서버 변경 범위에 포함하지 않습니다.

초기 구현 검증 (1456d6b9):

  • :bottlenote-mono:unit_test의 선택지 서명·DTO·정의 검증·기존 속성 서비스 관련 테스트: 68건 통과
  • :bottlenote-product-api:integration_test의 시나리오·런타임 OpenAPI·문서 품질·인증 계약: 26건 통과
  • :bottlenote-product-api:check_rule_test의 Controller·Service·DTO 규칙: 34건 통과
  • :bottlenote-admin-api:admin_integration_test --tests '*AdminAlcoholScenarioIntegrationTest': 17건 통과
  • 변경 파일 spotlessCheck, git diff --check 통과

로컬 서브모듈 체크아웃은 기존 사용자 변경으로 main의 gitlink보다 오래된 상태였습니다. 이를 변경하거나 커밋하지 않고, main이 참조하는 5a38a064의 마이그레이션을 임시 경로로 추출한 Gradle init script로 Product/Admin의 별도 Testcontainers DB에 적용해 검증했습니다. 스키마·의존성·설정 변경은 없습니다. 전체 원격 CI 결과는 이 PR의 Checks를 기준으로 확인합니다. 운영 배포와 실규모 부하 검증은 수행하지 않았습니다.

관련: bottle-note/workspace#532

후속 구조 정리 (a82132d6):

  • 단일 호출처인 ScenarioOptionService의 선택지 생성 메서드를 DefaultScenarioService의 private 메서드로 통합했습니다. 주입 의존성은 8개에서 7개로 줄었습니다.
  • ScenarioSelection은 ScenarioAnswer.Selection 내부 record로 옮겼습니다. 신규 파일은 14개에서 12개로 줄였으며 경로 평가와 서명 검증의 책임 분리는 유지합니다.
  • 기존 형식으로 발급한 optionId를 읽는 호환성 테스트를 추가했습니다. API와 서명 payload 형식은 유지합니다.
  • 이번 변경의 로컬 검증: ScenarioOptionCodecTest 6건, 시나리오 API·런타임 OpenAPI 통합 테스트 15건, Service·DTO 아키텍처 규칙 20건으로 총 41건 통과했습니다. 변경 파일 spotlessCheck, git diff --check도 통과했습니다.

@Whale0928
Whale0928 merged commit e0c6f37 into main Oct 24, 2026
10 checks passed
@Whale0928
Whale0928 deleted the feat/scenario-stateless-evaluation branch October 24, 2026 05:06
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