Skip to content

feat(stats): 질문 revision 기반 반응 통계 및 대시보드 추가 - #235

Merged
1Seob merged 7 commits into
developfrom
feat/stats-daily-question-analytics
Aug 27, 2026
Merged

feat(stats): 질문 revision 기반 반응 통계 및 대시보드 추가#235
1Seob merged 7 commits into
developfrom
feat/stats-daily-question-analytics

Conversation

@1Seob

@1Seob 1Seob commented Aug 27, 2026

Copy link
Copy Markdown
Collaborator

📝 요약(Summary)

  • 질문 수정 전후의 반응이 하나의 누적값으로 섞이지 않도록 질문 revision과 노출 이벤트 저장 구조를 추가했습니다.
  • 배포 이후 발생한 할당·교체·답변을 revision별로 집계하고, 상세 및 전체 현황 대시보드와 CSV 다운로드를 제공했습니다.
  • 기존 할당을 현재 revision에 소급하지 않는 엄격한 baseline 정책을 적용했습니다.

주요 변경사항

  • 질문 revision 및 노출 데이터 모델

    • daily_questions.current_revision_no, daily_question_revisions, daily_question_exposures를 추가했습니다.
    • answer_entries.question_revision_id를 추가해 신규 답변이 실제 노출된 revision을 참조하도록 했습니다.
    • 중복 열린 노출과 상충하는 답변·교체 상태를 방지하는 unique index 및 CHECK constraint를 적용했습니다.
    • 회원 삭제 후에도 개인 식별 정보 없이 노출 통계가 유지되도록 배정 참조에 ON DELETE SET NULL을 적용했습니다.
  • 할당·교체·답변 흐름

    • V1·V2 최초 질문 할당과 교체 시 revision 기반 노출 이벤트를 저장합니다.
    • 답변 저장 시 열린 노출을 완료 처리하고 동일 revision을 AnswerEntry에 연결합니다.
    • 질문 배정 변경과 노출 상태 전이를 같은 transaction에 포함했습니다.
    • 질문 수정 이후에도 조회 응답과 일간 리포트 생성이 사용자가 실제로 본 revision 스냅샷을 사용하도록 했습니다.
  • 질문 반응 통계

    • 질문별 누적 노출·답변·교체·미응답과 답변율을 revision 단위로 조회합니다.
    • 현재 Revision 반응과 전체 Revision 누적을 분리해 비교할 수 있는 전체 질문 현황을 추가했습니다.
    • 질문 ID·문구, 관심사, 레벨, 활성 상태, 최소 노출 수 필터와 지표별 양방향 정렬을 지원합니다.
    • 전체 Revision 1 중 가장 이른 적용 시각을 통계 수집 시작 시각으로 표시합니다.
  • 통계 대시보드 및 CSV

    • 질문 검색·선택, revision 수정 이력, 반응 지표를 제공하는 질문 상세 화면을 추가했습니다.
    • 팀원이 통계를 동일한 기준으로 해석할 수 있도록 Revision, 교체, 미응답 및 baseline 설명을 추가했습니다.
    • 화면과 동일한 필터·정렬 결과를 UTF-8 BOM 기반 CSV로 다운로드할 수 있습니다.
    • CSV의 따옴표·쉼표·개행을 처리하고 formula injection을 방지했습니다.

검증

  • git diff --check 통과
  • DailyQuestionRevisionRepositoryTest 통과
  • DailyQuestionExposureRepositoryTest 통과
  • DailyQuestionExposureServiceTest 통과
  • QuestionCommandExposureServiceTest 통과
  • DailyReportTxServiceTest 통과
  • DailyReportServiceTest 통과
  • QuestionStatsRepositoryTest 통과
  • QuestionStatsServiceTest 통과
  • StatsControllerTemplateTest 통과
  • DailyQuestionOverviewCsvExporterTest 통과
  • 로컬 브라우저에서 질문 검색·필터·정렬·상세 이동·반응형 표와 CSV 다운로드 확인

참고 / 리스크

  • V20260825_1200 적용 전에 생성된 할당과 답변은 추정하거나 현재 revision에 소급하지 않습니다.
  • 통계 화면의 집계 시작 시각은 애플리케이션 기동 완료 시각이 아니라 baseline Flyway migration이 실행된 시각입니다.

🔗 Related Issue

  • Closes:

💬 공유사항

✅ PR Checklist

PR이 다음 요구 사항을 충족하는지 확인하세요.

  • PR 제목을 커밋 메시지 컨벤션에 맞게 작성했습니다.

1Seob added 7 commits August 26, 2026 14:27
daily_questions의 현재 상태를 revision 1 baseline으로 저장하고 이후 질문 수정 이력을 보존할 수 있도록 구성함. baseline 이후의
INITIAL·REROLL 노출만 기록하도록 제한함
V1·V2 질문 할당과 교체 시 INITIAL·REROLL 노출을 저장하고 답변 시 노출 revision을 AnswerEntry에 연결함. baseline 이전 할당은 자동
편입하지 않으며 질문 조회와 LLM 입력이 실제 노출 revision을 사용하도록 수정함
질문별 누적 노출·답변·교체·미응답과 답변 비율을 집계함. daily_question_revisions 기준 LEFT JOIN으로 노출이 없는 revision도 수정 이력에
포함하고 선택 질문의 전체 합계 ViewModel을 제공함
/stats/question에서 질문 ID·문구 검색과 전체 및 revision별 노출·답변·교체·미응답 지표를 조회하도록 추가함. 모든 stats 화면에 질문 탭을 연결하고
Revision·baseline 해석 가이드, 반응형 검색 결과 목록, MVC 템플릿 회귀 테스트를 함께 추가함
Question ID별 현재 Revision 반응과 전체 Revision 누적을 분리 집계하는 read model을 추가함. 질문 검색·관심사·레벨·활성 상태·최소 노출 필터와
반응 지표별 정렬을 지원하고 repository 통합 테스트와 service 테스트로 집계 및 표본 필터 동작을 검증함
현재 Revision 반응과 전체 Revision 누적을 비교하는 전체 질문 현황 표를 추가하고 검색·필터·양방향 정렬 및 상세 화면 이동을 지원함. 질문 상세를 기본 탭으로
유지하고 오름차순 화살표를 빨간색으로 구분하며 조회 조건 검증과 Thymeleaf 렌더링 테스트를 보강함
전체 질문 현황의 필터·정렬 조건을 재사용하는 Excel 호환 CSV 다운로드를 구현하고, 최초 Revision 1 적용 시각을 질문 반응 통계의 집계 시작 기준으로 표시함
@1Seob
1Seob merged commit 17fe26a into develop Aug 27, 2026
1 check passed
@1Seob
1Seob deleted the feat/stats-daily-question-analytics branch August 27, 2026 08:46
@1Seob 1Seob mentioned this pull request Aug 27, 2026
1 task
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