Skip to content

feat(report): 월간 리포트 V2 비교·소셜·이미지 다양화 및 조회 계약 확장#186

Merged
1Seob merged 22 commits into
developfrom
feat/monthly-report-v2-expansion
Jun 30, 2026
Merged

feat(report): 월간 리포트 V2 비교·소셜·이미지 다양화 및 조회 계약 확장#186
1Seob merged 22 commits into
developfrom
feat/monthly-report-v2-expansion

Conversation

@1Seob

@1Seob 1Seob commented Jun 30, 2026

Copy link
Copy Markdown
Collaborator

📝 요약(Summary)

월간 리포트 V2에 직전 완료 리포트 기반 감정 비교, 월간 소셜 반응 랭킹, 이미지 화풍·색상 다양화 기능을 추가했습니다.

V1/V2 리포트가 혼재하는 환경에서 클라이언트가 올바른 상세 API를 선택할 수 있도록 월간 리포트 조회 응답도 locator 기반으로 개편했습니다.

월간 감정 비교

  • 현재 생성 월보다 이전인 가장 최근 완료 V2 리포트를 비교 대상으로 선택
  • BASELINE과 COMPARISON 프롬프트 분기
  • 직전 리포트 기간·감정 통계·분석 내용을 비교 입력으로 조립
  • 비교 결과를 emotion_comparison JSONB 스냅샷으로 저장
  • COMPARISON 응답의 요약·감정 변화·강조 표현 검증 추가
  • dev/prod 배포 workflow에 MONTHLY_V2_COMPARISON_PROMPT 환경 변수 연동

월간 소셜 요약

  • 내 DailyReport에 받은 좋아요와 댓글·대댓글을 월 단위로 집계
  • 친구 상태, 탈퇴, 차단 및 삭제된 댓글·좋아요 필터링
  • 좋아요·댓글 합계와 참여 친구 수를 기준으로 노출 여부 계산
  • 횟수 내림차순 및 가나다순 동점 처리
  • 좋아요·댓글 랭킹을 각각 최대 3명까지 생성
  • 공동 1위 강조 및 화면 배치 순서 계산
  • 생성 결과를 social_summary JSONB로 저장하고 V2 조회 응답에 추가

월간 리포트 조회 계약

  • GET /api/v2/monthly-report에서 report, previousReport locator 반환
  • locator에 reportId, version, month, status 제공
  • V2 우선, V1 fallback 방식으로 월별 리포트 탐색
  • 기존 단일 조회를 GET /api/v2/monthly-report/current로 이동하고 Swagger에서 숨김
  • 버전에 따라 다음 상세 API를 호출하도록 Swagger 문서화
    • V1: GET /api/v1/monthly-report/{reportId}
    • V2: GET /api/v2/monthly-report/{reportId}
  • V1 상세 조회의 소유권 검증 보완

이미지 화풍 및 색상 다양화

  • 이미지 화풍 8종과 색상 팔레트 8종 추가
  • 최근 완료 리포트 3개의 화풍·팔레트를 후보에서 제외
  • 사용자·리포트·대상 월 기반 결정적 선택 적용
  • 선택 결과를 image_prompt_variant, image_color_palette에 저장해 재시도 시 재사용
  • 화풍과 팔레트를 MonthlyImageVisualPreset으로 통합
  • 공통 안전 제약, 화풍 지침, 색상 지침을 조립하는 prompt composer 구현
  • 기본 라벤더·핑크·베이지·파스텔 색감으로 수렴하지 않도록 제약 추가
  • 화풍 8종 × 팔레트 8종의 64개 프롬프트 조합 지원
  • 기존 중복 이미지 prompt loader 제거

데이터베이스 변경

  • monthly_reports_v2.emotion_comparison 추가
  • monthly_reports_v2.social_summary 추가
  • monthly_reports_v2.image_prompt_variant 추가
  • monthly_reports_v2.image_color_palette 추가
  • 기존 데이터와 호환되도록 신규 이미지 설정 컬럼은 nullable로 구성

테스트

  • 비교 대상 선택 및 비교 입력 조립
  • BASELINE/COMPARISON 프롬프트 분기와 응답 검증
  • 소셜 집계·필터링·랭킹·노출 조건
  • V1/V2 locator 우선순위, 미완료 상태 및 연도 경계
  • 이미지 화풍·팔레트 결정성 및 최근 이력 제외
  • 이미지 설정 저장·재사용 및 부분 상태 보완
  • listener 성공·실패·환불 경로
  • 전체 64개 이미지 프롬프트 조합 고유성
  • 팔레트별 핵심 색상 표현

.\gradlew.bat test 전체 테스트 93개 통과

🔗 Related Issue

  • Closes:

💬 공유사항

✅ PR Checklist

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

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

