해결된 질문
작성
·
62
·
수정됨
0
안녕하세요 선생님 !
섹션 6. 이전 메시지 조회 강의에서 질문 있습니다.
1. 선생님 코드의 getChatHistory() 메서드에서
chatParticipants를 chatRoom으로 조회해서
for문을 돌면서 현재 로그인한 멤버가 chatParticipants에 있는지 확인하고 있는데,
findByChatRoomAndMember 메서드를 통해
참여자인지 확인해도 로직에 상관이 없을까요 ?
2. 현재 로직은 getHistory 메서드가 실행되면
해당 참여자가 채팅방에 참여하기 전의 메시지들까지 전부 표시될것 같은데, 참여자가 채팅방에 참여한 후 부터의 메시지만 보여주고 싶으면 참여시간을 따로 저장한 다음 findByChatRoomAndCreatedTimeGreaterThanEqualOrderByCreatedTimeAsc(ChatRoom chatRoom, LocalDateTime participatedTime);
이런식으로 코드를 짜면 될까요 ? 좋은 방법인지 모르겠습니다.
선생님 코드
public List<ChatMessageDto> getChatHistory(Long roomId){
// 내가 해당 채팅방의 참여자가 아닐경우 에러
ChatRoom chatRoom = chatRoomRepository.findById(roomId).orElseThrow(()-> new EntityNotFoundException("room cannot be found"));
Member member = memberRepository.findByEmail(SecurityContextHolder.getContext().getAuthentication().getName()).orElseThrow(()->new EntityNotFoundException("member cannot be found"));
List<ChatParticipant> chatParticipants = chatParticipantRepository.findByChatRoom(chatRoom);
boolean check = false;
for(ChatParticipant c : chatParticipants){
if(c.getMember().equals(member)){
check = true;
}
}
if(!check)throw new IllegalArgumentException("본인이 속하지 않은 채팅방입니다.");
// 특정 room에 대한 message조회
List<ChatMessage> chatMessages = chatMessageRepository.findByChatRoomOrderByCreatedTimeAsc(chatRoom);
List<ChatMessageDto> chatMessageDtos = new ArrayList<>();
for(ChatMessage c : chatMessages){
ChatMessageDto chatMessageDto = ChatMessageDto.builder()
.message(c.getContent())
.senderEmail(c.getMember().getEmail())
.build();
chatMessageDtos.add(chatMessageDto);
}
return chatMessageDtos;
}
답변 2
1
1.네 문제 없습니다. 오히려 이미 만들어둔 findByChatRoomAndMember를 활용하는게 더 적절해 보입니다. 제가 메서드를 만들어두고, 놓친부분이라 생각됩니다.
2.getHistory관련하여 참여한 이후의 시간의 message를 가져올거면 말씀하신대로 채팅방참여이후의 시간대를 기준으로 jpa로 filtering해서 history를 출력하면될것 같습니다. participatedTime을 chatParticipant로 등록된 시간을 가져다가 greater than으로 조회를 하면 될것 같습니다.
api관련해서는 태우님이 생각하시기에 더 효율적이거나, 개선할점들을 찾아서 편하게 디벨롭 시켜나가도 될것 같아요.
0
안녕하세요, 인프런 AI 인턴입니다. 김태우님.
김태우님께서 두 가지 질문을 해주셨는데요, 각각에 대해 설명드리겠습니다.
findByChatRoomAndMember 메서드를 통한 참여자 확인:
findByChatRoomAndMember
메서드를 사용하여 직접 참여자인지 확인하는 방법도 가능합니다. 이렇게 하면 코드가 더 간결해질 수 있으며, 중복된 검증 로직을 줄일 수 있습니다. 기존에 이미 해당 메서드를 구현해 두셨다면, 이를 적극적으로 활용하셔도 될 것입니다.참여 후 메시지 조회:
findByChatRoomAndCreatedTimeGreaterThanEqualOrderByCreatedTimeAsc(ChatRoom chatRoom, LocalDateTime participatedTime);
같은 JPQL 메서드를 사용하여 참여 시간 이후의 메시지를 가져올 수 있습니다. 이 방법은 매우 유용하며, 구체적인 요구에 따라 데이터를 효율적으로 필터링할 수 있습니다.이와 비슷한 주제를 다룬 유사한 질문과 답변 링크를 통해 더 많은 정보를 확인하실 수 있습니다:
- 참여자 검증 로직 질문 - for문을 통한 참여자 검증에 대한 대안적인 방법 논의
- 쿼리, JPA 질문 - JPA를 통한 데이터 효율적 조회 방식
저는 질문자님의 이해를 돕고자 지식공유자님의 기존 답변을 참고하여 유사한 답변 링크를 추천해드리고 있습니다.
현재 베타 기능으로 답변이 만족스럽지 않을 수 있는 점 양해 부탁드립니다. 🙏
추가적으로 궁금한 점이 있으시면, 이어서 질문해 주세요. 곧 지식공유자께서 답변해 주실 것입니다.
정말 감사드립니다 !!