Skip to content

feat : 회원 탈퇴 API 구현 (DB/Redis/Firebase 삭제) #22#32

Merged
EM-H20 merged 15 commits into
mainfrom
20260422_#22_회원_탈퇴_API_구현
May 11, 2026

Hidden character warning

The head ref may contain hidden characters: "20260422_#22_\ud68c\uc6d0_\ud0c8\ud1f4_API_\uad6c\ud604"
Merged

feat : 회원 탈퇴 API 구현 (DB/Redis/Firebase 삭제) #22#32
EM-H20 merged 15 commits into
mainfrom
20260422_#22_회원_탈퇴_API_구현

Conversation

@EM-H20
Copy link
Copy Markdown
Contributor

@EM-H20 EM-H20 commented May 11, 2026

feat : 회원 탈퇴 API 구현 (DB/Redis/Firebase 삭제) #22


Summary

DELETE /api/auth/withdraw 엔드포인트를 추가해 인증된 사용자의 DB row, Redis refresh token, Firebase Authentication 사용자를 모두 삭제한다. 외부 시스템(Redis/Firebase) 장애가 DB 롤백을 일으키지 않도록 예외를 격리하고 멱등성을 보장한다.

Changes

  • SS-Auth/build.gradle: Firebase Admin SDK 9.4.3 의존성 추가
  • SS-Auth/.../auth/firebase/FirebaseConfig.java: 신규 — FirebaseApp 초기화 + FirebaseAuth 빈 노출
  • SS-Auth/.../auth/service/AuthService.java: withdraw(Long memberId) 메서드 + private deleteFirebaseUserSafely() 헬퍼 추가 (DB → Redis → Firebase 순 삭제, Firebase 예외는 모두 로그 처리)
  • SS-Web/.../controller/auth/AuthController.java: DELETE /api/auth/withdraw 엔드포인트 추가, 전체 Auth 엔드포인트 Swagger 문서(@Operation description/응답 예시) 상세화
  • SS-Auth/.../auth/interceptor/AuthMember.java: @Parameter(hidden = true) 추가로 Swagger 파라미터 노출 제거
  • SS-Common/.../exception/ErrorResponse.java, GlobalExceptionHandler.java: 응답 본문을 API 스펙에 맞게 {code, message} 형식으로 변경
  • SS-Web/src/main/resources/application.yml: firebase.admin-sdk-path 설정 추가
  • .gitignore: Firebase Admin SDK 키 파일 패턴(**/firebase/*.json, *-firebase-adminsdk-*.json) 추가
  • SS-Auth/.../AuthServiceTest.java (+4 케이스), SS-Web/.../AuthControllerTest.java (+2 케이스): TDD 기반 테스트 추가
  • docs/superpowers/specs/2026-05-11-withdraw-api-design.md, docs/superpowers/plans/2026-05-11-withdraw-api.md: 설계·구현 계획 문서 추가

Behavior Change

항목 Before After
회원 탈퇴 엔드포인트 없음 DELETE /api/auth/withdraw204 No Content
인증 누락 시 401 Unauthorized
DB Member 이미 삭제됨 멱등 처리 (refresh token만 삭제 시도, 204)
Firebase USER_NOT_FOUND 무시하고 204 (warn 로그)
Firebase 기타 오류 무시하고 204 (error 로그) — DB 트랜잭션 롤백 안 됨
ErrorResponse 형식 기존 포맷 { "code": "...", "message": "..." }
@AuthMember Swagger 노출 파라미터로 노출 @Parameter(hidden = true)로 숨김
// AuthService.withdraw — 핵심 흐름
@Transactional
public void withdraw(Long memberId) {
    Member member = memberRepository.findById(memberId).orElse(null);
    if (member != null) memberRepository.delete(member);
    refreshTokenRepository.delete(memberId);
    if (member != null) deleteFirebaseUserSafely(memberId, member.getSocialId());
}

Test Plan

  • ./gradlew test 전체 통과 (25/25)
  • AuthServiceTest.withdraw_* 4개 케이스 통과 (정상 / 멱등 / Firebase USER_NOT_FOUND / Firebase 일반 오류)
  • AuthControllerTest.withdraw_* 2개 케이스 통과 (정상 204 / 인증 누락 401)
  • ./gradlew clean build 전체 통과 확인
  • 로컬 기동(bootRun --args='--spring.profiles.active=dev') 후 로그에 [FirebaseConfig] FirebaseApp 초기화 완료 출력 확인
  • Swagger UI(/docs/swagger)에서 DELETE /api/auth/withdraw 노출 및 @AuthMember 파라미터 미노출 확인
  • curl -i -X DELETE http://localhost:8080/api/auth/withdraw → 401 응답 확인
  • 유효 토큰으로 호출 → 204 응답 + DB/Redis/Firebase 사용자 삭제 확인

Notes

  • Firebase Admin SDK 키 파일(spacestudyship-firebase-adminsdk-fbsvc-7e86c5c253.json)은 .gitignore에 등록되어 추적되지 않는다. 로컬·CI 환경에서는 SS-Web/src/main/resources/firebase/ 경로에 별도 배치 필요.
  • application.ymlfirebase.admin-sdk-pathclasspath: prefix를 사용 — Spring Resource 타입이 자동 리졸션.
  • Firebase 호출이 try/catch로 격리되어 있어 외부 시스템 장애가 DB 트랜잭션 롤백을 유발하지 않는다 (멱등성 + 데이터 정합 우선).
  • 설계 근거 및 구현 계획:
    • docs/superpowers/specs/2026-05-11-withdraw-api-design.md
    • docs/superpowers/plans/2026-05-11-withdraw-api.md
  • ErrorResponse 형식 변경은 본 PR 범위(withdraw 401/500 예시 정합성 확보)에서 함께 처리. 기존 다른 엔드포인트 응답 본문도 같은 형식으로 전환됨 — 클라이언트 측 파싱 확인 필요.
  • .pr/ 디렉토리는 현재 .gitignore에 등록되어 있지 않다. 본 파일은 PR 본문 초안 용도이며, 커밋 대상은 아님 — 필요 시 .gitignore.pr/ 추가 권장.

Closes #22

Summary by CodeRabbit

주요 변경사항

  • New Features

    • 사용자 계정 탈퇴 기능 추가: DELETE /api/auth/withdraw 엔드포인트를 통해 인증된 사용자가 계정을 완전히 삭제할 수 있습니다.
    • Firebase Authentication 통합으로 안전한 사용자 데이터 삭제 지원
  • Documentation

    • 인증 API 엔드포인트에 대한 상세한 Swagger 문서화 추가로 개발자 경험 개선
  • Chores

    • Firebase Admin SDK 의존성 추가
    • 민감한 인증 파일을 Git 추적 제외 대상으로 설정

Review Change Stack

EM-H20 added 15 commits May 11, 2026 22:11
@EM-H20 EM-H20 merged commit 8d2d5a6 into main May 11, 2026
@github-actions
Copy link
Copy Markdown

🗑️ Preview 환경 삭제 완료!

항목
컨테이너 spacestudyship-pr-32
상태 삭제됨

다시 배포하려면: @suh-lab server build


🤖 이 댓글은 PR/Issue Preview 시스템에 의해 자동 생성되었습니다.

@coderabbitai
Copy link
Copy Markdown

coderabbitai Bot commented May 11, 2026

Caution

Review failed

The pull request is closed.

ℹ️ Recent review info
⚙️ Run configuration

Configuration used: Path: .coderabbit.yaml

Review profile: CHILL

Plan: Pro

Run ID: 0d9e1c74-827f-4f5b-acf4-696a22f3d140

📥 Commits

Reviewing files that changed from the base of the PR and between f6e732d and af45bcb.

⛔ Files ignored due to path filters (1)
  • .DS_Store is excluded by !**/.DS_Store
📒 Files selected for processing (29)
  • .claude/commands/design-analyze.md
  • .claude/commands/issue.md
  • .claude/commands/plan.md
  • .claude/commands/ppt.md
  • .claude/commands/pr-description.md
  • .claude/commands/rp.md
  • .claude/commands/testcase.md
  • .gitignore
  • SS-Auth/build.gradle
  • SS-Auth/src/main/java/com/elipair/spacestudyship/auth/dto/CheckNicknameRequest.java
  • SS-Auth/src/main/java/com/elipair/spacestudyship/auth/dto/LoginRequest.java
  • SS-Auth/src/main/java/com/elipair/spacestudyship/auth/dto/LoginResponse.java
  • SS-Auth/src/main/java/com/elipair/spacestudyship/auth/dto/LogoutRequest.java
  • SS-Auth/src/main/java/com/elipair/spacestudyship/auth/dto/ReissueRequest.java
  • SS-Auth/src/main/java/com/elipair/spacestudyship/auth/dto/ReissueResponse.java
  • SS-Auth/src/main/java/com/elipair/spacestudyship/auth/dto/Tokens.java
  • SS-Auth/src/main/java/com/elipair/spacestudyship/auth/dto/UpdateNicknameRequest.java
  • SS-Auth/src/main/java/com/elipair/spacestudyship/auth/dto/UpdateNicknameResponse.java
  • SS-Auth/src/main/java/com/elipair/spacestudyship/auth/firebase/FirebaseConfig.java
  • SS-Auth/src/main/java/com/elipair/spacestudyship/auth/interceptor/AuthMember.java
  • SS-Auth/src/main/java/com/elipair/spacestudyship/auth/service/AuthService.java
  • SS-Auth/src/test/java/com/elipair/spacestudyship/auth/service/AuthServiceTest.java
  • SS-Common/src/main/java/com/elipair/spacestudyship/common/exception/ErrorResponse.java
  • SS-Common/src/main/java/com/elipair/spacestudyship/common/exception/GlobalExceptionHandler.java
  • SS-Web/src/main/java/com/elipair/spacestudyship/controller/auth/AuthController.java
  • SS-Web/src/main/resources/application.yml
  • SS-Web/src/test/java/com/elipair/spacestudyship/controller/auth/AuthControllerTest.java
  • docs/superpowers/plans/2026-05-11-withdraw-api.md
  • docs/superpowers/specs/2026-05-11-withdraw-api-design.md

워크스루

이 PR은 SpaceStudyShip 백엔드에 회원 탈퇴 API를 구현하며, Firebase 사용자 삭제 통합, 에러 응답 리팩토링, Swagger 문서화 확대, AI 어시스턴트 커맨드 파일 표준화를 포함한다.

변경 사항

회원 탈퇴 API 구현

레이어 / 파일 요약
Firebase 인프라 구성
SS-Auth/build.gradle, SS-Auth/src/main/java/com/elipair/spacestudyship/auth/firebase/FirebaseConfig.java, SS-Web/src/main/resources/application.yml, .gitignore
Firebase Admin SDK 9.4.3 의존성 추가, 보안 인증서 파일 무시 규칙(.claude/config.json, **/firebase/*.json, *-firebase-adminsdk-*.json) 설정, FirebaseConfig 빈 생성(초기화 가드 포함), firebaseAuth() Bean 노출.
에러 응답 구조 변경
SS-Common/src/main/java/com/elipair/spacestudyship/common/exception/ErrorResponse.java, SS-Common/src/main/java/com/elipair/spacestudyship/common/exception/GlobalExceptionHandler.java
ErrorResponse 레코드 컴포넌트를 (int status, String message)(String code, String message) 변경, 팩토리 메서드 of(ErrorCode)of(ErrorCode, String) 추가, 검증 예외 핸들러 업데이트.
탈퇴 서비스 로직
SS-Auth/src/main/java/com/elipair/spacestudyship/auth/service/AuthService.java
FirebaseAuth 주입, withdraw(Long memberId) 메서드 추가(DB/Redis/Firebase 순차 삭제), deleteFirebaseUserSafely() 헬퍼로 Firebase 예외 격리(USER_NOT_FOUND 무시, 기타 오류 로깅).
DTO Swagger 메타데이터
SS-Auth/src/main/java/com/elipair/spacestudyship/auth/dto/*Request.java, SS-Auth/src/main/java/com/elipair/spacestudyship/auth/dto/*Response.java, SS-Auth/src/main/java/com/elipair/spacestudyship/auth/dto/Tokens.java
모든 Auth DTO에 @Schema 어노테이션 추가(레코드 수준 및 컴포넌트 수준), 설명/예제/필수 모드 메타데이터 포함.
컨트롤러 API 문서화
SS-Web/src/main/java/com/elipair/spacestudyship/controller/auth/AuthController.java
전체 Auth 엔드포인트(/login, /reissue, /logout, /check-nickname, /nickname, /withdraw)에 상세 @Operation@ApiResponses 추가, 응답 코드/스키마/예제 문서화, /check-nickname@ParameterObject 추가.
탈퇴 기능 테스트
SS-Auth/src/test/java/com/elipair/spacestudyship/auth/service/AuthServiceTest.java, SS-Web/src/test/java/com/elipair/spacestudyship/controller/auth/AuthControllerTest.java
withdraw_success, withdraw_alreadyWithdrawn, withdraw_firebaseUserNotFound, withdraw_firebaseGenericError 테스트 추가, DELETE /api/auth/withdraw 엔드포인트 200/401 테스트 추가.
설계 및 구현 문서
docs/superpowers/specs/2026-05-11-withdraw-api-design.md, docs/superpowers/plans/2026-05-11-withdraw-api.md
API 설계 명세(엔드포인트 계약, 데이터 삭제 순서, 예외 정책, 테스트 케이스, 확장 포인트) 및 9개 Task로 구성된 단계별 구현 계획 문서 추가.

AI 어시스턴트 커맨드 파일 표준화

레이어 / 파일 요약
기존 커맨드 제거
.claude/commands/design-analyze.md, .claude/commands/issue.md, .claude/commands/plan.md, .claude/commands/ppt.md, .claude/commands/testcase.md
기존 Plan/Design/Issue/PPT/Testcase 모드 지침 문서 전체 삭제(1,738줄 감소).
PR 본문 생성 규칙
.claude/commands/pr-description.md
리뷰어 대상 PR 본문 생성 규칙 정의: 브랜치 이슈 번호 자동 추출, 보고서/사용자 입력/git 상태 우선순위, 섹션 템플릿(Summary/Changes/Behavior Change/Test Plan/Notes/Closes), 금지 표현, 선택적 파일 저장 규칙(+231줄).
병렬 생성 자동화
.claude/commands/rp.md
/report/pr-description 디스패치 병렬화: git 컨텍스트 1회 수집, 두 Agent 독립 작성, .report/.pr/ 파일 생성, PR 생성 명령 제시, 순차 호출/메타 삽입 금지 규칙(+129줄).

추정 코드 리뷰 노력

🎯 3 (중간 복잡도) | ⏱️ ~25분

✨ Finishing Touches
📝 Generate docstrings
  • Create stacked PR
  • Commit on current branch
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch 20260422_#22_회원_탈퇴_API_구현

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands and usage tips.

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.

⚙️[기능추가][인증] 회원 탈퇴 API 구현

1 participant