Skip to content

fix(report): 유형 리포트 persona 마크업 노출 방지 - #228

Merged
1Seob merged 1 commit into
developfrom
fix/report-persona-markup
Aug 22, 2026
Merged

fix(report): 유형 리포트 persona 마크업 노출 방지#228
1Seob merged 1 commit into
developfrom
fix/report-persona-markup

Conversation

@1Seob

@1Seob 1Seob commented Aug 22, 2026

Copy link
Copy Markdown
Collaborator

📝 요약(Summary)

  • 유형 리포트의 persona.content에 비지원 <marks> 태그가 일반 문자열로 저장되어 화면에 노출되던 문제를 수정했습니다.
  • 신규 생성 결과는 리라이트 및 저장 전에 검증하고, 기존 레거시 데이터는 API 응답에서 일반 텍스트로 복원합니다.

주요 변경사항

  • 생성 및 저장 검증
    • plain text와 styled text segment에서 비지원 <mark>·<marks> 태그를 탐지하는 공통 형식 판별기를 추가했습니다.
    • 길이가 정상이어도 persona에 비지원 마크업이 있으면 LLM 리라이트 대상으로 분류했습니다.
    • 리라이트 결과에도 태그가 남아 있으면 TYPE_REPORT_PERSONAS_INVALID로 실패 처리합니다.
    • confirmType의 repository 업데이트 및 crystal log 확정 전에 동일한 검증을 적용했습니다.
  • 레거시 응답 호환
    • 기존에 저장된 <marks text="..." marks=[...]> 형식은 TypeReportMapper에서 text 값만 추출해 일반 문장으로 반환합니다.
    • DB 원본과 정상 styledTextBOLD·HIGHLIGHT 계약은 변경하지 않았습니다.
  • 회귀 테스트
    • 비지원 태그 발견 시 persona 리라이트가 실행되는지 검증했습니다.
    • 리라이트 후에도 태그가 남으면 생성이 거부되는지 검증했습니다.
    • 저장 트랜잭션이 repository 업데이트 전에 잘못된 콘텐츠를 차단하는지 검증했습니다.
    • 기존 레거시 문자열이 API 응답에서 일반 텍스트로 복원되는지 검증했습니다.

검증

  • .\gradlew.bat compileJava 통과
  • TypeReportContentGenerationServiceTest 통과
  • TypeReportLlmClientTest 통과
  • TypeReportTxServiceTest 통과
  • TypeReportMapperTest 통과
  • TypeReportGenerationListenerTest 통과
  • git diff --check 통과

참고 / 리스크

  • 기존 DB의 잘못된 문자열 자체는 변경하지 않고 TypeReportMapper를 거치는 조회 응답에서만 복원합니다.
  • persona는 plain string 계약이므로 레거시 태그의 강조 효과는 적용하지 않고 내부 텍스트만 유지합니다.
  • 레거시 복원은 확인된 <marks text="..." marks=[...]> 형식을 대상으로 합니다.

🔗 Related Issue

  • Closes:

💬 공유사항

✅ PR Checklist

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

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

persona 문자열의 비지원 <marks> 태그를 생성·리라이트·저장 단계에서 검증하고, 기존 레거시 데이터는 조회 응답에서 일반 텍스트로 복원함
@coldsunn

Copy link
Copy Markdown
Collaborator

LGTM!

@1Seob
1Seob merged commit a559834 into develop Aug 22, 2026
1 check passed
@1Seob
1Seob deleted the fix/report-persona-markup branch August 22, 2026 13:00
1Seob added a commit that referenced this pull request Aug 22, 2026
* feat(ai): Ask Chat 예시 질문 10분 로테이션 적용 (#225)

* feat: Ask Chat 예시 질문 결정적 로테이션 추가

사용자 ID와 10분 시간 슬롯을 기준으로 예시 질문을 순환 선택하고 동일 슬롯 안정성 및 경계 동작을 단위 테스트로 검증함

* feat: Ask Chat 홈에 질문 로테이션 적용

AskChatSessionService의 요청별 랜덤 선택을 사용자별 10분 결정적 로테이션으로 교체함

* feat(stats): 통계 기간 선택과 유형 리포트 차트 확장 (#226)

* feat(stats): 유형 리포트 관심사별 일간 집계 추가

soft delete된 COMPLETED 이력을 누적·일별 통계에 포함하고 최근 7일의 빈 날짜·관심사를 0으로 보정함

* feat(stats): 유형 리포트 관심사별 추이 차트 추가

* feat(stats): 통계 조회 기준 기간 선택 지원

date·week·month 쿼리 파라미터를 ISO 형식으로 해석하고 미래 기간을 차단함. 선택 기간을 끝점으로 일간 7일·주간 5주·월간 5개월 시계열과 요약값을 구성하고 실제
현재 기간을 기준으로 최고 기록 상태를 유지함

* feat(stats): 통계 기간 선택 UI와 요약 카드 추가

일·주·월 통계 페이지 하단에 기간 선택 폼과 현재 기간 복귀 링크를 추가함

* feat(stats): 유형 리포트 활성·누적 통계 분리

현재 활성 COMPLETED 리포트와 재생성 이력을 포함한 전체 누적 생성 수를 별도 집계·ViewModel·차트로 분리함

* fix(infra): 테스트 DB 커넥션 풀 연결 한도 초과 수정

* fix(infra): 개발 배포 Secret 파일 전송 방식 적용 (#227)

대용량 Secret을 개별 Base64 파일로 생성해 SCP로 전달하도록 변경함. 원격 복원·권한 제한·임시 파일 정리와 Secret 검증 후 기존 프로세스 종료 순서를 적용함

* fix(report): 유형 리포트 persona 마크업 노출 방지 (#228)

persona 문자열의 비지원 <marks> 태그를 생성·리라이트·저장 단계에서 검증하고, 기존 레거시 데이터는 조회 응답에서 일반 텍스트로 복원함

* feat(admin): 관리자 페이지에 로그 탭과 필터 화면 추가 (#229)

* feat(admin): 로그 조회 공통 기반과 사용자 필터 추가

관리자 로그 조회에 사용할 페이지 응답 DTO와 닉네임·이메일 검색 조건 정규화 및 최신순 정렬 규칙을 추가함. report_generation_logs, crystal_logs,
ask_chat_wallet_logs의 전체 최신순 조회를 지원하도록 created_at·id 복합 인덱스를 Flyway migration으로 추가함

* feat(admin): 리포트 생성 로그 조회 API 추가

report_generation_logs를 사용자 닉네임·이메일로 검색하고 최신순 페이지네이션으로 조회하는 관리자 API를 추가함

* feat(admin): 크리스탈 로그 조회 API 추가

crystal_logs를 사용자 닉네임·이메일로 검색하고 최신순 페이지네이션으로 조회하는 관리자 API를 추가함

* feat(admin): Ask Chat 대화권 로그 조회 API 추가

ask_chat_wallet_logs를 사용자 닉네임·이메일로 검색하고 최신순 페이지네이션으로 조회하는 관리자 API를 추가함

* feat(admin): 관리자 로그 탭과 필터 화면 추가

/admin/tabs/logs에 주요 로그 하위 탭과 닉네임·이메일 필터, 페이지네이션을 연결하고 Ask Chat Wallet 표는 sessionId만 표시하도록 단순화함
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