Skip to content

feat: 회원 탈퇴/약관 동의/방 멤버 LEFT 상태/벌크 조회 등 dev 누적분 반영 (dev → main)#142

Merged
parkjuyeong0312 merged 9 commits into
mainfrom
dev
Jun 9, 2026
Merged

feat: 회원 탈퇴/약관 동의/방 멤버 LEFT 상태/벌크 조회 등 dev 누적분 반영 (dev → main)#142
parkjuyeong0312 merged 9 commits into
mainfrom
dev

Conversation

@parkjuyeong0312

Copy link
Copy Markdown
Member

변경 내용

변경 이유

  • 회원 탈퇴, 약관 동의 등 운영 정책상 필수 기능을 신규 도입.
  • 방 멤버 row 유지(LEFT)로 채팅/스케줄 이력의 참조 무결성 보존.
  • 장소/경로 화면의 N+1 호출을 벌크 API + 가상 스레드 fan-out으로 개선.
  • 운영 DB를 외부 매니지드로 이전하며 컴포즈/설정 정리.
  • dev 누적분을 main에 반영해 운영 기준 브랜치를 최신화.

테스트

  • ./gradlew build (각 feature PR 머지 시점에 통과 확인)
  • /review-code-against-docs 스킬로 검증 — 각 PR 단위로 수행 완료
  • 그 외 수동 검증: 운영 배포 전 외부 PostgreSQL 연결 및 Flyway V1.7~V1.9 마이그레이션 사전 점검 필요

체크리스트

  • PR 제목이 커밋 컨벤션 형식을 따른다.
  • 변경 사유를 PR 설명에 기록했다.
  • 테스트 방법과 결과를 기록했다.
  • 문서 변경이 필요한 경우 반영했다. (features.md / erd.md / decisions / plans / designs / policy)

하네스 변경 체크리스트

  • CLAUDE.md(AGENTS.md) 변경이 포함되어 있는가? → AGENTS.md 일부 갱신 포함
  • 변경 사유가 PR 설명에 기록되어 있는가?
  • 기존 규칙과 충돌하지 않는가?
  • 팀원에게 변경 사항을 공유했는가?

minbros and others added 9 commits June 8, 2026 00:44
* feat: 방 초기 조회 N+1 완화

* refactor: 조회 API 변경 코드 컨벤션 반영

* feat: 장소 벌크 조회와 사진 URL 캐시 추가

* feat: 경로 벌크 조회 API 추가

* feat: 장소 벌크 조회 실패 처리 변경

* feat: 장소 대표 사진 이름 벌크 조회 API 구현

- POST /places/photo-names/batch API 신규 구현
- PlacePhotoNameService에 대표 사진 이름 목록 병렬 벌크 조회 로직 추가 (taskExecutor 활용, 중복 ID 제거 및 요청 순서 유지, 부분 실패 대응)
- HttpRateLimitPolicyResolver에 벌크 조회 경로를 rate limit 대상으로 추가
- 관련 컨트롤러 테스트, 서비스/통합 테스트 작성 및 docs/ai/features.md 명세 업데이트

* feat: 방 초기화 속도 개선을 위한 Rate Limit 정책 단건/벌크 분리 및 경로 매핑 수정

* feat: 사진 URI 조회 API에 대한 Rate Limit 별도 분리 및 임계치 설정

* refactor: 비동기 실행기 분리 및 가상 스레드 적용

* refactor: PR 리뷰 코멘트 반영 및 Google API Executor Lombok 주입 리팩토링

- RedisBulkCacheAccessor Jackson Serializer 캐싱 최적화
- DTO status/errorCode 스펙 정비 및 결합도 완화
- PlacePhotoService 등 Executor Lombok RequiredArgsConstructor 주입 적용
- Rate Limit 정책 예외 조건 보강 및 테스트 코드 최신화

* refactor: 비동기 배치 조회 예외 처리 공통화 및 AsyncHelper 적용

- 비동기 CompletableFuture join 시 외부 API 에러(EXTERNAL_API_ERROR) 복구 로직을 AsyncHelper로 공통화
- PlacePreviewService, PlacePhotoNameService, PlacePhotoService의 중복 예외 처리 및 join 헬퍼 메서드 제거
- Lombok 어노테이션(@NoArgsConstructor)을 활용한 AsyncHelper 인스턴스화 방지 처리
* docs: 회원 탈퇴 기능 설계 spec과 구현 플랜 추가

* feat: V1.7 마이그레이션으로 users 회원 탈퇴 스키마 지원

* feat: User에 soft delete와 익명화 도메인 메서드 추가

* feat: WITHDRAWAL_REQUIRES_HOST_DELEGATION 에러 코드 추가

* feat: 회원 탈퇴용 RoomMember 조회 메서드 추가

* feat: 회원 탈퇴 거절 응답 DTO와 예외 정의

* feat: RefreshTokenService에 사용자 단위 토큰 일괄 폐기 API 노출

* feat: 탈퇴 이벤트와 RTK 일괄 폐기 리스너 추가

* feat: UserWithdrawalService로 탈퇴 트랜잭션 오케스트레이션 구현

* feat: 회원 탈퇴 거절 응답 핸들러 추가

* feat: DELETE /users/me 탈퇴 엔드포인트와 만료 쿠키 처리

* fix: 1인 방 탈퇴 삭제 순서 보강

* docs: 회원 탈퇴 정책을 features/erd/decisions에 반영

* fix: 회원 탈퇴 차단 응답에 에러 정보 추가

* fix: 탈퇴 유저 토큰 재발급 차단
* docs: SYSTEM 메시지 metadata 기반 렌더링 계약 명문화

탈퇴 사용자의 SYSTEM 메시지 본문이 옛 닉네임으로 굳는 비일관 문제를
백엔드 데이터 변경 없이 클라이언트 재렌더링으로 해결한다는 결정을 ADR로 기록하고,
MessagePayload와 MessageResponse의 content/metadata Schema 설명을 보강해
프론트가 metadata.eventType + userId 기반으로 본문을 조립한다는 계약을
Swagger/Springwolf 명세에 노출한다.

* docs: ERD/spec의 TIMESTAMP 표기를 실제 DDL에 맞춰 TIMESTAMP WITH TIME ZONE으로 통일

모든 마이그레이션이 TIMESTAMP WITH TIME ZONE으로 컬럼을 생성하는데
ERD와 user-withdrawal spec은 짧은 TIMESTAMP로 표기되어 있어 운영/개발 해석에
혼선이 생길 수 있었다. erd.md 16개 라인과 spec의 ALTER 예시를 실제 DDL과
1:1로 정렬한다.

* fix: 회원 탈퇴와 입장 승인 사이의 race 차단

호스트 본인이 PENDING 입장 승인과 본인 탈퇴를 동시에 발사하면
READ COMMITTED 스냅샷 차이로 솔로 호스트 방 판단 → HOST 멤버십만 삭제 →
호스트 없는 활성 방(orphan room)이 남는 시나리오가 가능했다.

withdraw 트랜잭션 시작 시 본인이 HOST인 모든 Room을 PESSIMISTIC_WRITE로 잠그고,
approve 트랜잭션 시작 시에도 Room을 findByIdForUpdate로 잡아
두 트랜잭션이 같은 Room 행을 두고 직렬화되도록 한다.

* fix: 탈퇴 시 익명화 누락을 DB CHECK로 강제 + DROP CONSTRAINT 방어

기존 users_active_required CHECK는 OR 구조라 탈퇴 회원(deleted_at IS NOT NULL)에
대한 4개 개인정보 컬럼(email, nickname, provider, provider_id)의 NULL 강제가 없어,
User.anonymize() 누락이나 운영자의 수동 SQL로 익명화 안 된 탈퇴 행이 생기는 경로를
DB가 막아주지 못했다. CHECK를 양방향(iff) 구조로 교체해
"활성 ⇔ 4개 컬럼 모두 NOT NULL" / "탈퇴 ⇔ 4개 컬럼 모두 NULL"을 강제한다.

