// 채팅방 생성
public MessageResponseDto createRoom(MessageRequestDto messageRequestDto, User user) {
Post post = postRepository.findById(messageRequestDto.getPostId()).orElseThrow(
() -> new IllegalArgumentException("게시글을 찾을 수 없습니다.")
);
MessageRoom messageRoom = messageRoomRepository.findBySenderAndReceiver(user.getNickname(), messageRequestDto.getReceiver());
// 처음 쪽지방 생성 또는 이미 생성된 쪽지방이 아닌 경우
if ((messageRoom == null) || !(messageRoom.getPost().getId().equals(messageRequestDto.getPostId()))) {
MessageRoomDto messageRoomDto = MessageRoomDto.create(messageRequestDto, user);
opsHashMessageRoom.put(Message_Rooms, messageRoomDto.getRoomId(), messageRoomDto); // redis hash 에 쪽지방 저장해서, 서버간 채팅방 공유
messageRoom = messageRoomRepository.save(new MessageRoom(messageRoomDto.getId(), messageRoomDto.getRoomName(), messageRoomDto.getSender(), messageRoomDto.getRoomId(), messageRoomDto.getReceiver(), user, post));
return new MessageResponseDto(messageRoom);
// 이미 생성된 쪽지방인 경우
} else {
return new MessageResponseDto(messageRoom.getRoomId());
}
}
query did not return a unique result: 2
JPA를 통해 DB 에서 데이터를 가져오는 중 에러가 발생했다.
이는 Repository에서 조회 결과
는 2개인데 Class로 받아 담을 수 없기 때문에 발생한다.
해당 에러가 발생하면, 항상 DB 에서 조회해오는 부분을 확인하자!
조회해오는 데이터가 1개가 아니기 때문에, List 로 목록을 받아올 수 있다.
JPA 로 DB 를 조회할 때, 오로지 1개의 데이터만 조회하도록 수정해줄 수 있다.
// 수정 전
MessageRoom messageRoom = messageRoomRepository.findBySenderAndReceiver(user.getNickname(), messageRequestDto.getReceiver());
// 수정 후
MessageRoom messageRoom = messageRoomRepository.findBySenderAndReceiverAndPostId(user.getNickname(), messageRequestDto.getReceiver(), messageRequestDto.getPostId());
수정 전 : findBySenderAndReceiver
수정 후 : findBySenderAndReceiverAndPostId