-
Notifications
You must be signed in to change notification settings - Fork 0
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
Refactor/#154: 채팅방 서비스 리팩토링 #164
The head ref may contain hidden characters: "refactor/#154/\uCC44\uD305\uBC29-\uC11C\uBE44\uC2A4-\uB9AC\uD329\uD1A0\uB9C1"
Conversation
UserChatRoom findByUserAndChatRoomAndStatus(User userByUserId, ChatRoom chatRoomByChatRoomId, String status); | ||
|
||
List<UserChatRoom> findByChatRoom(ChatRoom chatRoom); | ||
List<UserChatRoom> findByChatRoomAndStatus(ChatRoom chatRoom, String status); |
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.
soft delete 구현하는 방식들 중에서 이렇게 status
조건을 parameter로 넘겨주는 방식, Jpa를 잘 활용하고 헷갈릴 일이 없어서 좋은 방법 중에 하나라고 생각합니다.
다만 Active를 계속 적어줘야돼서 조금 귀찮을 순 있겠네요
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.
네 따로 custom한 repository 메소드의 경우에는 Active 필터링 조건을 추가하는 게 변경이 많이 없는데
기본 Jpa 메소드를 활용하는 경우에는 이 방식이 제일 간단한 것 같습니다
음 파라미터로 status를 노출하는 게 조금 부자연스러운 것 같긴 한데.. 나중에 같이 얘기해보면 좋을 것 같아요
.join(userChatRoom).on( | ||
userChatRoom.chatRoom.eq(chatRoom) | ||
.and(userChatRoom.user.eq(who)) | ||
.and(userChatRoom.status.eq("ACTIVE"))) |
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.
"ACTIVE"
랑 "INACTIVE"
를 프로젝트에서 공통으로 사용할 enum으로 만들면 좋을 것 같아요
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.
좋아요 반영하겠습니다
return this.getCreatedAt() | ||
.atZone(ZoneId.of("UTC")) // UTC로 해석 | ||
.withZoneSameInstant(ZoneId.of("Asia/Seoul")) // 서울 시간대로 변환 | ||
.toLocalDateTime(); // LocalDateTime으로 변환 |
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.
UserChatRoom에도 같은 함수가 있던데 TimeUtil
같은 객체로 뻬서 로직을 묶어주는 것도 좋아보입니다
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.
저도 생각해봤는데 해당 TimeUtil
객체가 어느 계층에 들어가는 게 적합할지 잘 모르겠어서 남겨뒀던 부분입니다
어느 계층이 적합하다고 생각하시나요?
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.
외부 의존성이 없고(Service나 repository를 참조하지 않음) 그냥 함수 모음? 로직 모음? 이니까 계층과 상관 없이 만들어도 되지 않을까 싶습니다. (KUIT 미션에서 JwtUtil처럼)
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.
LGTM
기존 ChatRoomService 에서 수행하는 많은 로직들을 특정 객체들에게 책임을 위임 & SRP에 따라 private 메서드 여러개로 분리하여 이전보다 훨씬 가독성이 좋아진 것 같습니다!
다만, private 메서드로 분기처리하신 로직들도 테스트가 필요한 중요한 로직이라고 생각하고, 테스트가 해당 객체의 내부 구현이 아니라 외부로 보여지는 인터페이스 부분을 대상으로 작성되는 것임을 생각하면, private 메서드들로 쪼개놓은 로직들에 대한 책임을 담당하는 다른 객체를 생성하는 방법을 생각해보시는 방법은 어떤가요??
물론 이렇게 되면 가독성 측면에서는 조금 손해를 보는 것 같지만(서비스단 내에서 관련 로직들을 모아서 처리하는게 가독성 측면에서는 더 좋은 것 같다는 개인적인 생각입니다) , 새로 생성한 객체들에 대한 유닛 테스트를 작성함으로써 서비스단 코드의 테스트를 더 수월하게 할 수 있다는 장점이 있다고 생각합니다!!
.atZone(ZoneId.of("UTC")) | ||
.withZoneSameInstant(ZoneId.of("Asia/Seoul")) | ||
.toLocalDateTime(); | ||
} |
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.
LGTM
이 코드는 따로 테스트가 필요한 코드는 아닌거 같으니, 중복되는 코드를 막기위해 utils 로 분리하신 것이 구조적으로 훨씬 좋아보입니다
public void setUserRejoin() { | ||
this.setLastReadTime(LocalDateTime.now()); | ||
this.updateActive(); | ||
} |
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.
LGTM
UserSpaceRoom 객체 내부로 userRejoin에 대한 책임을 위임하니 훨씬 객체지향스러워 진 것 같습니다
'다른 객체'로 빼는 것은 결국에 전에 의논했던 service 레이어 내에서의 계층 구분으로 이어지는 것 같습니다! |
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.
LGTM!
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.
GOOD
📝 요약
🔖 변경 사항
✅ 리뷰 요구사항
📸 확인 방법 (선택)
📌 PR 진행 시 이러한 점들을 참고해 주세요