feat: 회원 탈퇴/약관 동의/방 멤버 LEFT 상태/벌크 조회 등 dev 누적분 반영 (dev → main)#142
Conversation
* 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: 약관 버전 검증 정규식 경고 제거
|
Important Review skippedToo many files! This PR contains 200 files, which is 50 over the limit of 150. To get a review, narrow the scope: ⚙️ Run configurationConfiguration used: Organization UI Review profile: CHILL Plan: Pro Plus Run ID: 📒 Files selected for processing (200)
You can disable this status message by setting the Use the checkbox below for a quick retry:
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. Comment |
|



변경 내용
UserWithdrawalService,UserWithdrawnTokenListener,WithdrawalBlockedResponse추가 및 호스트 위임 필수 검증V1.7__users_withdrawal.sql마이그레이션,User엔티티 soft-delete 컬럼 도입MemberStatus.LEFT로 전이,V1.8__room_members_status.sql적용RoomMemberRepository쿼리/제약,RoomInviteService/RoomMemberService흐름 정비AgreementService,UserAgreementController,V1.9__add_user_agreements.sqlsrc/main/resources/agreements/*/1.0.md) 번들링 및 API 명세docs/policy/*)와 번들 약관 파일 동기화 규칙 정리PlacePhotoBatch*,PlacePhotoNameBatch*,PlacePreviewBatch*,BatchRoute*DTO/서비스/컨트롤러 신설AsyncConfig,AsyncHelper,AsyncExecutorProperties도입으로 가상 스레드 기반 fan-outRedisBulkCacheAccessor로 캐시 배치 조회 일원화SystemMessageService/MessageService/리스너의 메타데이터 저장 형식 통일, MongoDB 인덱스 ChangeUnit(CreateMessageIndexesChangeUnit) 추가compose.db.prod.yaml,application-prod.yaml,.env.db.example정리 — 운영은 외부 PostgreSQL 사용uttae로 변경 (chore: GitHub Actions 이미지 경로 동적화 및 프로젝트명/서비스명 uttae로 변경 #133), create-issue 스킬 repo 경로 갱신 (chore: create-issue 스킬의 repo 경로를 uttae 조직으로 갱신 #136)변경 이유
테스트
./gradlew build(각 feature PR 머지 시점에 통과 확인)/review-code-against-docs스킬로 검증 — 각 PR 단위로 수행 완료체크리스트
하네스 변경 체크리스트