Skip to content

[BE] 알코올 속성관리 API 확장 #532

Closed

Description

@bottlenote-app

범위

알코올 공통 속성 사전·그룹과 술별 연결 값을 관리하는 Admin API를 확장한다. 속성 목록·연결·값 수정, 다중 조건 검색·교집합 후보 집계, 문자열 선택값·정규식 검증을 포함한다. 후속 범위로 속성별 복수 값, Admin 시나리오 정의·평가와 Product 시나리오 조회·무상태 평가 API를 포함한다.

관련 PR

선행 구현

현재 상태·경계

2026.10.24 확인 기준 개발 배포 완료. 관련 PR #801~#812는 모두 병합됐다. 이슈는 운영 배포와 후속 검증을 구분하기 위해 Open으로 유지한다. Admin 화면은 #533, Product 화면은 #527에서 별도 관리한다.

Product 공개 계약

  • GET /api/v1/scenarios/{scenarioId}: 활성 게시본의 첫 질문·선택지 조회. 시나리오 ID를 받아 N개 시나리오를 같은 API로 처리한다.
  • POST /api/v1/scenarios/{scenarioId}/evaluate: 전체 답변과 버전을 받아 다음 질문·숫자 구간 선택지·중간 종료·추천 결과·keyset 추가 조회를 처리한다.
  • 매 요청 현재 DB로 재평가한다. 관리자 데이터가 바뀌면 복귀 시 최신 후보를 반환한다.
  • 실행·질문 답변·추천 결과 스냅샷과 Redis/JVM 캐시는 저장하지 않는다. 브라우저 입력 보관은 FE Local Storage, 참여 기록은 기존 캠페인 API가 담당한다.

개발 배포 근거

실제 연동·DB 검증

  • 프리뷰에서 시나리오 조회, 답변 평가, 중간 종료와 결과 추가 조회가 모두 200 응답. 후보 50→17병, 전체 결과 20개씩 조회와 페이지 간 중복 0개를 확인했다.
  • 최근 실사용 구간(2026.10.24 20:26 KST)의 서버 로그: 조회 2회·평가 11회·캠페인 4회가 모두 200. 관찰한 최근 45분 로그에서 카카오 Product 로그인 1회도 200이었다.
  • 캠페인 bartender-note-type-d에서 같은 방문자의 VIEW→START→FINISH→RESULT 저장과 로그인 회원 연결을 확인했다. 질문·답변·추천 결과를 저장하는 컬럼이나 시나리오 실행/결과 테이블은 확인되지 않았다.
  • 검증 시점 누적 완료 방문자 8개는 쿠키 기준이며 실제 인원 수가 아니다. 결과 조회는 방문자 4개·계정 3개(실사용 1개, 기존 QA 계정 2개)였다. 로그인 없이 완료한 방문자 4개와 QA 기록이 포함돼 있으므로 운영 지표로 해석하지 않는다.

남은 범위

  • 운영 배포·운영 데이터 검증·실규모 부하 검증은 미수행이다.
  • 관리자 게시 버튼 등 화면 연결은 Admin FE #533의 범위로 구분한다.

관련 화면: #533, #527

Activity

  1. Whale0928 commented on Oct 22, 2026

    @Whale0928
    Contributor

    2026.10.22 작업 현황 및 다음 세션 인계

    반영 완료

    • STRING 허용값·패턴 검증 #807, 속성별 복수 값 연결 #808, 어드민 시나리오 후보 조회 #809가 병합됐습니다. 본문의 #807 Open 표기는 현재와 다릅니다.
    • #809 병합 커밋: 9336f826e87b259fca8171fd81905e1c49f21513. CI와 개발 배포 워크플로우가 성공했습니다. 이후 로컬 어드민에서 개발 API의 실제 응답까지 확인했습니다.

    확정한 API 계약과 구현 경계

    • POST /admin/api/v1/attribute/groups/{groupId}/candidates만 제공합니다. 프로덕트 엔드포인트는 제거했고, 커서 페이지네이션과 커서용 application.yml 설정도 넣지 않았습니다.
    • page는 0부터, size는 기본 25·최대 100입니다. include/exclude 속성 조건 배열, categoryGroups, abvFrom/abvTo, tastingGroupCodes, nextQuestion을 지원합니다. 포함 조건은 AND이며, 가격·도수 범위는 양끝을 포함합니다.
    • 응답은 위스키 기본 정보·태그·그룹 코드·속성값 배열, 공통 속성 정의, 전체 후보 수, 다음 질문의 선택지별 집계와 페이지 메타데이터를 제공합니다. 숫자 질문은 전체 결과의 min/max도 제공합니다.
    • 기본 종류·도수·테이스팅 그룹은 원래 데이터를 직접 필터링합니다. 확장 속성에 복제하지 않습니다. 속성 하나의 그룹 소속은 기존 단일 그룹 구조를 유지합니다.
    • 기존 AdminAlcoholAttributeGroupController와 DefaultAdminAlcoholAttributeSearchService에 통합했습니다. 불필요한 클래스와 설정을 정리했고 이번 API만을 위한 ADR은 추가하지 않았습니다.

    검증 근거

    • 구현 과정에서 관련 통합 테스트 85개, 규칙 검사 64개, CI 실패 수정 후 관련 단위 테스트 21개를 확인했고 최종 CI가 성공했습니다.
    • 실제 개발 데이터의 그룹 7에서 전체 후보 50개, 첫 페이지 25개를 확인했습니다. ‘몇 번 마셔봤어요’ 선택 후 16개, 잔 참고 가격 13,000~20,000원 적용 후 10개, 종류·향·도수는 ‘상관없어요’, 비대중적 선호 선택 후 2개(딘스톤 12년·쿨일라 12년)였습니다.
    • 첫 페이지 25개와 경험 질문 집계를 함께 조회한 3회 응답은 279/278/256ms였습니다. 개발 데이터 50개에 대한 관측이며, 600개 규모 부하·동시접속 성능 보장은 아닙니다.

    다음 세션

    • FE 연결·검증·배포 현황은 #533을 함께 확인합니다. 추천 제품 방향은 #43과 연결됩니다.
    • 현재는 후보 조회 API입니다. 시나리오 자체의 질문 순서·분기·버전을 DB에 저장하는 모델/API, 임의 분기 편집, 프로덕트 제공 API는 아직 구현하지 않았습니다. 다음 작업 범위는 사용자와 정한 뒤 진행합니다.
    • 필요 시 실제 예상 규모인 약 600개에서 응답·쿼리 성능과 페이지 간 정합성을 추가 검증합니다.
    • 로컬 API 작업 경로는 /Users/hgkim/workspace/etc/bottlenote/bottle-note-api-server입니다. 미추적 artifacts/가 있으므로 임의 삭제하거나 커밋하지 않습니다.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions