Skip to content

✨ Feat: 회원 탈퇴 API (소프트 삭제) — DELETE /auth/withdraw - #114

Merged
naooung merged 1 commit into
developfrom
feat/auth-withdraw
Jun 15, 2026
Merged

✨ Feat: 회원 탈퇴 API (소프트 삭제) — DELETE /auth/withdraw#114
naooung merged 1 commit into
developfrom
feat/auth-withdraw

Conversation

@naooung

@naooung naooung commented Jun 15, 2026

Copy link
Copy Markdown
Member

연결 Issue

closes #

작업 유형

  • ✨ Feat — 새 기능

변경 내용

인증된 사용자의 회원 탈퇴 API를 추가한다. 방식은 소프트 삭제(데이터 보존)다.

엔드포인트: DELETE /auth/withdraw (인증 필요)

  • UserStatus: WITHDRAWN 추가
  • User: withdrawnAt 필드 + withdraw() / isWithdrawn() (기존 suspend() 패턴 준수)
  • 마이그레이션 V22: chk_users_status 제약에 WITHDRAWN 추가 + withdrawn_at 컬럼 (develop 최신 V21 다음 번호)
  • AuthService.withdraw(): status=WITHDRAWN+withdrawnAt 기록 → 리프레시 토큰(Redis) 무효화 + ilkwa_refresh 쿠키 제거 (logout 헬퍼 재사용). 쿠키 없음/이미 탈퇴여도 멱등.
    • findOrCreateOauthUser: WITHDRAWN 계정 재로그인·재가입 차단(AUTH_009)
  • AuthController / Impl: @DeleteMapping("/withdraw") + @AuthenticationPrincipal UserPrincipal
  • AuthErrorCode: AUTH_009("탈퇴한 계정입니다", 403)

설계 메모

  • 소프트 삭제 선택: users FK가 전부 ON DELETE CASCADE라 하드 삭제 시 과외·제출·노트·코인 등 전부 영구 삭제됨. 복구·정산·재가입 정책 대응을 위해 보존.
  • 잔여 액세스 토큰은 만료(단명)까지 유효하나 RT가 막혀 갱신 불가. 즉시 무효화가 필요하면 후속으로 JwtAuthenticationFilter에서 status 차단을 추가할 수 있음(현재 SUSPENDED도 미차단이라 일관성상 본 PR 범위 제외).

테스트 방법

  • ./gradlew test --tests "com.swez.backend.domain.auth.service.AuthServiceTest"
  • 신규 회귀 4건:
    • 탈퇴 시 status=WITHDRAWN·withdrawnAt 기록 + RT 삭제 + 쿠키 제거
    • 쿠키 없어도 멱등 처리
    • 존재하지 않는 사용자 → USER_001
    • 탈퇴 계정 Google 재로그인 → AUTH_009
  • 전체 스위트 ./gradlew test BUILD SUCCESSFUL

체크리스트

  • develop 브랜치에서 분기했다
  • 브랜치 네이밍 규칙(타입/작업내용)을 따랐다
  • 커밋 메시지가 {깃모지} {타입}: {내용} 형식을 따른다
  • 관련 문서를 동시에 업데이트했다 (필요 시)
  • Merge 후 브랜치 삭제 예정이다

인증된 사용자를 탈퇴(소프트 삭제) 처리한다. 데이터는 보존하되 재로그인·재가입을
차단한다.

- UserStatus: WITHDRAWN 추가
- User: withdrawnAt 필드 + withdraw()/isWithdrawn() (suspend 패턴)
- V22 마이그레이션: chk_users_status에 WITHDRAWN 추가 + withdrawn_at 컬럼
- AuthService.withdraw(): status 전이 + RT 무효화 + 쿠키 제거(logout 헬퍼 재사용)
  - findOrCreateOauthUser: WITHDRAWN 계정 재로그인 차단(AUTH_009)
- AuthController: DELETE /auth/withdraw (@AuthenticationPrincipal, 인증 필요)
- AuthErrorCode: AUTH_009(탈퇴한 계정입니다, 403)
- 회귀 테스트 4건 (소프트삭제+세션종료, 멱등, USER_001, 재로그인 차단)
@naooung
naooung merged commit a7498ab into develop Jun 15, 2026
1 check passed
@naooung
naooung deleted the feat/auth-withdraw branch June 15, 2026 03:14
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