Skip to content

feat(stats): 탈퇴 사유 독립 보존과 통계 전환 - #240

Merged
1Seob merged 5 commits into
developfrom
feat/stats-withdrawal
Sep 6, 2026
Merged

feat(stats): 탈퇴 사유 독립 보존과 통계 전환#240
1Seob merged 5 commits into
developfrom
feat/stats-withdrawal

Conversation

@1Seob

@1Seob 1Seob commented Sep 6, 2026

Copy link
Copy Markdown
Collaborator

📝 요약(Summary)

  • 탈퇴 사유 통계가 계정 완전 삭제와 함께 사라지지 않도록 계정과 독립된 탈퇴 이벤트 저장 구조를 도입했습니다.
  • 탈퇴 후 14일이 지나면 사용자 연결과 자유 입력 사유를 제거하고, 선택 사유 통계는 최대 1년간 보존하도록 생명주기를 구성했습니다.
  • 관리자 탈퇴 통계를 신규 이벤트 기준으로 전환하고 보존 범위를 화면에 안내했습니다.

주요 변경사항

  • 탈퇴 이벤트 저장 구조

    • withdrawal_events, withdrawal_event_reasons 테이블과 도메인 엔티티를 추가했습니다.
    • 기존 탈퇴 사유를 이벤트 단위로 묶어 신규 구조로 이관하는 Flyway backfill을 추가했습니다.
    • 신규 탈퇴 요청은 독립 이벤트 저장소에만 기록하도록 저장 경로를 단일화했습니다.
    • 사용자 탈퇴 상태와 이벤트·사유 저장을 하나의 트랜잭션으로 처리합니다.
  • 개인정보 보존 및 정리

    • 탈퇴 후 14일이 지난 이벤트의 사용자 연결과 자유 입력 사유를 제거합니다.
    • 보존 기간 1년이 만료된 이벤트와 하위 사유를 삭제합니다.
    • 매일 00시 10분에 실행되는 정리 작업을 멱등하게 구성하고 전체 작업을 하나의 트랜잭션으로 묶었습니다.
    • 기존 데이터에도 동일한 기준을 적용하는 forward-only migration을 추가했습니다.
  • 통계 조회 및 관리자 화면

    • 탈퇴 통계 조회 원천을 레거시 테이블에서 독립 이벤트 테이블로 전환했습니다.
    • 보존 기간이 남은 이벤트만 집계하고, 사용자 연결이 제거된 이벤트의 자유 입력 내용은 노출하지 않습니다.
    • 다중 선택 사유가 최근 이벤트 제한을 왜곡하지 않도록 이벤트를 먼저 제한한 뒤 사유를 조회합니다.
    • 통계 페이지에 계정 완전 삭제와 분리된 최대 1년 보존 범위를 안내했습니다.
  • 레거시 호환성

    • user_withdrawal_reasons 신규 쓰기는 중단했습니다.
    • 이전 버전 롤백과 잔여 데이터 정리를 위해 테이블·엔티티·리포지토리는 유지했습니다.
    • DB table comment에 레거시 상태, 신규 쓰기 금지 및 대체 저장소를 명시했습니다.
    • 기존 레거시 행은 14일 정리 작업으로 계속 제거됩니다.
  • 테스트

    • 신규 이벤트 저장과 레거시 미저장을 검증했습니다.
    • 신규 사유 저장 실패 시 사용자 탈퇴 상태와 이벤트가 모두 롤백되는지 검증했습니다.
    • 기존 데이터 backfill, 계정 삭제 후 이벤트 보존, 만료 데이터 정리와 DB 제약을 PostgreSQL 환경에서 검증했습니다.
    • 정리 작업의 멱등성과 중간 실패 시 전체 롤백을 검증했습니다.
    • 통계 집계, 이벤트 단위 제한, 자유 입력 비노출 및 관리자 화면 문구를 검증했습니다.

검증

  • .\gradlew.bat --no-daemon --max-workers=1 test
    • 122개 테스트 suite
    • 415개 테스트 통과
    • 실패·오류·건너뜀 0개
  • git diff --check 통과

참고 / 리스크

  • 레거시 테이블은 롤백 안전망으로 유지하며 물리 삭제는 이번 PR 범위에 포함하지 않습니다.

🔗 Related Issue

  • Closes:

💬 공유사항

✅ PR Checklist

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

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

withdrawal_events와 withdrawal_event_reasons를 추가해 계정 하드 삭제 시 사용자 연결만 제거하고 탈퇴 이벤트를 보존하도록 함. 기존
user_withdrawal_reasons를 이벤트 단위로 이관하고 1년 만료일, 중복 사유 및 유효기간 제약을 PostgreSQL 통합 테스트로 검증함
기존 통계 호환을 위한 레거시 사유와 신규 탈퇴 이벤트·사유의 트랜잭션 단위 이중 저장, 신규 저장 실패 시 사용자 탈퇴 상태와 전체 사유 기록 롤백 검증
탈퇴 통계 조회를 withdrawal_events와 withdrawal_event_reasons 기준으로 전환하고 만료 이벤트 제외, 이벤트 단위 최신 목록, 계정 연결 제거 시
custom_reason 비노출을 적용함. 하드 삭제 이후 집계 유지와 화면의 최대 1년 보존 범위 안내를 PostgreSQL 및 MVC 테스트로 검증함
탈퇴 요청 14일 경과 시 withdrawal_events의 user_id와 withdrawal_event_reasons의 custom_reason을 제거하고
anonymized_at을 기록하며, 전환기 user_withdrawal_reasons와 1년 만료 이벤트를 정리하도록 추가함. 기존 데이터 정리 migration과 멱등
실행·중간 실패 전체 롤백을 검증하는 PostgreSQL 테스트를 추가함
신규 탈퇴 요청의 저장 경로를 withdrawal_events와 withdrawal_event_reasons로 단일화함. 롤백 호환성과 잔여 데이터 정리를 위해 기존 테이블은
유지하고 DB 설명에 레거시 상태와 대체 저장소를 명시함
@coldsunn

coldsunn commented Sep 6, 2026

Copy link
Copy Markdown
Collaborator

LGTM!!

@1Seob
1Seob merged commit 293a89b into develop Sep 6, 2026
1 check passed
@1Seob
1Seob deleted the feat/stats-withdrawal branch September 6, 2026 14:46
@1Seob 1Seob mentioned this pull request Sep 6, 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.

2 participants