같은 V1.7의 기존 UNIQUE 제약 DROP은 환경별 이름 차이/핫픽스 잔재로 실패할 수 있어
DROP CONSTRAINT IF EXISTS로 방어한다.

V1.7이 아직 main에 머지되지 않아 새 V1.8 대신 V1.7 자체를 수정한다.
ERD/spec/결정 기록도 동일 정책으로 동기화.

* docs : roomMember entity에 대해 status필드 추가 설계/기획 문서 작성

* feat: V1.8 마이그레이션으로 room_members status/left_at 도입

* feat: RoomMember에 MemberStatus(LEFT) + 도메인 메서드 추가

* feat: requireActiveMember에서 LEFT 멤버를 비멤버로 차단

* refactor: leave가 hard delete 대신 status=LEFT 전환을 수행

* refactor: kick이 hard delete 대신 status=LEFT 전환을 수행

* refactor: 활성 멤버 쿼리에 status=ACTIVE 필터 일괄 추가

* feat: 멤버 응답 DTO에 status 필드 노출

* feat: getMembers가 LEFT 멤버까지 노출하고 online=false 강제

* feat: requestJoin이 LEFT row를 PENDING으로 부활시키도록 지원

* fix: AI 컨텍스트 조회에서 LEFT 멤버 제외

* test: V1.8 CHECK 제약(LEFT/left_at/PENDING) 회귀 테스트 추가

* style: V1.8 CHECK 테스트 SQL 줄바꿈으로 line-length-120 위반 해소

* test: 탈퇴 시 LEFT 멤버십도 hard delete 되는지 회귀 테스트 추가

* docs: room_members status/left_at 도입을 features/erd에 반영

