Skip to content

[REFACTOR] 채팅 도메인 요구사항 반영#201

Merged
Be-HinD merged 3 commits intomainfrom
refactor/chat
Jan 3, 2026
Merged

[REFACTOR] 채팅 도메인 요구사항 반영#201
Be-HinD merged 3 commits intomainfrom
refactor/chat

Conversation

@Be-HinD
Copy link
Member

@Be-HinD Be-HinD commented Jan 3, 2026

📝 Pull Request

📌 PR 종류

해당하는 항목에 체크해주세요.

  • 기능 추가 (Feature)
  • 버그 수정 (Fix)
  • 문서 수정 (Docs)
  • 코드 리팩터링 (Refactor)
  • 테스트 추가 (Test)
  • 기타 변경 (Chore)

✨ 변경 내용

이번 PR에서 어떤 변경이 이루어졌는지 명확하게 작성해주세요.
아래와 같은 요구사항 및 변경점 있습니다.

  • 채팅방 목록 조회 썸네일 필드 추가

    • thumbnail 필드 추가
    • resolveThumbnail 메서드 추가
    • groupImageV2Repository.findAllByGroupIdWithVariants 메서드 재활용 (THUMBNAIL_100_100 타입 활용)
    • dm의 경우 상대방 프로필 이미지
  • 채팅방 상세 조회 시 방장을 나타내는 필드 추가

    • group의 hostId 활용
  • 채팅방 목록 조회 시 최근 메시지 순 정렬

    • lastMessage의 date 활용
  • 모임 조회 시 해당 채팅방 ID도 함께 전달

    • 필드 추가 : chatRoomId
  • 모임 승인제 채팅방 참여 이벤트 추가

    • Event : GroupJoinApprovedEvent
  • 모임 추방 시 채팅방 탈퇴 이벤트 추가

    • Event : GroupJoinKickedEvent

🔍 관련 이슈

해당 PR이 해결하는 이슈가 있다면 연결해주세요.


🧪 테스트

변경된 기능에 대한 테스트 범위 또는 테스트 결과를 작성해주세요.

  • 유닛 테스트 추가 / 수정
  • 통합 테스트 검증
  • 수동 테스트 완료

클라이언트 통합 테스트 진행 예정


🚨 확인해야 할 사항 (Checklist)

PR을 제출하기 전에 아래 항목들을 확인해주세요.

  • 코드 포매팅 완료
  • 불필요한 파일/코드 제거
  • 로직 검증 완료
  • 프로젝트 빌드 성공
  • 린트/정적 분석 통과 (해당 시)

🙋 기타 참고 사항

리뷰어가 참고하면 좋을 만한 추가 설명이 있다면 적어주세요.

Summary by CodeRabbit

  • 새 기능
    • 채팅방에 썸네일 이미지 표시 추가(그룹 채팅 및 1:1)
    • 참여자 목록에 소유자(호스트) 표시
    • 채팅방 목록을 최신 메시지 기준 내림차순 정렬 개선
  • 동작 개선
    • 그룹 가입 승인/강제 퇴출 이벤트에 따른 채팅방 자동 가입/제거 처리 추가

✏️ Tip: You can customize this high-level summary in your review settings.

- 채팅방 목록 조회 시 썸네일 필드 추가
- 채팅방 상세 조회 시 방장을 나타내는 필드 추가
- 채팅방 목록 조회 시 최근 메시지 순 정렬 적용
@Be-HinD Be-HinD self-assigned this Jan 3, 2026
@Be-HinD Be-HinD added the ✨enhancement New feature or request label Jan 3, 2026
@coderabbitai
Copy link

coderabbitai bot commented Jan 3, 2026

Walkthrough

채팅 응답 DTO들에 썸네일 필드와 참여자 소유자 플래그를 추가하고, ChatRoomService에 그룹/DM 썸네일 해석 및 호스트 기반 소유권 판별 로직을 도입했습니다. 이벤트 리스너에 그룹 가입 승인/강제 퇴장 처리 핸들러가 추가되었습니다.

Changes

Cohort / File(s) 변경 요약
채팅 응답 DTO 확장
\src/main/java/team/wego/wegobackend/chat/application/dto/response/ChatRoomItemResponse.java`, `src/main/java/team/wego/wegobackend/chat/application/dto/response/ChatRoomResponse.java`, `src/main/java/team/wego/wegobackend/chat/application/dto/response/ParticipantResponse.java``
ChatRoomItemResponse, ChatRoomResponseString thumbnail 필드 추가 및 factory(of) 시그니처 확장. ParticipantResponseboolean isOwner 추가 및 from(...) 시그니처 변경.
채팅 서비스 로직 변경
\src/main/java/team/wego/wegobackend/chat/application/service/ChatRoomService.java`*`
GroupImageV2Repository 주입, resolveThumbnail(ChatRoom, Long)isOwner(ChatParticipant, Long) 헬퍼 추가. 참가자 매핑에 isOwner 반영, 응답 생성에 thumbnail 포함, getMyChatRooms 정렬(최신 메시지 우선) 적용.
도메인 헬퍼 메서드
\src/main/java/team/wego/wegobackend/chat/domain/entity/ChatRoom.java``
isHost(User)getHostId() 공개 헬퍼 추가(그룹 호스트 판별/호스트 ID 반환).
이벤트 리스너 확장
\src/main/java/team/wego/wegobackend/chat/application/listener/ChatEventListener.java``
GroupJoinApprovedEvent, GroupJoinKickedEvent 처리기 추가 (@EventListener, @Async).
유저 엔티티 및 테스트 변경
\src/main/java/team/wego/wegobackend/user/domain/User.java`, `src/test/java/team/wego/wegobackend/group/*``
followings/followers@Builder.Default 추가. 테스트에서 new User(...)User.createLocalUser(...) 팩토리 사용으로 변경.
그룹 V2 DTO/서비스 변경
\src/main/java/team/wego/wegobackend/group/v2/application/dto/response/GetGroupV2Response.java`, `src/main/java/team/wego/wegobackend/group/v2/application/service/GroupV2Service.java``
GetGroupV2ResponsechatRoomId 필드 추가 및 factory 시그니처 변경; GroupV2Service에서 chatRoomId 계산 및 전달.
설정/댓글만 변경
\src/main/java/team/wego/wegobackend/chat/config/StompChannelInterceptor.java``
preSend에 SUBSCRIBE 관련 TODO 주석 추가(기능 변경 없음).

Sequence Diagram(s)

sequenceDiagram
  autonumber
  actor Client as 클라이언트
  participant Service as ChatRoomService
  participant ChatRoom as ChatRoom (도메인)
  participant Repo as GroupImageV2Repository
  participant UserDB as User/Profile DB

  Client->>Service: 채팅방 목록/상세 요청
  Service->>ChatRoom: 채팅방 및 참가자 정보 조회
  alt 그룹 채팅 (group != null)
    Service->>Repo: 그룹 이미지(variant 목록) 조회
    Repo-->>Service: 이미지 목록 (variant 포함)
    Service->>Service: 첫 이미지의 THUMBNAIL_100_100 URL 선택
  else DM
    Service->>UserDB: 상대 참가자 프로필 조회
    UserDB-->>Service: 프로필 이미지 URL
  end
  Service->>Service: 참가자별 isOwner 판별 (hostId 기반)
  Service-->>Client: ChatRoomResponse / ChatRoomItemResponse (thumbnail, isOwner 포함)
Loading

Estimated code review effort

🎯 3 (Moderate) | ⏱️ ~20 minutes

Possibly related PRs

🐰 새 얼굴 하나, 썸네일 반짝반짝
호스트 깃발 들고 누가 주인일까 살핀다
정렬된 대화는 최신부터 줄지어
프로필·그룹 그림 함께 어울려 춤추네 ✨

Pre-merge checks and finishing touches

❌ Failed checks (1 warning)
Check name Status Explanation Resolution
Docstring Coverage ⚠️ Warning Docstring coverage is 28.57% which is insufficient. The required threshold is 80.00%. You can run @coderabbitai generate docstrings to improve docstring coverage.
✅ Passed checks (2 passed)
Check name Status Explanation
Description Check ✅ Passed Check skipped - CodeRabbit’s high-level summary is enabled.
Title check ✅ Passed 제목은 변경의 주요 내용인 '채팅 도메인 요구사항 반영'을 명확하게 설명하고 있으며, PR에서 구현된 썸네일 필드 추가, 방장 식별, 정렬 로직 등의 변경사항을 포괄적으로 나타냅니다.
✨ Finishing touches
  • 📝 Generate docstrings

📜 Recent review details

Configuration used: Path: .coderabbit.yaml

Review profile: CHILL

Plan: Pro

📥 Commits

Reviewing files that changed from the base of the PR and between 3185567 and b265882.

📒 Files selected for processing (3)
  • src/main/java/team/wego/wegobackend/chat/config/StompChannelInterceptor.java
  • src/main/java/team/wego/wegobackend/group/v2/application/dto/response/GetGroupV2Response.java
  • src/main/java/team/wego/wegobackend/group/v2/application/service/GroupV2Service.java
✅ Files skipped from review due to trivial changes (1)
  • src/main/java/team/wego/wegobackend/chat/config/StompChannelInterceptor.java
🔇 Additional comments (2)
src/main/java/team/wego/wegobackend/group/v2/application/dto/response/GetGroupV2Response.java (1)

38-39: chatRoomId 필드 추가 변경사항 확인 완료

레코드 필드 정의, 팩토리 메서드 시그니처, 생성자 호출이 모두 일관되게 업데이트되었습니다. 널 허용 타입(Long)을 사용하여 채팅방이 없는 경우를 적절히 처리하고 있으며, 주석도 명확합니다.

Also applies to: 46-47, 111-112

src/main/java/team/wego/wegobackend/group/v2/application/service/GroupV2Service.java (1)

290-292: 채팅방 ID 추가 로직은 올바르게 구현되었습니다

널 안전성 처리가 정확하며, GetGroupV2Response.of() 메서드의 유일한 호출부(292번 줄)가 새로운 chatRoomId 파라미터를 올바르게 전달하고 있습니다. 메서드 시그니처와 호출부가 일치하므로 추가 확인이 불필요합니다.


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.

@Be-HinD
Copy link
Member Author

Be-HinD commented Jan 3, 2026

일정이 촉박하여, 로직 검증 및 로컬 테스트 진행은 패스하고 클라이언트 통합 테스트로 진행할 예정입니다.

Copy link

@coderabbitai coderabbitai bot left a comment

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 (1)
src/main/java/team/wego/wegobackend/chat/domain/entity/ChatRoom.java (1)

98-103: getHostId에도 동일한 null 체크 필요

isHost 메서드와 동일하게, group.getHost()가 null일 가능성을 고려해야 합니다.

🔎 방어적 null 체크를 추가한 개선안
 public Long getHostId() {
     if (!isGroupChat() || group == null) {
         return null;
     }
+    if (group.getHost() == null) {
+        return null;
+    }
     return group.getHost().getId();
 }

isHost 메서드에도 동일한 방어 로직 추가:

 public boolean isHost(User user) {
     if (!isGroupChat() || group == null) {
         return false;
     }
+    if (group.getHost() == null) {
+        return false;
+    }
     return group.getHost().getId().equals(user.getId());
 }
📜 Review details

Configuration used: Path: .coderabbit.yaml

Review profile: CHILL

Plan: Pro

📥 Commits

Reviewing files that changed from the base of the PR and between 8d4895a and f51924d.

📒 Files selected for processing (5)
  • src/main/java/team/wego/wegobackend/chat/application/dto/response/ChatRoomItemResponse.java
  • src/main/java/team/wego/wegobackend/chat/application/dto/response/ChatRoomResponse.java
  • src/main/java/team/wego/wegobackend/chat/application/dto/response/ParticipantResponse.java
  • src/main/java/team/wego/wegobackend/chat/application/service/ChatRoomService.java
  • src/main/java/team/wego/wegobackend/chat/domain/entity/ChatRoom.java
🔇 Additional comments (9)
src/main/java/team/wego/wegobackend/chat/application/dto/response/ChatRoomItemResponse.java (1)

7-37: LGTM! 썸네일 필드 추가가 적절합니다

레코드에 thumbnail 필드를 추가하고 팩토리 메서드에서 올바르게 전달하고 있습니다. 구현이 명확하고 일관성 있습니다.

src/main/java/team/wego/wegobackend/chat/application/dto/response/ChatRoomResponse.java (1)

8-36: LGTM! 일관된 구조로 썸네일 필드 추가

ChatRoomItemResponse와 동일한 패턴으로 썸네일 필드가 추가되어 일관성이 유지되고 있습니다.

src/main/java/team/wego/wegobackend/chat/application/dto/response/ParticipantResponse.java (1)

7-26: LGTM! 방장 식별 기능이 적절히 구현됨

isOwner 필드와 팩토리 메서드가 명확하게 구현되어 있으며, 방장 정보를 응답에 포함시키는 요구사항을 잘 충족합니다.

src/main/java/team/wego/wegobackend/chat/application/service/ChatRoomService.java (5)

69-84: 채팅방 상세 조회 로직 개선이 적절함

방장 정보와 썸네일을 응답에 포함시키는 로직이 명확하게 구현되어 있습니다. getHostId()resolveThumbnail을 활용한 구조가 깔끔합니다.


89-101: 참여자 목록 조회에 방장 정보 추가가 일관성 있게 구현됨

getChatRoom과 동일한 패턴으로 방장 식별 로직이 적용되어 코드베이스의 일관성이 유지됩니다.


352-357: LGTM! 방장 확인 헬퍼 메서드가 간결하게 구현됨

null 체크를 포함한 명확한 로직으로 구현되어 있습니다.


281-310: 응답 빌더 메서드들이 새로운 필드를 적절히 통합함

buildChatRoomItembuildChatRoomResponse 모두 썸네일과 방장 정보를 일관되게 처리하고 있습니다. 헬퍼 메서드들을 잘 활용하여 코드 중복을 최소화했습니다.


326-350: 구현이 올바릅니다. findAllByGroupIdWithVariants 메서드는 정의되어 있으며, left join fetch를 통해 variants를 eager loading으로 함께 조회합니다. 사용 방식도 적절합니다.

src/main/java/team/wego/wegobackend/chat/domain/entity/ChatRoom.java (1)

91-96: 코드는 NPE 위험이 없습니다 - 호스트는 항상 non-null입니다

GroupV2host 필드는 데이터베이스 수준에서 @JoinColumn(name = "host_id", nullable = false)@ManyToOne(optional = false) 제약조건이 있어 절대 null이 될 수 없습니다. 따라서 라인 92에서 group != null 검사를 통과한 후에는 group.getHost()가 항상 null이 아닌 User 객체를 반환하므로 NPE는 발생하지 않습니다. 이 패턴은 코드베이스의 40개 이상의 위치에서 동일하게 사용되고 있습니다.

Likely an incorrect or invalid review comment.

- 모임 조회 시 채팅방 ID도 함께 전달
- 모임 승인제 채팅방 참여 이벤트 추가
- 모임 추방 시 채팅방 탈퇴 이벤트 추가
- 기억을 잃어버리고 모임 정보 조회 시 ID를 던지는 로직을 추가를 안하고 커밋을 올려, 재커밋
@Be-HinD Be-HinD merged commit 51ea390 into main Jan 3, 2026
1 check passed
@Be-HinD Be-HinD deleted the refactor/chat branch January 3, 2026 06:53
@github-project-automation github-project-automation bot moved this from Backlog to Done in WeGo-Together Backend Jan 3, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

✨enhancement New feature or request

Projects

Status: Done

Development

Successfully merging this pull request may close these issues.

1 participant