@@ -126,12 +126,15 @@ else if (currentStep >= 1 && currentStep <= 4) {
126126
127127 // ========== 3순위: 기본 일반 대화 ==========
128128 log .info ("[DEFAULT] 일반 대화 모드 - userId: {}" , requestDto .getUserId ());
129- String response = generateAIResponse (requestDto );
129+ ChatConversation savedResponse = generateAIResponse (requestDto );
130130
131131 return ChatResponseDto .builder ()
132- .message (response )
132+ .id (savedResponse .getId ())
133+ .userId (requestDto .getUserId ())
134+ .message (savedResponse .getMessage ())
135+ .sender (MessageSender .CHATBOT )
133136 .type (MessageType .TEXT )
134- .timestamp ( LocalDateTime . now ())
137+ .createdAt ( savedResponse . getCreatedAt ())
135138 .build ();
136139
137140 } catch (Exception e ) {
@@ -170,9 +173,10 @@ private String buildConversationContext(List<ChatConversation> recentChats) {
170173
171174 /**
172175 * 대화 저장 - 변경사항: 사용자 메시지와 봇 응답을 각각 별도로 저장
176+ * @return 저장된 봇 응답 엔티티 (id 포함)
173177 */
174178 @ Transactional
175- public void saveConversation (ChatRequestDto requestDto , String response ) {
179+ public ChatConversation saveConversation (ChatRequestDto requestDto , String response ) {
176180 // 1. 사용자 메시지 저장
177181 ChatConversation userMessage = ChatConversation .builder ()
178182 .userId (requestDto .getUserId ())
@@ -189,7 +193,7 @@ public void saveConversation(ChatRequestDto requestDto, String response) {
189193 .sender (MessageSender .CHATBOT )
190194 .createdAt (LocalDateTime .now ())
191195 .build ();
192- chatConversationRepository .save (botResponse );
196+ return chatConversationRepository .save (botResponse );
193197 }
194198
195199 /**
@@ -254,6 +258,7 @@ public ChatResponseDto createGreetingMessage(Long userId) {
254258 // 중복 확인: 동일한 인사말이 이미 존재하는지 확인
255259 boolean greetingExists = chatConversationRepository .existsByUserIdAndMessage (userId , greetingMessage );
256260
261+ ChatConversation savedGreeting = null ;
257262 // 중복되지 않을 경우에만 DB에 저장
258263 if (!greetingExists ) {
259264 ChatConversation greeting = ChatConversation .builder ()
@@ -262,18 +267,21 @@ public ChatResponseDto createGreetingMessage(Long userId) {
262267 .sender (MessageSender .CHATBOT )
263268 .createdAt (LocalDateTime .now ())
264269 .build ();
265- chatConversationRepository .save (greeting );
270+ savedGreeting = chatConversationRepository .save (greeting );
266271 log .info ("인사말 저장 완료 - userId: {}" , userId );
267272 } else {
268273 log .info ("이미 인사말이 존재하여 저장 생략 - userId: {}" , userId );
269274 }
270275
271- // ChatResponseDto 반환
276+ // ChatResponseDto 반환 (요청된 형식에 맞춰 id, userId, sender, type, createdAt 포함)
272277 return ChatResponseDto .builder ()
278+ .id (savedGreeting != null ? savedGreeting .getId () : null )
279+ .userId (userId )
273280 .message (greetingMessage )
281+ .sender (MessageSender .CHATBOT )
274282 .type (MessageType .RADIO_OPTIONS )
275283 .stepData (stepData )
276- .timestamp (LocalDateTime .now ())
284+ .createdAt (LocalDateTime .now ())
277285 .build ();
278286 }
279287
@@ -350,8 +358,9 @@ private String postProcessResponse(String response, InternalMessageType type) {
350358
351359 /**
352360 * AI 응답 생성
361+ * @return 저장된 봇 응답 엔티티 (id 포함)
353362 */
354- private String generateAIResponse (ChatRequestDto requestDto ) {
363+ private ChatConversation generateAIResponse (ChatRequestDto requestDto ) {
355364 log .info ("Normal chat mode for userId: {}" , requestDto .getUserId ());
356365
357366 // 메시지 타입 감지 (내부 enum 사용)
@@ -378,10 +387,8 @@ private String generateAIResponse(ChatRequestDto requestDto) {
378387 // 응답 후처리
379388 response = postProcessResponse (response , messageType );
380389
381- // 대화 저장 - 사용자 메시지와 봇 응답을 각각 저장
382- saveConversation (requestDto , response );
383-
384- return response ;
390+ // 대화 저장 - 사용자 메시지와 봇 응답을 각각 저장하고 저장된 봇 응답 반환
391+ return saveConversation (requestDto , response );
385392 }
386393
387394 /**
@@ -390,8 +397,9 @@ private String generateAIResponse(ChatRequestDto requestDto) {
390397 public ChatResponseDto createLoadingMessage () {
391398 return ChatResponseDto .builder ()
392399 .message ("응답을 생성하는 중..." )
400+ .sender (MessageSender .CHATBOT )
393401 .type (MessageType .LOADING )
394- .timestamp (LocalDateTime .now ())
402+ .createdAt (LocalDateTime .now ())
395403 .metaData (ChatResponseDto .MetaData .builder ()
396404 .isTyping (true )
397405 .build ())
@@ -435,12 +443,15 @@ private boolean isStepRecommendationTrigger(String message) {
435443 * 일반 대화와 구분하여 추천에 특화된 응답 생성
436444 */
437445 private ChatResponseDto generateAIResponseWithContext (ChatRequestDto requestDto , String mode ) {
438- String response = generateAIResponse (requestDto );
446+ ChatConversation savedResponse = generateAIResponse (requestDto );
439447
440448 return ChatResponseDto .builder ()
441- .message (response )
449+ .id (savedResponse .getId ())
450+ .userId (requestDto .getUserId ())
451+ .message (savedResponse .getMessage ())
452+ .sender (MessageSender .CHATBOT )
442453 .type (MessageType .TEXT )
443- .timestamp ( LocalDateTime . now ())
454+ .createdAt ( savedResponse . getCreatedAt ())
444455 .metaData (ChatResponseDto .MetaData .builder ()
445456 .actionType (mode )
446457 .currentStep (0 )
@@ -455,8 +466,9 @@ private ChatResponseDto generateAIResponseWithContext(ChatRequestDto requestDto,
455466 private ChatResponseDto createErrorResponse (String errorMessage ) {
456467 return ChatResponseDto .builder ()
457468 .message (errorMessage )
469+ .sender (MessageSender .CHATBOT )
458470 .type (MessageType .ERROR )
459- .timestamp (LocalDateTime .now ())
471+ .createdAt (LocalDateTime .now ())
460472 .build ();
461473 }
462474
@@ -508,6 +520,24 @@ private ChatResponseDto handleStepRecommendation(ChatRequestDto requestDto) {
508520 type = MessageType .RADIO_OPTIONS ;
509521 }
510522
523+ // 사용자 메시지 저장 (단계별 추천 요청)
524+ ChatConversation userMessage = ChatConversation .builder ()
525+ .userId (requestDto .getUserId ())
526+ .message (requestDto .getMessage ())
527+ .sender (MessageSender .USER )
528+ .createdAt (LocalDateTime .now ())
529+ .build ();
530+ chatConversationRepository .save (userMessage );
531+
532+ // 봇 응답 저장
533+ ChatConversation botResponse = ChatConversation .builder ()
534+ .userId (requestDto .getUserId ())
535+ .message (message )
536+ .sender (MessageSender .CHATBOT )
537+ .createdAt (LocalDateTime .now ())
538+ .build ();
539+ ChatConversation savedResponse = chatConversationRepository .save (botResponse );
540+
511541 // 메타데이터 포함
512542 ChatResponseDto .MetaData metaData = ChatResponseDto .MetaData .builder ()
513543 .currentStep (currentStep )
@@ -517,11 +547,14 @@ private ChatResponseDto handleStepRecommendation(ChatRequestDto requestDto) {
517547 .build ();
518548
519549 return ChatResponseDto .builder ()
550+ .id (savedResponse .getId ())
551+ .userId (requestDto .getUserId ())
520552 .message (message )
553+ .sender (MessageSender .CHATBOT )
521554 .type (type )
522555 .stepData (stepData )
523556 .metaData (metaData )
524- .timestamp ( LocalDateTime . now ())
557+ .createdAt ( savedResponse . getCreatedAt ())
525558 .build ();
526559 }
527560
0 commit comments