public void sendMentionNotification(String groupName, ChatMessage chatMessage){
// n명에게 보낼수도 있으므로, 변경
// 만약 에브리원이 들어왔다면 그룹의 전체인원에게 보내는 로직으로 변경
List<String> mentioneded = mentionedList(chatMessage.getText());
// System.out.println("멘션리스트 for문 전에" + mentioneded);
Groups group = groupsRepository.getGroupsByGroupName(groupName); // 어차피 같은 서버이므로 for문 안에서 돌 필요 없음
for (String name : mentioneded) {
if ("MO-GPT".equals(name.trim())) { //
String answer = aiService.getAnswer(prompt + chatMessage.getText());
// System.out.println(answer);
// 메세지 보내는 부분
ChatMessage botMessage = new ChatMessage();
botMessage.setUser("MO-GPT");
botMessage.setText(answer);
// botMessage.setImageUrl("이거는 메세지에 이미지 넣어야함.");
botMessage.setUserImg("https://storage.googleapis.com/moim-bucket/74/6f9976d9-30a0-4f3c-b1c4-a0862e11434a.png");
botMessage.setChannel(chatMessage.getChannel());
botMessage.setDate(java.time.LocalDateTime.now().toString());
log.info("셋채널 여기로 보냅니다." + chatMessage.getChannel());
// 메세지 전송
messagingTemplate.convertAndSend("/topic/chat/" + groupName, botMessage);
// 세이브해서 저장함.
chatService.saveChat(groupName, botMessage.getChannel(), botMessage);
}
System.out.println("메세지 보낼 사람" + name);
Users users = usersRepository.findByUserNick(name)
.orElseThrow(() -> new EntityNotFoundException("해당하는 유저가 없습니다."));
String recipientUserId = users.getUsername();
// 보내줘야할거, 메세지의 정보, 어디서
MentionNotificationDTO mentionNotificationDTO = new MentionNotificationDTO(
group.getGroupNo().toString(),
group.getGroupName(),
chatMessage.getText()
);
messagingTemplate.convertAndSendToUser(recipientUserId, "/queue/mention-notification", mentionNotificationDTO);
}
}
채팅을 보낼떄, @를 사용하여 언급을 사용하여 푸시를 할 수 있고,
시간이 굉장히 빡빡한 프로젝트였고, 이미 만들어진 메서드를 활용하여
AI 챗봇 서비스에도 활용하고자 하였다.
문제는 그 과정에서 최적화에 대한 고민이 빠진 결과,
AI를 쓸때마다 필요없는 DB조회 쿼리문을 한번 더 날리는 결과를 낳았다.
간단하게 컨티뉴 하나로 해결이 가능하다. 왜 빼먹었을까?
// 이전 코드 동일
chatService.saveChat(groupName, botMessage.getChannel(), botMessage);
continue; // 코드 추가
}
System.out.println("메세지 보낼 사람" + name);
Users users = usersRepository.findByUserNick(name)
.orElseThrow(() -> new EntityNotFoundException("해당하는 유저가 없습니다."));
}
이렇게 바꿔주면, 유저가 챗봇 서비스를 사용할때
findByUserNick 를 쓸데없이 조회하지 않게 바꾸고,
일반 유저를 언급했을 경우에는 언급이 가게 바뀐다.
지금 생각해보면 if-else 문으로 처리했으면 더 깔끔하지 않았을까? 라는 생각이 들기도 한다.