From 6c4a48d58654dd4e957250d6ea99238c10d49fe8 Mon Sep 17 00:00:00 2001 From: GerHerMo Date: Fri, 10 Oct 2025 09:49:37 +0900 Subject: [PATCH 1/2] fix: checkout version before loadingmsg add --- .../java/com/back/domain/chatbot/service/ChatbotService.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/com/back/domain/chatbot/service/ChatbotService.java b/src/main/java/com/back/domain/chatbot/service/ChatbotService.java index 3dca13e..f7f0a08 100644 --- a/src/main/java/com/back/domain/chatbot/service/ChatbotService.java +++ b/src/main/java/com/back/domain/chatbot/service/ChatbotService.java @@ -548,7 +548,7 @@ private ChatResponseDto handleStepRecommendation(ChatRequestDto requestDto) { case 2: stepData = getAlcoholBaseTypeOptions(parseAlcoholStrength(requestDto.getSelectedAlcoholStrength())); - message = "좋은 선택이네요! 이제 베이스가 될 술을 선택해주세요 🍸"; + message = "좋은 선택이네요!\n 이제 베이스가 될 술을 선택해주세요 🍸"; type = MessageType.RADIO_OPTIONS; break; From c5689cf807519031be135d8227c1a6e7ebda2df5 Mon Sep 17 00:00:00 2001 From: GerHerMo Date: Fri, 10 Oct 2025 10:09:17 +0900 Subject: [PATCH 2/2] fix: del userStyle on DTO --- .../domain/chatbot/dto/ChatRequestDto.java | 2 - .../chatbot/service/ChatbotService.java | 118 ++---------------- 2 files changed, 7 insertions(+), 113 deletions(-) diff --git a/src/main/java/com/back/domain/chatbot/dto/ChatRequestDto.java b/src/main/java/com/back/domain/chatbot/dto/ChatRequestDto.java index 6b265c7..74a5947 100644 --- a/src/main/java/com/back/domain/chatbot/dto/ChatRequestDto.java +++ b/src/main/java/com/back/domain/chatbot/dto/ChatRequestDto.java @@ -28,6 +28,4 @@ public class ChatRequestDto { private String selectedAlcoholBaseType; // selectedCocktailType 삭제 - // Step 3에서 사용자가 입력한 칵테일 스타일 (검색 키워드로 사용) - private String userStyleInput; } \ No newline at end of file diff --git a/src/main/java/com/back/domain/chatbot/service/ChatbotService.java b/src/main/java/com/back/domain/chatbot/service/ChatbotService.java index 1d11b24..e4c1820 100644 --- a/src/main/java/com/back/domain/chatbot/service/ChatbotService.java +++ b/src/main/java/com/back/domain/chatbot/service/ChatbotService.java @@ -62,14 +62,6 @@ public class ChatbotService { private String responseRules; private ChatClient chatClient; - // 로딩 메시지 상수 - private static final String RECOMMENDATION_LOADING_MESSAGE = - "당신에게 어울리는 칵테일은? 두구❤️두구💛두구💚두구💙두구💜두구🖤두구🤍두구🤎"; - - // 처리 완료 플래그 키워드 - private static final String PROCESS_STEP_RECOMMENDATION = "PROCESS_STEP_RECOMMENDATION"; - private static final String PROCESS_QA_RECOMMENDATION = "PROCESS_QA_RECOMMENDATION"; - @PostConstruct public void init() throws IOException { this.systemPrompt = StreamUtils.copyToString( @@ -150,50 +142,9 @@ public ChatResponseDto sendMessage(ChatRequestDto requestDto) { .build(); } - // 실제 질문이 들어온 경우 - 먼저 로딩 메시지 반환 - if (requestDto.getMessage() != null && !requestDto.getMessage().trim().isEmpty()) { - // 로딩 메시지인지 확인 (두구두구 메시지 이후의 실제 처리 요청) - if (requestDto.getMessage().contains("PROCESS_RECOMMENDATION")) { - log.info("질문형 추천 실제 처리 - userId: {}", requestDto.getUserId()); - return generateAIResponseWithContext(requestDto, "질문형 추천"); - } - - // 사용자 질문 저장 - ChatConversation userQuestion = ChatConversation.builder() - .userId(requestDto.getUserId()) - .message(requestDto.getMessage()) - .sender(MessageSender.USER) - .createdAt(LocalDateTime.now()) - .build(); - chatConversationRepository.save(userQuestion); - - // 고정 로딩 메시지 - String loadingMessage = "당신에게 어울리는 칵테일은?\n 두구❤️두구💛두구💚두구💙두구💜두구🖤두구🤍두구🤎"; - - ChatConversation loadingBot = ChatConversation.builder() - .userId(requestDto.getUserId()) - .message(loadingMessage) - .sender(MessageSender.CHATBOT) - .createdAt(LocalDateTime.now()) - .build(); - ChatConversation savedLoading = chatConversationRepository.save(loadingBot); - - // 로딩 메시지 반환 (FE에서 이후 자동으로 실제 추천 요청) - return ChatResponseDto.builder() - .id(savedLoading.getId()) - .userId(requestDto.getUserId()) - .message(loadingMessage) - .sender(MessageSender.CHATBOT) - .type(MessageType.LOADING) - .createdAt(savedLoading.getCreatedAt()) - .metaData(ChatResponseDto.MetaData.builder() - .currentStep(0) - .actionType("LOADING_QA") - .isTyping(true) - .delay(2000) // 2초 후 자동 요청 - .build()) - .build(); - } + // 실제 질문이 들어온 경우 AI 응답 생성 + log.info("질문형 추천 모드 진입 - userId: {}", requestDto.getUserId()); + return generateAIResponseWithContext(requestDto, "질문형 추천"); } else if (currentStep >= 1 && currentStep <= 4) { // 단계별 추천 @@ -594,7 +545,7 @@ private ChatResponseDto handleStepRecommendation(ChatRequestDto requestDto) { case 2: stepData = getAlcoholBaseTypeOptions(parseAlcoholStrength(requestDto.getSelectedAlcoholStrength())); - message = "좋은 선택이네요!\n 이제 베이스가 될 술을 선택해주세요 🍸"; + message = "좋은 선택이네요! \n이제 베이스가 될 술을 선택해주세요 🍸"; type = MessageType.RADIO_OPTIONS; break; @@ -611,65 +562,10 @@ private ChatResponseDto handleStepRecommendation(ChatRequestDto requestDto) { break; case 4: - // Step 4에서 로딩 메시지 처리 - if (!"PROCESS_STEP_RECOMMENDATION".equals(requestDto.getMessage())) { - // 사용자 입력 저장 (Step 3의 답변) 및 userStyleInput에 저장 - if (requestDto.getMessage() != null && !requestDto.getMessage().trim().isEmpty()) { - // DB에 저장 - ChatConversation userInput = ChatConversation.builder() - .userId(requestDto.getUserId()) - .message(requestDto.getMessage()) - .sender(MessageSender.USER) - .createdAt(LocalDateTime.now()) - .build(); - chatConversationRepository.save(userInput); - - // userStyleInput에 저장 (다음 요청에서 사용) - requestDto.setUserStyleInput(requestDto.getMessage()); - log.info("Step 3 사용자 입력 저장: {}", requestDto.getMessage()); - } - - // 고정 로딩 메시지 - String loadingMessage = "당신에게 어울리는 칵테일은?\n 두구❤️두구💛두구💚두구💙두구💜두구🖤두구🤍두구🤎"; - - ChatConversation loadingBot = ChatConversation.builder() - .userId(requestDto.getUserId()) - .message(loadingMessage) - .sender(MessageSender.CHATBOT) - .createdAt(LocalDateTime.now()) - .build(); - ChatConversation savedLoading = chatConversationRepository.save(loadingBot); - - // 로딩 메시지 반환 - return ChatResponseDto.builder() - .id(savedLoading.getId()) - .userId(requestDto.getUserId()) - .message(loadingMessage) - .sender(MessageSender.CHATBOT) - .type(MessageType.LOADING) - .createdAt(savedLoading.getCreatedAt()) - .metaData(ChatResponseDto.MetaData.builder() - .currentStep(4) - .totalSteps(4) - .actionType("LOADING_STEP") - .isTyping(true) - .delay(2000) // 2초 후 자동 요청 - .build()) - .stepData(new StepRecommendationResponseDto( - 4, - null, - null, - null, - false - )) - .build(); - } - - // 실제 추천 처리 - userStyleInput 사용 (PROCESS_STEP_RECOMMENDATION 키워드 아님) stepData = getFinalRecommendationsWithMessage( - parseAlcoholStrength(requestDto.getSelectedAlcoholStrength()), - parseAlcoholBaseType(requestDto.getSelectedAlcoholBaseType()), - requestDto.getUserStyleInput() // message 대신 userStyleInput 사용 + parseAlcoholStrength(requestDto.getSelectedAlcoholStrength()), + parseAlcoholBaseType(requestDto.getSelectedAlcoholBaseType()), + requestDto.getMessage() ); message = stepData.getStepTitle(); type = MessageType.CARD_LIST;