* refactor : 리뷰내용 반영(방나가기 중복 이벤트 차단, 방나감 에러코드 설정, 테스트추가
* chore: GitHub Actions 이미지 경로 동적화

* chore: Docker Compose 프로젝트명 및 이미지명 uttae로 변경

* chore: compose.app.prod.yaml 프로젝트명을 uttae-api로 수정

* chore: Gradle 프로젝트명 및 설명을 uttae-backend로 변경

* chore: 스프링 앱네임, 기본 DB명 및 Serena 설정을 uttae로 변경

* chore: 한글 서비스 명칭을 우리어때에서 우때로 변경

* chore: README.md 제목 How About Us -> Uttae로 변경

* refactor: update dev compose files to unify project name to uttae and configure common uttae-network

* refactor: 개발용 compose 파일을 업데이트하여 프로젝트명을 uttae로 통합하고 공통 uttae-network 구성

* refactor: remove common network settings but keep project name uttae in dev compose files
* docs: 서비스 정책 문서 초안 추가

* docs: 약관 백엔드 관리 설계 추가

* docs: 약관 백엔드 관리 구현 계획 추가

* docs: 탈퇴 시 방 데이터 보관 정책 정리

* feat: 약관 원문 리소스와 현재 버전 설정 추가

* feat: 현재 약관 조회 API 추가

* feat: 사용자 약관 동의 상태 저장 추가

* feat: 로그인 약관 동의 검증 추가

* docs: 약관 동의 기능과 ERD 반영

* test: 로그인 통합 테스트 약관 동의 반영

* style: 로그인 약관 명세 줄 길이 정리

* fix: 약관 정책 링크와 검증 테스트 보강
* docs: SYSTEM 메시지 MongoDB 페이로드 정리 spec 추가

SYSTEM 메시지에서 content·metadata.nickname·metadata.profileImageUrl을
BSON·JSON 키 자체로 남기지 않고, 표시 책임을 클라이언트로 일원화하는
refactor 설계안을 docs/superpowers/specs/에 작성한다.

* docs: SYSTEM 메시지 MongoDB 페이로드 정리 plan 추가

* docs: SYSTEM 메시지 페이로드 정리 ADR 추가 및 기존 ADR 교체 표기

* refactor: SYSTEM 메시지 페이로드에서 표시 데이터 제거 및 식별자만 저장

* refactor: SYSTEM 메시지 응답에서 content 키 제외 및 @Schema 설명 갱신

* test: SYSTEM 메시지 BSON 페이로드 키 부재 통합 테스트 가드

* docs: SYSTEM 메시지 페이로드 정리 결정 features.md/spec 반영

* docs: SYSTEM 메시지 MongoDB 문서 계약 정합성 보정

* refactor: members topic SYSTEM payload content 키 제외

* test: SYSTEM 메시지 content 키 부재 검증 보강

* test: 시스템 메시지 페이로드 테스트 보강
* refactor: 운영 DB 서버에서 PostgreSQL 제거 및 exporter 외부 연동 재설정

* chore: 운영 데이터 저장소 설정 강화

* chore: Caddy 요청 본문 크기 제한 추가

* docs: PR 기준 브랜치 전략 명시

* chore: 로컬 PostgreSQL Docker 헬스체크 타이밍 이슈 수정

- pg_isready 명령어에 -h localhost -p 5432를 추가하여 TCP 5432 포트 바인딩 완료 여부까지 검증하도록 개선

- 설계 사양서(spec) 및 구현 계획서(plan) 추가

* feat: MongoDB 메시지 인덱스 마이그레이션 추가

* docs: MongoDB 마이그레이션 관리 규칙 추가

* docs: PostGIS 제거 설계 문서 추가

* docs: PostGIS 제거 구현 계획서 추가

* chore: build.gradle에서 hibernate-spatial 의존성 제거

* chore: 로컬 및 테스트용 PostgreSQL 이미지를 postgres:17로 교체

* docs: 문서 내 PostGIS 및 Spatial 기술 스택 언급 제거

* chore: compose.db.dev.yaml에서 불필요한 platform: linux/amd64 설정 제거

* chore: PostgreSQL 및 MongoDB 버전을 17.10 및 8.0.21로 상세 고정
* docs: 약관 버전 파일 설계 추가

* docs: 약관 버전 파일 구현 계획 추가

* feat: 약관 원문을 버전별 파일로 보존

* fix: 약관 현재 버전 리소스 검증 보강

* docs: 약관 버전 파일 관리 방식 반영

* docs: 정책 시행일과 운영 제한 문구 정리

* chore : 설계 문서 삭제, 서비스상에서 필요하지않음

* fix: 약관 버전 검증 정규식 경고 제거
@coderabbitai

coderabbitai Bot commented Jun 9, 2026

Copy link
Copy Markdown

Important

Review skipped

Too many files!

This PR contains 200 files, which is 50 over the limit of 150.

To get a review, narrow the scope:
• coderabbit review --type committed # exclude uncommitted changes
• coderabbit review --dir # limit to a subdirectory
• coderabbit review --base # compare against a closer base

⚙️ Run configuration

Configuration used: Organization UI

Review profile: CHILL

Plan: Pro Plus

Run ID: 7f8bf214-e2dd-4275-9c85-6b7c90faa35b

📥 Commits

Reviewing files that changed from the base of the PR and between a7ac3b9 and 23572b4.

📒 Files selected for processing (200)
  • .claude/skills/create-issue/SKILL.md
  • .claude/skills/review-code-against-docs/SKILL.md
  • .env.db.example
  • .env.dev.example
  • .github/workflows/deploy-compose.yml
  • .github/workflows/deploy-db.yml
  • .serena/memories/project_overview.md
  • .serena/project.yml
  • AGENTS.md
  • CONTRIBUTING.md
  • LICENSE
  • README.md
  • build.gradle
  • compose.app.dev.yaml
  • compose.app.prod.yaml
  • compose.db.dev.yaml
  • compose.db.prod.yaml
  • compose.monitoring.prod.yaml
  • docs/ai/README.md
  • docs/ai/decisions/20260607-1636-system-message-metadata-rendering.md
  • docs/ai/decisions/20260607-user-withdrawal-soft-delete.md
  • docs/ai/decisions/20260608-1553-system-message-payload-cleanup.md
  • docs/ai/erd.md
  • docs/ai/features.md
  • docs/gstack/overview.md
  • docs/policy/copyright-policy.md
  • docs/policy/operation-policy.md
  • docs/policy/privacy-policy.md
  • docs/policy/terms-of-service.md
  • docs/superpowers/plans/2026-06-05-schedule-structure-events.md
  • docs/superpowers/plans/2026-06-07-pr-review-refactoring.md
  • docs/superpowers/plans/2026-06-07-rate-limit-photo-split.md
  • docs/superpowers/plans/2026-06-07-rate-limit-redesign.md
  • docs/superpowers/plans/2026-06-07-user-withdrawal.md
  • docs/superpowers/plans/2026-06-08-agreement-versioned-files.md
  • docs/superpowers/plans/2026-06-08-backend-agreements.md
  • docs/superpowers/plans/2026-06-08-mongo-message-payload.md
  • docs/superpowers/plans/2026-06-08-postgresql-docker-healthcheck.md
  • docs/superpowers/plans/2026-06-08-remove-postgis.md
  • docs/superpowers/plans/2026-06-08-room-member-left-status.md
  • docs/superpowers/specs/2026-06-05-room-dates-schedule-resync-design.md
  • docs/superpowers/specs/2026-06-07-user-withdrawal-design.md
  • docs/superpowers/specs/2026-06-08-agreement-versioned-files-design.md
  • docs/superpowers/specs/2026-06-08-backend-agreements-design.md
  • docs/superpowers/specs/2026-06-08-mongo-message-payload-design.md
  • docs/superpowers/specs/2026-06-08-postgresql-docker-healthcheck-design.md
  • docs/superpowers/specs/2026-06-08-remove-postgis-design.md
  • docs/superpowers/specs/2026-06-08-room-member-left-status-design.md
  • infra/caddy/Caddyfile
  • infra/monitoring/README.md
  • scripts/mongo/backfill-message-sequence.js
  • settings.gradle
  • src/main/java/com/howaboutus/backend/agreements/config/AgreementProperties.java
  • src/main/java/com/howaboutus/backend/agreements/controller/AgreementController.java
  • src/main/java/com/howaboutus/backend/agreements/controller/dto/AgreementCurrentResponse.java
  • src/main/java/com/howaboutus/backend/agreements/controller/dto/AgreementDocumentResponse.java
  • src/main/java/com/howaboutus/backend/agreements/service/AgreementService.java
  • src/main/java/com/howaboutus/backend/agreements/service/dto/AgreementDocumentResult.java
  • src/main/java/com/howaboutus/backend/agreements/service/dto/AgreementVersions.java
  • src/main/java/com/howaboutus/backend/ai/listener/AiSummaryTriggerListener.java
  • src/main/java/com/howaboutus/backend/ai/repository/AiContextQueryRepositoryImpl.java
  • src/main/java/com/howaboutus/backend/ai/service/AiRequestQueueWorker.java
  • src/main/java/com/howaboutus/backend/auth/controller/AuthController.java
  • src/main/java/com/howaboutus/backend/auth/controller/dto/GoogleLoginRequest.java
  • src/main/java/com/howaboutus/backend/auth/service/AuthService.java
  • src/main/java/com/howaboutus/backend/auth/service/RefreshTokenService.java
  • src/main/java/com/howaboutus/backend/bookmarks/controller/BookmarkController.java
  • src/main/java/com/howaboutus/backend/bookmarks/repository/BookmarkRepository.java
  • src/main/java/com/howaboutus/backend/bookmarks/service/BookmarkService.java
  • src/main/java/com/howaboutus/backend/common/cache/RedisBulkCacheAccessor.java
  • src/main/java/com/howaboutus/backend/common/config/AsyncConfig.java
  • src/main/java/com/howaboutus/backend/common/config/CachePolicy.java
  • src/main/java/com/howaboutus/backend/common/config/MongoMigrationConfig.java
  • src/main/java/com/howaboutus/backend/common/config/SecurityConfig.java
  • src/main/java/com/howaboutus/backend/common/config/properties/AsyncExecutorProperties.java
  • src/main/java/com/howaboutus/backend/common/config/properties/RateLimitProperties.java
  • src/main/java/com/howaboutus/backend/common/error/ErrorCode.java
  • src/main/java/com/howaboutus/backend/common/error/GlobalExceptionHandler.java
  • src/main/java/com/howaboutus/backend/common/migration/mongo/CreateMessageIndexesChangeUnit.java
  • src/main/java/com/howaboutus/backend/common/ratelimit/HttpRateLimitPolicyResolver.java
  • src/main/java/com/howaboutus/backend/common/utils/AsyncHelper.java
  • src/main/java/com/howaboutus/backend/messages/controller/dto/MessageResponse.java
  • src/main/java/com/howaboutus/backend/messages/document/ChatMessage.java
  • src/main/java/com/howaboutus/backend/messages/listener/HostDelegatedMessageListener.java
  • src/main/java/com/howaboutus/backend/messages/listener/MemberApprovedMessageListener.java
  • src/main/java/com/howaboutus/backend/messages/listener/MemberKickedMessageListener.java
  • src/main/java/com/howaboutus/backend/messages/listener/MemberLeftMessageListener.java
  • src/main/java/com/howaboutus/backend/messages/service/MessageService.java
  • src/main/java/com/howaboutus/backend/messages/service/SystemMessageService.java
  • src/main/java/com/howaboutus/backend/places/controller/PlaceController.java
  • src/main/java/com/howaboutus/backend/places/controller/dto/PlacePhotoBatchItemResponse.java
  • src/main/java/com/howaboutus/backend/places/controller/dto/PlacePhotoBatchRequest.java
  • src/main/java/com/howaboutus/backend/places/controller/dto/PlacePhotoBatchResponse.java
  • src/main/java/com/howaboutus/backend/places/controller/dto/PlacePhotoNameBatchItemResponse.java
  • src/main/java/com/howaboutus/backend/places/controller/dto/PlacePhotoNameBatchRequest.java
  • src/main/java/com/howaboutus/backend/places/controller/dto/PlacePhotoNameBatchResponse.java
  • src/main/java/com/howaboutus/backend/places/controller/dto/PlacePhotoResponse.java
  • src/main/java/com/howaboutus/backend/places/controller/dto/PlacePreviewBatchItemResponse.java
  • src/main/java/com/howaboutus/backend/places/controller/dto/PlacePreviewBatchRequest.java
  • src/main/java/com/howaboutus/backend/places/controller/dto/PlacePreviewBatchResponse.java
  • src/main/java/com/howaboutus/backend/places/service/PlacePhotoNameService.java
  • src/main/java/com/howaboutus/backend/places/service/PlacePhotoService.java
  • src/main/java/com/howaboutus/backend/places/service/PlacePreviewService.java
  • src/main/java/com/howaboutus/backend/places/service/dto/PlacePhotoBatchItemResult.java
  • src/main/java/com/howaboutus/backend/places/service/dto/PlacePhotoNameBatchItemResult.java
  • src/main/java/com/howaboutus/backend/places/service/dto/PlacePreviewBatchItemResult.java
  • src/main/java/com/howaboutus/backend/realtime/service/dto/MessagePayload.java
  • src/main/java/com/howaboutus/backend/realtime/service/dto/RoomMemberPayload.java
  • src/main/java/com/howaboutus/backend/rooms/controller/dto/RoomMemberResponse.java
  • src/main/java/com/howaboutus/backend/rooms/entity/MemberStatus.java
  • src/main/java/com/howaboutus/backend/rooms/entity/RoomMember.java
  • src/main/java/com/howaboutus/backend/rooms/repository/RoomMemberRepository.java
  • src/main/java/com/howaboutus/backend/rooms/repository/RoomRepository.java
  • src/main/java/com/howaboutus/backend/rooms/service/RoomAuthorizationService.java
  • src/main/java/com/howaboutus/backend/rooms/service/RoomInviteService.java
  • src/main/java/com/howaboutus/backend/rooms/service/RoomMemberService.java
  • src/main/java/com/howaboutus/backend/rooms/service/dto/RoomMemberResult.java
  • src/main/java/com/howaboutus/backend/schedules/controller/ScheduleController.java
  • src/main/java/com/howaboutus/backend/schedules/controller/ScheduleRouteController.java
  • src/main/java/com/howaboutus/backend/schedules/controller/dto/BatchRouteItemRequest.java
  • src/main/java/com/howaboutus/backend/schedules/controller/dto/BatchRouteItemResponse.java
  • src/main/java/com/howaboutus/backend/schedules/controller/dto/BatchRouteRequest.java
  • src/main/java/com/howaboutus/backend/schedules/controller/dto/BatchRouteResponse.java
  • src/main/java/com/howaboutus/backend/schedules/controller/dto/ScheduleResponse.java
  • src/main/java/com/howaboutus/backend/schedules/repository/ScheduleItemRepository.java
  • src/main/java/com/howaboutus/backend/schedules/repository/ScheduleRepository.java
  • src/main/java/com/howaboutus/backend/schedules/service/ScheduleItemService.java
  • src/main/java/com/howaboutus/backend/schedules/service/ScheduleService.java
  • src/main/java/com/howaboutus/backend/schedules/service/dto/RouteBatchItemCommand.java
  • src/main/java/com/howaboutus/backend/schedules/service/dto/RouteBatchItemResult.java
  • src/main/java/com/howaboutus/backend/schedules/service/dto/ScheduleWithItemsResult.java
  • src/main/java/com/howaboutus/backend/user/controller/UserAgreementController.java
  • src/main/java/com/howaboutus/backend/user/controller/UserController.java
  • src/main/java/com/howaboutus/backend/user/controller/dto/AcceptAgreementsRequest.java
  • src/main/java/com/howaboutus/backend/user/entity/User.java
  • src/main/java/com/howaboutus/backend/user/event/UserWithdrawnEvent.java
  • src/main/java/com/howaboutus/backend/user/exception/HostDelegationRequiredException.java
  • src/main/java/com/howaboutus/backend/user/listener/UserWithdrawnTokenListener.java
  • src/main/java/com/howaboutus/backend/user/service/UserService.java
  • src/main/java/com/howaboutus/backend/user/service/UserWithdrawalService.java
  • src/main/java/com/howaboutus/backend/user/service/dto/RoomRequiringDelegation.java
  • src/main/java/com/howaboutus/backend/user/service/dto/WithdrawalBlockedResponse.java
  • src/main/resources/agreements/privacy-policy/1.0.md
  • src/main/resources/agreements/terms-of-service/1.0.md
  • src/main/resources/application-prod.yaml
  • src/main/resources/application.yaml
  • src/main/resources/db/migration/V1.7__users_withdrawal.sql
  • src/main/resources/db/migration/V1.8__room_members_status.sql
  • src/main/resources/db/migration/V1.9__add_user_agreements.sql
  • src/test/java/com/howaboutus/backend/agreements/controller/AgreementControllerTest.java
  • src/test/java/com/howaboutus/backend/agreements/service/AgreementServiceTest.java
  • src/test/java/com/howaboutus/backend/ai/service/AiSummaryServiceTest.java
  • src/test/java/com/howaboutus/backend/auth/AuthIntegrationTest.java
  • src/test/java/com/howaboutus/backend/auth/controller/AuthControllerTest.java
  • src/test/java/com/howaboutus/backend/auth/service/AuthServiceTest.java
  • src/test/java/com/howaboutus/backend/auth/service/RefreshTokenServiceInvalidateAllForUserTest.java
  • src/test/java/com/howaboutus/backend/bookmarks/BookmarkIntegrationTest.java
  • src/test/java/com/howaboutus/backend/bookmarks/controller/BookmarkControllerTest.java
  • src/test/java/com/howaboutus/backend/bookmarks/service/BookmarkServiceTest.java
  • src/test/java/com/howaboutus/backend/common/config/AsyncConfigTest.java
  • src/test/java/com/howaboutus/backend/common/config/ProdDatabaseConfigTest.java
  • src/test/java/com/howaboutus/backend/common/error/GlobalExceptionHandlerTest.java
  • src/test/java/com/howaboutus/backend/common/migration/MongoMessageIndexMigrationTest.java
  • src/test/java/com/howaboutus/backend/common/ratelimit/HttpRateLimitPolicyResolverTest.java
  • src/test/java/com/howaboutus/backend/messages/controller/MessageControllerTest.java
  • src/test/java/com/howaboutus/backend/messages/document/SystemMessagePayloadIntegrationTest.java
  • src/test/java/com/howaboutus/backend/messages/listener/HostDelegatedMessageListenerTest.java
  • src/test/java/com/howaboutus/backend/messages/listener/MemberApprovedMessageListenerTest.java
  • src/test/java/com/howaboutus/backend/messages/listener/MemberKickedMessageListenerTest.java
  • src/test/java/com/howaboutus/backend/messages/listener/MemberLeftMessageListenerTest.java
  • src/test/java/com/howaboutus/backend/messages/service/MessageRateLimiterTest.java
  • src/test/java/com/howaboutus/backend/messages/service/MessageServiceTest.java
  • src/test/java/com/howaboutus/backend/messages/service/SystemMessageServiceTest.java
  • src/test/java/com/howaboutus/backend/places/controller/PlaceControllerTest.java
  • src/test/java/com/howaboutus/backend/places/service/PlaceDetailCachingTest.java
  • src/test/java/com/howaboutus/backend/places/service/PlacePhotoCachingTest.java
  • src/test/java/com/howaboutus/backend/places/service/PlacePhotoServiceTest.java
  • src/test/java/com/howaboutus/backend/realtime/service/RoomMemberBroadcasterTest.java
  • src/test/java/com/howaboutus/backend/realtime/service/RoomMessageBroadcasterTest.java
  • src/test/java/com/howaboutus/backend/rooms/controller/RoomControllerTest.java
  • src/test/java/com/howaboutus/backend/rooms/entity/RoomMemberTest.java
  • src/test/java/com/howaboutus/backend/rooms/repository/RoomMemberRepositoryWithdrawalTest.java
  • src/test/java/com/howaboutus/backend/rooms/repository/RoomMemberStatusConstraintTest.java
  • src/test/java/com/howaboutus/backend/rooms/service/RoomAuthorizationServiceTest.java
  • src/test/java/com/howaboutus/backend/rooms/service/RoomInviteServiceTest.java
  • src/test/java/com/howaboutus/backend/rooms/service/RoomMemberServiceTest.java
  • src/test/java/com/howaboutus/backend/schedules/ScheduleIntegrationTest.java
  • src/test/java/com/howaboutus/backend/schedules/controller/ScheduleControllerTest.java
  • src/test/java/com/howaboutus/backend/schedules/controller/ScheduleRouteControllerTest.java
  • src/test/java/com/howaboutus/backend/schedules/service/ScheduleItemServiceTest.java
  • src/test/java/com/howaboutus/backend/schedules/service/ScheduleServiceTest.java
  • src/test/java/com/howaboutus/backend/support/BaseIntegrationTest.java
  • src/test/java/com/howaboutus/backend/user/UserWithdrawalIntegrationTest.java
  • src/test/java/com/howaboutus/backend/user/controller/UserAgreementControllerTest.java
  • src/test/java/com/howaboutus/backend/user/controller/UserControllerTest.java
  • src/test/java/com/howaboutus/backend/user/controller/UserWithdrawalControllerTest.java
  • src/test/java/com/howaboutus/backend/user/entity/UserTest.java
  • src/test/java/com/howaboutus/backend/user/listener/UserWithdrawnTokenListenerTest.java
  • src/test/java/com/howaboutus/backend/user/service/UserServiceTest.java
  • src/test/java/com/howaboutus/backend/user/service/UserWithdrawalServiceTest.java

You can disable this status message by setting the reviews.review_status to false in the CodeRabbit configuration file.

Use the checkbox below for a quick retry:

  • 🔍 Trigger review

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.

@parkjuyeong0312 parkjuyeong0312 merged commit 8175543 into main Jun 9, 2026
2 checks passed
@sonarqubecloud

sonarqubecloud Bot commented Jun 9, 2026

Copy link
Copy Markdown

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants