Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[BE] feat: 채팅방 목록 조회 시 최근 메시지를 같이 보여주는 API 생성 #735

Merged
merged 4 commits into from
Nov 7, 2024

Conversation

takoyakimchi
Copy link
Contributor

@takoyakimchi takoyakimchi commented Nov 6, 2024

이슈

개발 사항

  • 채팅방 목록 조회 시 최근 메시지를 같이 보여주는 API 생성
  • 기존: 채팅방 ID, 채팅방 인원수, 모임 이름, 모임 이미지 URL
  • 추가: 채팅방 ID, 채팅방 인원수, 모임 이름, 모임 이미지 URL + 최근 메시지 내용, 최근 메시지 전송 시간

전달 사항 (없으면 삭제해 주세요)

  • 버전 대응을 위해 기존 API 유지하고 v2로 만들었습니다.

@takoyakimchi takoyakimchi added the 🖥 backend backend label Nov 6, 2024
@takoyakimchi takoyakimchi added this to the Sprint7 milestone Nov 6, 2024
@takoyakimchi takoyakimchi self-assigned this Nov 6, 2024
Copy link

github-actions bot commented Nov 6, 2024

Test Results

226 tests   226 ✅  19s ⏱️
 46 suites    0 💤
 46 files      0 ❌

Results for commit 8e71c7a.

♻️ This comment has been updated with latest results.

ehtjsv2
ehtjsv2 previously approved these changes Nov 7, 2024
Copy link
Contributor

@ehtjsv2 ehtjsv2 left a comment

Choose a reason for hiding this comment

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

버전 관리를 위해 분리해서 만들었네요! 트레가 생각하는 버전관리 시에 코드 관리 흐름이 어떻게 되나요? v1->v2->v3 까지 나온다면, v1, v2 코드는 어느 시점에 삭제가 되고, 그러한 사이클을 어떻게 고민했는 지 알고 싶어요 (되도록 상세하게!)

Comment on lines 66 to 69
private ChatRoomDetailV2 toChatRoomDetail(ChatRoom chatRoom) {
Optional<Club> club = clubRepository.findByChatRoomId(chatRoom.getId());
String clubName = club.map(c -> c.getTitle().getValue()).orElse("");
String clubImageUrl = club.map(Club::getImageUrl).orElse("");
Copy link
Contributor

Choose a reason for hiding this comment

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

해당 클럽이 없으면 예외가 아니라 빈문자열을 주는 이유는 1대1 채팅이 나온다면, 채팅이 클럽에 종속된 것이 아니기 때문인가요?

도메인지식이 충분하지 않으면 왜 이렇게 했는 지 고민이 오래되는 코드인 것 같아요. 1대1이 나온다면, 서비스를 club, private 분리해서 해당 비즈니스 규칙에 맞게 코드가 바뀐다면, 더 좋은 코드가 되겠네요!

예를 들면, clubCahtRoomService는 지금 코드에서 예외를 던지게 되고, privateChatRoomService는 애초에 Dto가 다르게 되겠네요! 타이틀이 제목이 아니라, 멤버이름이 될테니!

Copy link
Contributor Author

Choose a reason for hiding this comment

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

  1. 버전관리는 api 명세 바뀔때마다 v2 -> v3 이렇게 높이는 방식으로 생각했고 강제업데이트 되는 시점에 이전 버전들도 맞춰서 지우는 방식으로 생각했었어요
  2. clubName 이라고 변수명을 지은 만큼 예외를 터뜨리는게 지금 상황에서는 합리적으로 보이네요! 서비스 분리하는건 동일 api라서 조금 어색해보이고 1대1 채팅방 개발될거 대비해서 주석 정도는 달아두어야겠어요

Copy link
Contributor

Choose a reason for hiding this comment

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

도도가 제시해준 방법도 좋지만, 거의 같은 비즈니스 로직을 가진 두 서비스 사이에 중복 코드가 많이 발생할 것 같아요.

만약 그룹 채팅과 1:1 채팅의 차이가 clubName, imageUrl 뿐이라면, ChatRoom 엔티티에 채팅방 이름, 채팅방 대표 이미지 같은 필드를 추가하는 방법은 어떤가요?
ChatRoom 생성 시 그룹 채팅이라면 club의 정보를 사용하고, 1:1 채팅이라면 상대방 유저의 프로필 정보를 사용해 해당 필드를 채우면 되지 않을까요?

Copy link
Contributor Author

Choose a reason for hiding this comment

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

그렇게 하면 다른 도메인이 chatroom 도메인에 영향을 너무 많이 끼치게 되지 않을까요?
club이나 member 도메인에 변경이 일어나면 chatroom까지 수정해야되겠네요

Copy link
Contributor

Choose a reason for hiding this comment

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

좋습니다! 실제로 1대1 채팅방 구현할 때 다시 생각해보죠!

Copy link
Contributor

@J-I-H-O J-I-H-O left a comment

Choose a reason for hiding this comment

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

트레 고생 많았습니다 👍

저도 도도가 질문한 부분이 궁금해요~ 기존 버전을 지원하기 위한 API는 언제 제거할 것인지, 그 때 클라이언트와 배포는 어떻게 맞출 것인지도 함께 말해주면 좋겠어요.

Comment on lines +71 to +72
Optional<ChatMessage> recentMessage = chatMessageRepository.findRecentByChatRoomId(chatRoom.getId());
String content = recentMessage.map(ChatMessage::getContent).orElse(null);
Copy link
Contributor

Choose a reason for hiding this comment

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

Club이 존재하지 않을 경우에는 clubName과 clubImageUrl은 빈 문자열로 내려주는데,
ChatMessae가 존재하지 않는 경우에는 content를 null로 내려주도록 구성한 이유도 궁금합니다.

Copy link
Contributor Author

@takoyakimchi takoyakimchi Nov 7, 2024

Choose a reason for hiding this comment

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

마지막 채팅 메시지가 비어있는 경우랑 구분을 주고 싶었어요
이부분은 null로 통일해봐도 좋겠네요!

Comment on lines 66 to 69
private ChatRoomDetailV2 toChatRoomDetail(ChatRoom chatRoom) {
Optional<Club> club = clubRepository.findByChatRoomId(chatRoom.getId());
String clubName = club.map(c -> c.getTitle().getValue()).orElse("");
String clubImageUrl = club.map(Club::getImageUrl).orElse("");
Copy link
Contributor

Choose a reason for hiding this comment

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

도도가 제시해준 방법도 좋지만, 거의 같은 비즈니스 로직을 가진 두 서비스 사이에 중복 코드가 많이 발생할 것 같아요.

만약 그룹 채팅과 1:1 채팅의 차이가 clubName, imageUrl 뿐이라면, ChatRoom 엔티티에 채팅방 이름, 채팅방 대표 이미지 같은 필드를 추가하는 방법은 어떤가요?
ChatRoom 생성 시 그룹 채팅이라면 club의 정보를 사용하고, 1:1 채팅이라면 상대방 유저의 프로필 정보를 사용해 해당 필드를 채우면 되지 않을까요?

J-I-H-O
J-I-H-O previously approved these changes Nov 7, 2024
@takoyakimchi takoyakimchi dismissed stale reviews from J-I-H-O and ehtjsv2 via 343f3f9 November 7, 2024 02:02
ehtjsv2
ehtjsv2 previously approved these changes Nov 7, 2024
Copy link
Contributor

@ehtjsv2 ehtjsv2 left a comment

Choose a reason for hiding this comment

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

👍

Copy link
Contributor

@J-I-H-O J-I-H-O left a comment

Choose a reason for hiding this comment

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

Member 이름으로 1:1 채팅방 이름 응답하는 부분 확인 부탁드려요!

Comment on lines +20 to +21
title,
imageUrl,
Copy link
Contributor

Choose a reason for hiding this comment

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

👍😊👍

Comment on lines 78 to 80
Optional<Member> otherMember = chatRoom.findMembers().stream()
.filter(member -> myMemberId.equals(member.getId()))
.findAny();
Copy link
Contributor

Choose a reason for hiding this comment

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

상대방 Member를 조회해야 하는데 자기 자신으로 filtering 하고 있습니다 🥸

Optional<Member> otherMember = chatRoom.findMembers()
                    .stream()
                    .filter(member -> !myMemberId.equals(member.getId()))
                    .findAny();

Copy link
Contributor Author

Choose a reason for hiding this comment

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

헉....!!!

Copy link
Contributor Author

Choose a reason for hiding this comment

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

테스트의 부재가 크군요 테스트까지 작성했슴다! 😭

Copy link
Contributor

Choose a reason for hiding this comment

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

코드 리뷰의 중요성 🥸🥸

Comment on lines +157 to +159
() -> assertThat(response.chatRooms())
.extracting(ChatRoomDetailV2::title)
.containsExactly("트레", null),
Copy link
Contributor

Choose a reason for hiding this comment

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

단언문이 많아서 그런지 테스트 대상이 가려지는 느낌이 듭니다!

  1. 채팅방 목록 조회 시 최근 채팅 메시지가 조회 됨과,
  2. 그룹 채팅방의 이름은 모임 이름, 1:1 채팅방의 이름은 대화 상대의 이름임

이 두 가지를 별도의 테스트로 가져가면 테스트 의도가 더 확실하게 보일 듯 합니다.
다음부터 고려해주시고 이번 PR은 이만 넘어가죠!!

Copy link
Contributor Author

Choose a reason for hiding this comment

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

동의합니다!! 다음 PR에서 함께 작업해볼게요!

@takoyakimchi takoyakimchi merged commit dc73b6b into develop Nov 7, 2024
3 checks passed
@takoyakimchi takoyakimchi deleted the feature/#732 branch November 7, 2024 02:49
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
Projects
Status: Done
Development

Successfully merging this pull request may close these issues.

채팅방 목록에서 최근 메시지를 보여주는 기능 구현 (조회 API)
3 participants