From ecdb8dca3c738f5c1ad584dc7322fb199c054bc6 Mon Sep 17 00:00:00 2001 From: GerHerMo Date: Thu, 2 Oct 2025 16:03:46 +0900 Subject: [PATCH 1/2] refactor: delete selectedCocktailType level --- .../domain/chatbot/dto/ChatRequestDto.java | 1 - .../chatbot/service/ChatbotService.java | 54 ++----------------- 2 files changed, 4 insertions(+), 51 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 d544b4d..a3e6d47 100644 --- a/src/main/java/com/back/domain/chatbot/dto/ChatRequestDto.java +++ b/src/main/java/com/back/domain/chatbot/dto/ChatRequestDto.java @@ -26,5 +26,4 @@ public class ChatRequestDto { // "ALL" 처리를 위해 스텝 3개 String으로 변경 private String selectedAlcoholStrength; private String selectedAlcoholBaseType; - private String selectedCocktailType; } \ 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 cd4ce25..5e24f31 100644 --- a/src/main/java/com/back/domain/chatbot/service/ChatbotService.java +++ b/src/main/java/com/back/domain/chatbot/service/ChatbotService.java @@ -102,7 +102,7 @@ public ChatResponseDto sendMessage(ChatRequestDto requestDto) { log.info("질문형 추천 모드 진입 - userId: {}", requestDto.getUserId()); return generateAIResponseWithContext(requestDto, "질문형 추천"); } - else if (currentStep >= 1 && currentStep <= 4) { + else if (currentStep >= 1 && currentStep <= 3) { // 단계별 추천 log.info("단계별 추천 모드 진입 - Step: {}, userId: {}", currentStep, requestDto.getUserId()); @@ -496,19 +496,10 @@ private ChatResponseDto handleStepRecommendation(ChatRequestDto requestDto) { break; case 3: - stepData = getCocktailTypeOptions( - parseAlcoholStrength(requestDto.getSelectedAlcoholStrength()), - parseAlcoholBaseType(requestDto.getSelectedAlcoholBaseType()) - ); - message = "완벽해요! 마지막으로 어떤 스타일로 즐기실 건가요? 🥃"; - type = MessageType.RADIO_OPTIONS; - break; - - case 4: stepData = getFinalRecommendations( parseAlcoholStrength(requestDto.getSelectedAlcoholStrength()), parseAlcoholBaseType(requestDto.getSelectedAlcoholBaseType()), - parseCocktailType(requestDto.getSelectedCocktailType()) + null ); message = stepData.getStepTitle(); type = MessageType.CARD_LIST; // 최종 추천은 카드 리스트 @@ -541,7 +532,7 @@ private ChatResponseDto handleStepRecommendation(ChatRequestDto requestDto) { // 메타데이터 포함 ChatResponseDto.MetaData metaData = ChatResponseDto.MetaData.builder() .currentStep(currentStep) - .totalSteps(4) + .totalSteps(3) .isTyping(true) .delay(300) .build(); @@ -585,17 +576,6 @@ private AlcoholBaseType parseAlcoholBaseType(String value) { } } - private CocktailType parseCocktailType(String value) { - if (value == null || value.trim().isEmpty() || "ALL".equalsIgnoreCase(value)) { - return null; - } - try { - return CocktailType.valueOf(value); - } catch (IllegalArgumentException e) { - log.warn("Invalid CocktailType value: {}", value); - return null; - } - } private StepRecommendationResponseDto getAlcoholStrengthOptions() { List options = new ArrayList<>(); @@ -651,32 +631,6 @@ private StepRecommendationResponseDto getAlcoholBaseTypeOptions(AlcoholStrength ); } - private StepRecommendationResponseDto getCocktailTypeOptions(AlcoholStrength alcoholStrength, AlcoholBaseType alcoholBaseType) { - List options = new ArrayList<>(); - - // "전체" 옵션 추가 - options.add(new StepRecommendationResponseDto.StepOption( - "ALL", - "전체", - null - )); - - for (CocktailType cocktailType : CocktailType.values()) { - options.add(new StepRecommendationResponseDto.StepOption( - cocktailType.name(), - cocktailType.getDescription(), - null - )); - } - - return new StepRecommendationResponseDto( - 3, - "어떤 종류의 잔으로 드시겠어요?", - options, - null, - false - ); - } private StepRecommendationResponseDto getFinalRecommendations( AlcoholStrength alcoholStrength, @@ -714,7 +668,7 @@ private StepRecommendationResponseDto getFinalRecommendations( "마음에 드는 칵테일은 '킵' 버튼을 눌러 나만의 Bar에 저장해보세요!"; return new StepRecommendationResponseDto( - 4, + 3, stepTitle, null, recommendations, From 107f3338fbd873338b90461b84f05e7ca79ba213 Mon Sep 17 00:00:00 2001 From: GerHerMo Date: Thu, 2 Oct 2025 16:14:42 +0900 Subject: [PATCH 2/2] feat: final input add --- .../domain/chatbot/dto/ChatRequestDto.java | 3 ++- .../domain/chatbot/enums/MessageType.java | 3 ++- .../chatbot/service/ChatbotService.java | 27 +++++++++++-------- 3 files changed, 20 insertions(+), 13 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 a3e6d47..83f26e1 100644 --- a/src/main/java/com/back/domain/chatbot/dto/ChatRequestDto.java +++ b/src/main/java/com/back/domain/chatbot/dto/ChatRequestDto.java @@ -23,7 +23,8 @@ public class ChatRequestDto { private boolean isStepRecommendation = false; private Integer currentStep; - // "ALL" 처리를 위해 스텝 3개 String으로 변경 + // "ALL" 처리를 위해 스텝 2개 String으로 변경 private String selectedAlcoholStrength; private String selectedAlcoholBaseType; + // selectedCocktailType 삭제 } \ No newline at end of file diff --git a/src/main/java/com/back/domain/chatbot/enums/MessageType.java b/src/main/java/com/back/domain/chatbot/enums/MessageType.java index 11e71ac..bf21c6c 100644 --- a/src/main/java/com/back/domain/chatbot/enums/MessageType.java +++ b/src/main/java/com/back/domain/chatbot/enums/MessageType.java @@ -5,7 +5,8 @@ public enum MessageType { RADIO_OPTIONS("라디오옵션"), // 라디오 버튼 선택지 CARD_LIST("카드리스트"), // 칵테일 추천 카드 리스트 LOADING("로딩중"), // 로딩 메시지 - ERROR("에러"); // 에러 메시지 + ERROR("에러"), // 에러 메시지 + INPUT("입력"); // 텍스트 입력 요청 private final String description; 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 5e24f31..8da9230 100644 --- a/src/main/java/com/back/domain/chatbot/service/ChatbotService.java +++ b/src/main/java/com/back/domain/chatbot/service/ChatbotService.java @@ -12,7 +12,6 @@ import com.back.domain.cocktail.entity.Cocktail; import com.back.domain.cocktail.enums.AlcoholBaseType; import com.back.domain.cocktail.enums.AlcoholStrength; -import com.back.domain.cocktail.enums.CocktailType; import com.back.domain.cocktail.repository.CocktailRepository; import jakarta.annotation.PostConstruct; import lombok.RequiredArgsConstructor; @@ -102,7 +101,7 @@ public ChatResponseDto sendMessage(ChatRequestDto requestDto) { log.info("질문형 추천 모드 진입 - userId: {}", requestDto.getUserId()); return generateAIResponseWithContext(requestDto, "질문형 추천"); } - else if (currentStep >= 1 && currentStep <= 3) { + else if (currentStep >= 1 && currentStep <= 4) { // 단계별 추천 log.info("단계별 추천 모드 진입 - Step: {}, userId: {}", currentStep, requestDto.getUserId()); @@ -496,10 +495,16 @@ private ChatResponseDto handleStepRecommendation(ChatRequestDto requestDto) { break; case 3: - stepData = getFinalRecommendations( + stepData = null; + message = "좋아요! 이제 원하는 칵테일 스타일을 자유롭게 말씀해주세요 💬\n 없으면 'x', 또는 '없음' 과 같이 입력해주세요!"; + type = MessageType.INPUT; + break; + + case 4: + stepData = getFinalRecommendationsWithMessage( parseAlcoholStrength(requestDto.getSelectedAlcoholStrength()), parseAlcoholBaseType(requestDto.getSelectedAlcoholBaseType()), - null + requestDto.getMessage() ); message = stepData.getStepTitle(); type = MessageType.CARD_LIST; // 최종 추천은 카드 리스트 @@ -532,7 +537,7 @@ private ChatResponseDto handleStepRecommendation(ChatRequestDto requestDto) { // 메타데이터 포함 ChatResponseDto.MetaData metaData = ChatResponseDto.MetaData.builder() .currentStep(currentStep) - .totalSteps(3) + .totalSteps(4) .isTyping(true) .delay(300) .build(); @@ -632,20 +637,20 @@ private StepRecommendationResponseDto getAlcoholBaseTypeOptions(AlcoholStrength } - private StepRecommendationResponseDto getFinalRecommendations( + private StepRecommendationResponseDto getFinalRecommendationsWithMessage( AlcoholStrength alcoholStrength, AlcoholBaseType alcoholBaseType, - CocktailType cocktailType) { + String userMessage) { // 필터링 조건에 맞는 칵테일 검색 // "ALL" 선택 시 해당 필터를 null로 처리하여 전체 검색 List strengths = (alcoholStrength == null) ? null : List.of(alcoholStrength); List baseTypes = (alcoholBaseType == null) ? null : List.of(alcoholBaseType); - List cocktailTypes = (cocktailType == null) ? null : List.of(cocktailType); + // userMessage를 키워드로 사용하여 검색 Page cocktailPage = cocktailRepository.searchWithFilters( - null, // 키워드 없음 + userMessage, // 사용자 입력 메시지를 키워드로 사용 strengths, - cocktailTypes, + null, // cocktailType 사용 안 함 baseTypes, PageRequest.of(0, 3) // 최대 3개 추천 ); @@ -668,7 +673,7 @@ private StepRecommendationResponseDto getFinalRecommendations( "마음에 드는 칵테일은 '킵' 버튼을 눌러 나만의 Bar에 저장해보세요!"; return new StepRecommendationResponseDto( - 3, + 4, stepTitle, null, recommendations,