프로젝트 주저리 6 - 쿼리 날릴 필요 없는데

Muji1412·2025년 8월 21일

생각해보니까 조회할 필요가 없는데


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 문으로 처리했으면 더 깔끔하지 않았을까? 라는 생각이 들기도 한다.

profile
박치기공룡의 개발일지

0개의 댓글