-
Notifications
You must be signed in to change notification settings - Fork 3
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
Conversation
Test Results226 tests 226 ✅ 19s ⏱️ Results for commit 8e71c7a. ♻️ This comment has been updated with latest results. |
There was a problem hiding this 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 코드는 어느 시점에 삭제가 되고, 그러한 사이클을 어떻게 고민했는 지 알고 싶어요 (되도록 상세하게!)
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(""); |
There was a problem hiding this comment.
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가 다르게 되겠네요! 타이틀이 제목이 아니라, 멤버이름이 될테니!
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
- 버전관리는 api 명세 바뀔때마다 v2 -> v3 이렇게 높이는 방식으로 생각했고 강제업데이트 되는 시점에 이전 버전들도 맞춰서 지우는 방식으로 생각했었어요
clubName
이라고 변수명을 지은 만큼 예외를 터뜨리는게 지금 상황에서는 합리적으로 보이네요! 서비스 분리하는건 동일 api라서 조금 어색해보이고 1대1 채팅방 개발될거 대비해서 주석 정도는 달아두어야겠어요
There was a problem hiding this comment.
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 채팅이라면 상대방 유저의 프로필 정보를 사용해 해당 필드를 채우면 되지 않을까요?
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
그렇게 하면 다른 도메인이 chatroom 도메인에 영향을 너무 많이 끼치게 되지 않을까요?
club이나 member 도메인에 변경이 일어나면 chatroom까지 수정해야되겠네요
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
좋습니다! 실제로 1대1 채팅방 구현할 때 다시 생각해보죠!
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
트레 고생 많았습니다 👍
저도 도도가 질문한 부분이 궁금해요~ 기존 버전을 지원하기 위한 API는 언제 제거할 것인지, 그 때 클라이언트와 배포는 어떻게 맞출 것인지도 함께 말해주면 좋겠어요.
Optional<ChatMessage> recentMessage = chatMessageRepository.findRecentByChatRoomId(chatRoom.getId()); | ||
String content = recentMessage.map(ChatMessage::getContent).orElse(null); |
There was a problem hiding this comment.
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로 내려주도록 구성한 이유도 궁금합니다.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
마지막 채팅 메시지가 비어있는 경우랑 구분을 주고 싶었어요
이부분은 null로 통일해봐도 좋겠네요!
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(""); |
There was a problem hiding this comment.
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 채팅이라면 상대방 유저의 프로필 정보를 사용해 해당 필드를 채우면 되지 않을까요?
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
👍
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Member 이름으로 1:1 채팅방 이름 응답하는 부분 확인 부탁드려요!
title, | ||
imageUrl, |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
👍😊👍
Optional<Member> otherMember = chatRoom.findMembers().stream() | ||
.filter(member -> myMemberId.equals(member.getId())) | ||
.findAny(); |
There was a problem hiding this comment.
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();
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
헉....!!!
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
테스트의 부재가 크군요 테스트까지 작성했슴다! 😭
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
코드 리뷰의 중요성 🥸🥸
() -> assertThat(response.chatRooms()) | ||
.extracting(ChatRoomDetailV2::title) | ||
.containsExactly("트레", null), |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
단언문이 많아서 그런지 테스트 대상이 가려지는 느낌이 듭니다!
- 채팅방 목록 조회 시 최근 채팅 메시지가 조회 됨과,
- 그룹 채팅방의 이름은 모임 이름, 1:1 채팅방의 이름은 대화 상대의 이름임
이 두 가지를 별도의 테스트로 가져가면 테스트 의도가 더 확실하게 보일 듯 합니다.
다음부터 고려해주시고 이번 PR은 이만 넘어가죠!!
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
동의합니다!! 다음 PR에서 함께 작업해볼게요!
이슈
개발 사항
전달 사항 (없으면 삭제해 주세요)