Skip to content

feat: room_members 에 LEFT 상태 도입 (방 나가기/추방 시 row 유지)#134

Merged
parkjuyeong0312 merged 20 commits into
devfrom
feature/room-member-status
Jun 8, 2026
Merged

feat: room_members 에 LEFT 상태 도입 (방 나가기/추방 시 row 유지)#134
parkjuyeong0312 merged 20 commits into
devfrom
feature/room-member-status

Conversation

@parkjuyeong0312

@parkjuyeong0312 parkjuyeong0312 commented Jun 8, 2026

Copy link
Copy Markdown
Member

변경 내용

  • room_membersstatus (ACTIVE/LEFT) + left_at 컬럼 도입 (V1.8 마이그레이션, CHECK 제약 3종 + 인덱스 추가)
  • 방 나가기(leave) / 추방(kick)을 hard delete → status=LEFT 전환으로 변경
  • requireActiveMember 가드 강화: status=ACTIVE 만 멤버로 인정 (LEFT는 비멤버 차단)
  • 활성 멤버 조회 쿼리에 status=ACTIVE 필터 일괄 적용
  • requestJoin 이 LEFT row 를 PENDING 으로 UPSERT (재입장 지원)
  • GET /rooms/{id}/members 응답이 LEFT 멤버까지 노출 + online=false 강제 (과거 메시지 닉네임/프로필 렌더링용)
  • RoomMemberResponsestatus 필드 노출
  • AI 컨텍스트 조회에서 LEFT 멤버 제외
  • 회원 탈퇴 시 LEFT 멤버십도 hard delete 되도록 회귀 테스트 추가
  • 회원 탈퇴와 입장 승인 사이의 race 차단 (정렬된 락 + revalidate)
  • 탈퇴 시 익명화 누락을 DB CHECK 로 강제 (DROP CONSTRAINT 방어 포함)
  • SYSTEM 메시지 metadata 기반 렌더링 계약 문서화 (decisions)
  • ERD/spec 의 TIMESTAMP 표기를 실제 DDL 에 맞춰 TIMESTAMP WITH TIME ZONE 으로 통일
  • docs/ai/erd.md, docs/ai/features.md 갱신 + 설계 문서(docs/superpowers/specs|plans) 추가

변경 이유

  • 기존에는 leave/kick 시 room_members row 를 hard delete 하여, 클라이언트가 과거 메시지의 작성자 닉네임/프로필을 표시할 수 없었음.
  • 회원 탈퇴(hard delete)와 단순 방 나가기/추방의 의미를 데이터 모델 수준에서 구분하기 위해 status=LEFT 도입.
  • 채팅 UI 의 과거 메시지 렌더링을 단일 GET /rooms/{id}/members 호출로 해결.
  • 부수적으로 발견된 탈퇴-입장승인 race, 익명화 누락 가능성, SYSTEM 메시지 metadata 계약 미명문화 문제를 함께 정리.

테스트

  • ./gradlew build (Checkstyle 포함)
  • /review-code-against-docs 스킬로 검증 (구조/컨벤션/스펙/ERD 정합성)
  • V1.8 CHECK 제약(LEFT/left_at/PENDING) 회귀 테스트
  • 탈퇴 시 LEFT 멤버십도 hard delete 회귀 테스트
  • RoomMember 도메인 메서드(leave/kicked/rejoinAsPending) 단위 테스트
  • RoomAuthorizationService LEFT 차단 단위 테스트
  • RoomInviteService LEFT → PENDING 부활 단위 테스트
  • RoomMemberService leave/kick LEFT 전환 + 중복 이벤트 차단 단위 테스트
  • UserWithdrawalService LEFT 멤버십 hard delete 통합 테스트

체크리스트

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

하네스 변경 체크리스트

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

Summary by CodeRabbit

Release Notes

  • New Features

    • 시스템 메시지(멤버 추가, 방 나감, 호스트 위임 등) 렌더링 방식을 클라이언트 기반으로 통일하여 더 일관된 표시 제공
    • 방에서 나간 멤버 정보를 보존하여 과거 메시지 맥락을 명확히 유지
  • Documentation

    • 시스템 메시지, 사용자 탈퇴, 멤버 상태 관리 설계 문서 추가
  • Refactor

    • 데이터베이스 무결성 제약 강화로 사용자 탈퇴 시 개인정보 보호 개선
    • 멤버 상태 관리 로직 개선

탈퇴 사용자의 SYSTEM 메시지 본문이 옛 닉네임으로 굳는 비일관 문제를
백엔드 데이터 변경 없이 클라이언트 재렌더링으로 해결한다는 결정을 ADR로 기록하고,
MessagePayload와 MessageResponse의 content/metadata Schema 설명을 보강해
프론트가 metadata.eventType + userId 기반으로 본문을 조립한다는 계약을
Swagger/Springwolf 명세에 노출한다.
모든 마이그레이션이 TIMESTAMP WITH TIME ZONE으로 컬럼을 생성하는데
ERD와 user-withdrawal spec은 짧은 TIMESTAMP로 표기되어 있어 운영/개발 해석에
혼선이 생길 수 있었다. erd.md 16개 라인과 spec의 ALTER 예시를 실제 DDL과
1:1로 정렬한다.
호스트 본인이 PENDING 입장 승인과 본인 탈퇴를 동시에 발사하면
READ COMMITTED 스냅샷 차이로 솔로 호스트 방 판단 → HOST 멤버십만 삭제 →
호스트 없는 활성 방(orphan room)이 남는 시나리오가 가능했다.

withdraw 트랜잭션 시작 시 본인이 HOST인 모든 Room을 PESSIMISTIC_WRITE로 잠그고,
approve 트랜잭션 시작 시에도 Room을 findByIdForUpdate로 잡아
두 트랜잭션이 같은 Room 행을 두고 직렬화되도록 한다.
기존 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/결정 기록도 동일 정책으로 동기화.
@coderabbitai

coderabbitai Bot commented Jun 8, 2026

Copy link
Copy Markdown

Review Change Stack

📝 Walkthrough

워크스루(Walkthrough)

사용자 탈퇴를 soft delete로, 방 멤버 떠나기/추방을 상태 전이(LEFT)로 관리하는 라이프사이클 통합 변경. 정책 문서, DB 마이그레이션, 도메인 모델(MemberStatus enum, RoomMember 메서드), 리포지토리 쿼리, 서비스 계층(권한, 멤버 관리, 초대), API 응답 계약, 테스트를 포괄적으로 구현합니다.

변경 사항

Room Member LEFT 상태 및 User 탈퇴 통합

Layer / File(s) 요약
정책 정의 및 설계 문서
docs/ai/decisions/*, docs/superpowers/specs/*, docs/superpowers/plans/*
탈퇴 soft delete(deleted_at), LEFT 상태 도입, SYSTEM 메시지 메타데이터 렌더링, 마이그레이션 전략, 도메인 메서드, 쿼리 필터, 테스트 계획, API 응답 규칙을 신규 작성 또는 갱신하는 의사결정/설계 문서.
데이터베이스 스키마 마이그레이션 및 ERD
src/main/resources/db/migration/V1.7__users_withdrawal.sql, src/main/resources/db/migration/V1.8__room_members_status.sql, docs/ai/erd.md
users에 deleted_at 컬럼 및 users_active_required CHECK 제약, room_members에 status/left_at 컬럼 및 무결성 CHECK 제약 추가. ERD 타임스탬프 타입 정규화.
도메인 모델: MemberStatus enum 및 RoomMember 엔티티
src/main/java/.../rooms/entity/MemberStatus.java, src/main/java/.../rooms/entity/RoomMember.java
MemberStatus.ACTIVE/LEFT enum 신규 생성. RoomMember에 status/leftAt 필드 추가, leave()/kicked()/rejoinAsPending() 도메인 메서드 구현, approve/promote/demote에 ACTIVE 가드 추가.
Repository 계층: 쿼리 필터링 및 신규 메서드
src/main/java/.../rooms/repository/RoomMemberRepository.java, src/main/java/.../rooms/repository/RoomRepository.java
RoomMemberRepository 조회 메서드를 JPQL로 명시화하여 status=ACTIVE 필터 일괄 적용, findVisibleMembers(roomId) 신규 메서드 추가. 호스트 룸 조회 서브쿼리에 ACTIVE 조건 추가. RoomRepository에 비관적 잠금 메서드 lockHostRoomsByUser 추가.
권한 검증 강화: LEFT 멤버 차단
src/main/java/.../rooms/service/RoomAuthorizationService.java
RoomAuthorizationService.requireActiveMember에서 LEFT 상태를 비멤버로 취급하고 NOT_ROOM_MEMBER 예외 발생.
멤버 서비스: leave/kick/getMembers 재구현
src/main/java/.../rooms/service/RoomMemberService.java
leave()/kick()을 hard delete 대신 status=LEFT 전이로 변경. getMembers()가 findVisibleMembers() 기반으로 LEFT 포함, LEFT는 online=false 강제, MEMBER_DISPLAY_ORDER 정렬 적용. delegateHost에서 LEFT 대상 예외 추가.
초대/참여 서비스: LEFT 멤버 부활
src/main/java/.../rooms/service/RoomInviteService.java
RoomInviteService.requestJoin에서 LEFT 멤버 재신청 시 rejoinAsPending() 부활, JoinRequestedEvent 발행. getJoinStatus에서 LEFT 상태 예외. approve에서 비관적 잠금 추가.
사용자 탈퇴 서비스: host 잠금
src/main/java/.../user/service/UserWithdrawalService.java
UserWithdrawalService.withdraw에서 lockHostRoomsByUser로 HOST 방 비관적 잠금. deleteRemainingMemberships에서 ACTIVE 멤버만 MemberLeftEvent 발행, LEFT는 hard delete만 수행.
AI 컨텍스트: ACTIVE 필터링
src/main/java/.../ai/repository/AiContextQueryRepositoryImpl.java
countApprovedParticipants에 status=ACTIVE 필터 추가, LEFT 멤버 제외.
API 응답 계약: DTO 및 Swagger
src/main/java/.../rooms/controller/dto/RoomMemberResponse.java, src/main/java/.../rooms/service/dto/RoomMemberResult.java, src/main/java/.../messages/controller/dto/MessageResponse.java, src/main/java/.../realtime/service/dto/MessagePayload.java
RoomMemberResponse/RoomMemberResult에 MemberStatus status 필드 추가. MessageResponse/MessagePayload Swagger 설명 갱신: SYSTEM 메시지 fallback, metadata 기반 렌더링, LEFT 멤버 닉네임 조회 규칙 명시.
기능 명세 문서
docs/ai/features.md
회원 탈퇴, 방 멤버 목록 조회, 멤버 추방/방 나가기 섹션 갱신: LEFT 포함 노출, online 강제 false, AI 컨텍스트 제외, 닉네임 조회 규칙.
엔티티 테스트
src/test/java/.../rooms/entity/RoomMemberTest.java, src/test/java/.../rooms/repository/RoomMemberStatusConstraintTest.java
leave()/kicked()/rejoinAsPending() 동작, LEFT 상태 권한 가드, 초기 상태 검증, DB CHECK 제약 통합 테스트 추가.
서비스 테스트
src/test/java/.../rooms/service/RoomAuthorizationServiceTest.java, src/test/java/.../rooms/service/RoomMemberServiceTest.java, src/test/java/.../rooms/service/RoomInviteServiceTest.java, src/test/java/.../user/service/UserWithdrawalServiceTest.java
LEFT 멤버 권한 거부, leave/kick 상태 전이, LEFT 멤버 offline 강제, 정렬/예외 처리, LEFT 멤버 부활/재신청, 탈퇴 시 hard delete 및 이벤트 관리 테스트 추가.
컨트롤러 테스트
src/test/java/.../rooms/controller/RoomControllerTest.java
RoomMemberResult 생성 시 MemberStatus.ACTIVE 포함, JSON 응답의 members[].status 필드 검증.

예상 코드 리뷰 난이도

🎯 4 (Complex) | ⏱️ ~60 minutes

🐰 Left와 Active, 서로 다른 길을 가며
데이터는 영원히, 상태만 바뀌네
DELETE는 이제 안녕, STATUS 차이로 말해요
방을 나가도 흔적은 남아있고, 🏠✨
새로 들어올 손을 기다리는 빈 자리

🚥 Pre-merge checks | ✅ 4
✅ Passed checks (4 passed)
Check name Status Explanation
Title check ✅ Passed PR 제목이 커밋 컨벤션 형식을 따르고, 주요 변경 내용(room_members에 LEFT 상태 도입)을 명확하게 요약하고 있다.
Description check ✅ Passed PR 설명이 변경 내용, 변경 이유, 테스트, 체크리스트를 모두 포함하여 템플릿을 충실히 따르고 있다.
Linked Issues check ✅ Passed Check skipped because no linked issues were found for this pull request.
Out of Scope Changes check ✅ Passed Check skipped because no linked issues were found for this pull request.

✏️ Tip: You can configure your own custom pre-merge checks in the settings.


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.

@sonarqubecloud

sonarqubecloud Bot commented Jun 8, 2026

Copy link
Copy Markdown

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 1

🧹 Nitpick comments (2)
src/main/java/com/howaboutus/backend/rooms/repository/RoomRepository.java (1)

24-34: ⚡ Quick win

잠금 대상은 ACTIVE HOST로 한정하는 게 안전합니다.

Line 30 조건에 m.status = ACTIVE가 없어 비활성/이상 데이터까지 잠글 수 있습니다. 불필요한 잠금 경쟁을 줄이려면 ACTIVE 필터를 같이 두는 편이 좋습니다.

🔧 제안 수정
         where r.id in (
             select m.room.id from RoomMember m
             where m.user.id = :userId
               and m.role = com.howaboutus.backend.rooms.entity.RoomRole.HOST
+              and m.status = com.howaboutus.backend.rooms.entity.MemberStatus.ACTIVE
         )
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@src/main/java/com/howaboutus/backend/rooms/repository/RoomRepository.java`
around lines 24 - 34, The query in lockHostRoomsByUser currently locks rooms for
any host membership state; restrict the lock to only active host memberships by
adding an ACTIVE status predicate to the inner where clause (e.g., add "and
m.status = com.howaboutus.backend.rooms.entity.RoomMemberStatus.ACTIVE"
alongside "m.role = com.howaboutus.backend.rooms.entity.RoomRole.HOST") so the
method lockHostRoomsByUser only locks rooms where the RoomMember m is both HOST
and ACTIVE.
docs/ai/features.md (1)

57-57: ⚡ Quick win

메인 기능 명세는 짧게 유지하고 상세 규칙은 분리 문서로 링크해 주세요.

Line 57, Line 83~85는 구현 상세가 과도하게 길어져 표 가독성이 떨어집니다. 기능 표에는 핵심 요약만 두고, 상세 정책(LEFT 노출/online 강제/탈퇴 표시 규칙)은 docs/ai/decisions/* 또는 별도 docs/ai/* 문서로 분리해 참조하는 편이 좋습니다.

As per coding guidelines, "**/*.md: Split detailed explanations into separate documents under docs/ai/, keeping this main file brief with only 'when to read which document' references".

✂️ 예시 축약안
-| `[x]` | 회원 탈퇴 | `DELETE /users/me`. users는 soft delete + 익명화(email/nickname/profile/provider/provider_id NULL, deleted_at 설정), room_members는 ACTIVE/LEFT 무관하게 hard delete. HOST 방은 사전 위임 필요(422 + roomsRequiringDelegation), 1인 HOST 방은 자동 hard delete. Redis RTK는 AFTER_COMMIT에서 일괄 폐기. 채팅/북마크/일정의 BIGINT 작성자 ID는 유지. 클라이언트는 `GET /rooms/{id}/members` 응답(ACTIVE + LEFT 모두 포함)에서 닉네임/프로필을 조회하고, 그래도 members에 없는 ID는 **회원 탈퇴자**이며 "(알 수 없음)"으로 표시 | users, room_members, Redis |
+| `[x]` | 회원 탈퇴 | `DELETE /users/me`. users soft delete+익명화, room_members hard delete. 작성자 표시/멤버 매핑 상세 규칙은 `docs/ai/decisions/20260607-user-withdrawal-soft-delete.md` 참조 | users, room_members, Redis |

-| `[x]` | 방 멤버 목록 조회 | 방 참여자 목록 + 역할(HOST/MEMBER) + 상태(ACTIVE/LEFT) + 접속 상태. LEFT 멤버는 닉네임/프로필 조회용으로 함께 반환되며 `online`은 항상 false. AI 컨텍스트에서는 LEFT 멤버 제외 | room_members |
+| `[x]` | 방 멤버 목록 조회 | 역할/상태/접속 상태를 조회(LEFT 포함, LEFT online=false). 상세 계약은 관련 결정 문서 참조 | room_members |

Also applies to: 83-85

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@docs/ai/features.md` at line 57, The table row for "회원 탈퇴" is too detailed
and harms readability; extract the implementation-specific rules
(soft-delete/익명화 details, room_members hard delete rules, HOST delegation/422
behavior, Redis AFTER_COMMIT eviction, LEFT/ACTIVE exposure and withdrawn-member
display rules) into a separate decision doc (e.g., a member-deletion policy
under the AI docs) and replace the cell in docs/ai/features.md with a short
summary mentioning only the key action and endpoints ("회원 탈퇴 — DELETE
/users/me", "GET /rooms/{id}/members") plus a single-line pointer to the new
policy; retain the important identifiers (users, room_members, Redis, GET
/rooms/{id}/members, DELETE /users/me) so reviewers can find the full rules in
the new document.

Source: Coding guidelines

🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

Inline comments:
In `@src/main/java/com/howaboutus/backend/rooms/entity/RoomMember.java`:
- Around line 121-135: The leave() and kicked() transitions in RoomMember
currently only check status and can set members with role == PENDING to LEFT,
violating the DB constraint ck_room_members_left_role; update the domain to
prevent PENDING→LEFT by adding a guard in RoomMember.leave() and
RoomMember.kicked() that throws or returns if this.role == MemberRole.PENDING,
or alternatively implement a separate cancel/decline transition (e.g.,
cancelPending()) that handles PENDING members without setting status to LEFT and
sets an appropriate status/timestamp, ensuring the domain invariant matches the
DB constraint (refer to RoomMember.status, RoomMember.role, MemberStatus and the
ck_room_members_left_role constraint).

---

Nitpick comments:
In `@docs/ai/features.md`:
- Line 57: The table row for "회원 탈퇴" is too detailed and harms readability;
extract the implementation-specific rules (soft-delete/익명화 details, room_members
hard delete rules, HOST delegation/422 behavior, Redis AFTER_COMMIT eviction,
LEFT/ACTIVE exposure and withdrawn-member display rules) into a separate
decision doc (e.g., a member-deletion policy under the AI docs) and replace the
cell in docs/ai/features.md with a short summary mentioning only the key action
and endpoints ("회원 탈퇴 — DELETE /users/me", "GET /rooms/{id}/members") plus a
single-line pointer to the new policy; retain the important identifiers (users,
room_members, Redis, GET /rooms/{id}/members, DELETE /users/me) so reviewers can
find the full rules in the new document.

In `@src/main/java/com/howaboutus/backend/rooms/repository/RoomRepository.java`:
- Around line 24-34: The query in lockHostRoomsByUser currently locks rooms for
any host membership state; restrict the lock to only active host memberships by
adding an ACTIVE status predicate to the inner where clause (e.g., add "and
m.status = com.howaboutus.backend.rooms.entity.RoomMemberStatus.ACTIVE"
alongside "m.role = com.howaboutus.backend.rooms.entity.RoomRole.HOST") so the
method lockHostRoomsByUser only locks rooms where the RoomMember m is both HOST
and ACTIVE.
🪄 Autofix (Beta)

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: Organization UI

Review profile: CHILL

Plan: Pro Plus

Run ID: 3356d00b-cc8f-4ed3-8510-e6ec9a8b7e80

📥 Commits

Reviewing files that changed from the base of the PR and between 69a7855 and 94a7a76.

📒 Files selected for processing (29)
  • docs/ai/decisions/20260607-1636-system-message-metadata-rendering.md
  • docs/ai/decisions/20260607-user-withdrawal-soft-delete.md
  • docs/ai/erd.md
  • docs/ai/features.md
  • docs/superpowers/plans/2026-06-08-room-member-left-status.md
  • docs/superpowers/specs/2026-06-07-user-withdrawal-design.md
  • docs/superpowers/specs/2026-06-08-room-member-left-status-design.md
  • src/main/java/com/howaboutus/backend/ai/repository/AiContextQueryRepositoryImpl.java
  • src/main/java/com/howaboutus/backend/messages/controller/dto/MessageResponse.java
  • src/main/java/com/howaboutus/backend/realtime/service/dto/MessagePayload.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/user/service/UserWithdrawalService.java
  • src/main/resources/db/migration/V1.7__users_withdrawal.sql
  • src/main/resources/db/migration/V1.8__room_members_status.sql
  • 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/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/user/service/UserWithdrawalServiceTest.java

Comment thread src/main/java/com/howaboutus/backend/rooms/entity/RoomMember.java
@parkjuyeong0312 parkjuyeong0312 merged commit acd8a9a into dev Jun 8, 2026
5 checks passed
@parkjuyeong0312 parkjuyeong0312 deleted the feature/room-member-status branch June 8, 2026 02:28
@parkjuyeong0312 parkjuyeong0312 restored the feature/room-member-status branch June 8, 2026 02:28
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.

1 participant