1Seob added 22 commits June 20, 2026 20:44
현재 월 이전의 가장 최근 COMPLETED V2 리포트 조회 및 previousReportId 이벤트 전달, BASELINE·COMPARISON 분기 단위 테스트 추가
직전 리포트의 기간·콘텐츠·감정 통계 수집, 긍정 감정 비율 차이와 주요 감정 변화 계산 및 LLM 입력 전달
COMPARISON 프롬프트 로딩과 비교 입력 JSON 치환, 감정 비교 응답 검증 및 dev·prod 배포 환경 변수 설정 추가
emotion_comparison JSONB 스냅샷 저장과 조회 응답 확장, LLM segment 정규화 및 V2 길이 검증 에러 코드 세분화
monthly_reports_v2에 social_summary JSONB 컬럼을 추가하고 기존 리포트의 비노출 기본값을 backfill함
사용자의 DailyReport에 받은 좋아요와 댓글·대댓글을 월별 친구 단위로 집계함. ACCEPTED 친구 관계를 기준으로 비친구, 탈퇴 사용자, 양방향 차단 관계와 삭제 댓글은
제외함
좋아요와 댓글 합계 및 참여 친구 조건으로 소셜 요약 노출 여부를 계산함. 반응 횟수 내림차순과 한국어 가나다순으로 최대 3명을 선정하고 displayOrder와 topRank를
분리해 공동 1위 강조를 지원함
KST 월 범위의 소셜 반응을 집계해 MonthlySocialSummaryContent를 생성하고 confirmMonthlyText에서 기존 분석 결과와 함께 원자적으로 저장함.
소셜 집계 실패 시 리포트 실패 및 크리스탈 환불 흐름을 적용함
MonthlyReportResponseV2에 소셜 페이지 노출 정보와 좋아요·댓글 랭킹을 추가함
V1/V2 공통 MonthlyReportLocatorResponse를 도입하고 id를 reportId로 명확화함. 나의 월간 리포트 조회 응답을 report와
previousReport 두 슬롯으로 확장해 버전별 상세 API 라우팅 기반을 마련함
지난달은 상태와 무관하게, 지지난달은 COMPLETED 상태만 V2 우선·V1 fallback으로 탐색하는 resolver를 추가함
V1 상세 조회에 인증 사용자 기반 소유권 검증과 403 응답을 추가함. locator API의 null·상태·version별 상세 경로를 문서화하고, 이전 월을 현재 범위에서
파생해 연도 경계를 안정적으로 처리함
이미지 화풍 프리셋과 저장 컬럼을 추가하고, 최근 완료 리포트의 화풍을 제외해 결정적으로 프리셋을 선택·저장하도록 구현. 재시도 시 동일한 화풍을 유지하도록 보장하고
Repository, 선택기, 할당 서비스 테스트 추가.
리포트 내용과 기간, 화풍 프리셋을 MonthlyImagePromptContext로 정규화하고 공통 안전 제약과 8개 화풍별 시각 지침을 합성하는
MonthlyImagePromptComposer 추가. 빈 입력 처리와 프리셋별 프롬프트 분기를 단위 테스트로 검증
OpenAiImageClient가 MonthlyImagePromptContext를 받아 composer로 프롬프트를 조립하도록 확장하고 기존 HTTP 요청 경로를 재사용
MonthlyReportGenerationListenerV2에서 프리셋을 할당하고 MonthlyImagePromptContext를 구성해 context 기반 이미지 생성을
호출하도록 전환
MonthlyReportPromptLoader의 고정 이미지 템플릿과 OpenAiImageClient의 구형 DTO 기반 진입점을 제거하고, 이미지 프롬프트 생성을
MonthlyImagePromptComposer로 단일화
8종의 색상 팔레트와 저장 컬럼을 추가하고 최근 완료 리포트의 팔레트를 제외하는 결정적 선택 로직 구현. 화풍과 팔레트를 함께 할당하며 기존 부분 저장 상태에서는 누락된 값만
보완하도록 확장
저장된 화풍과 색상 팔레트를 MonthlyImagePromptContext로 전달하고 팔레트별 배경·주조색·강조색 지침을 이미지 프롬프트에 합성. 공통 색감 편향과 기본 파스텔
회귀를 제한하고 listener를 통합 visual preset 계약으로 전환
8개 화풍과 8개 팔레트의 전체 64개 프롬프트 조합이 서로 구분되는지 검증하고, 팔레트별 핵심 색상 표현이 유지되는지 테스트 추가
GET /api/v2/monthly-report/current와 전용 응답 DTO·query service 메서드·테스트를 제거하고 월간 리포트 locator 조회 경로를 기본
API로 단일화
@coldsunn

Copy link
Copy Markdown
Collaborator

고생하셨어요!! 머지 고고~

@1Seob 1Seob merged commit 9f8720e into develop Jun 30, 2026
1 check passed
@1Seob 1Seob deleted the feat/monthly-report-v2-expansion branch June 30, 2026 08:51
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.

2 participants