Skip to content

Commit f097852

Browse files
authored
[refactor] 챗봇 - 응답구조 통일 #234
[refactor] 챗봇 - 응답구조 통일 #234
2 parents a460569 + 48013d5 commit f097852

File tree

2 files changed

+61
-22
lines changed

2 files changed

+61
-22
lines changed

src/main/java/com/back/domain/chatbot/dto/ChatResponseDto.java

Lines changed: 9 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
package com.back.domain.chatbot.dto;
22

3+
import com.back.domain.chatbot.enums.MessageSender;
34
import com.back.domain.chatbot.enums.MessageType;
45
import lombok.AllArgsConstructor;
56
import lombok.Builder;
@@ -16,9 +17,12 @@
1617
@Builder
1718
public class ChatResponseDto {
1819

20+
private Long id; // 메시지 ID (DB 저장 후 생성)
21+
private Long userId; // 사용자 ID
1922
private String message; // 텍스트 메시지
23+
private MessageSender sender; // 메시지 발신자 (USER / CHATBOT)
2024
private MessageType type; // 메시지 표시 타입
21-
private LocalDateTime timestamp;
25+
private LocalDateTime createdAt; // 생성 시간 (timestamp → createdAt으로 변경)
2226

2327
// 단계별 추천 관련 데이터 (type이 RADIO_OPTIONS 또는 CARD_LIST일 때 사용)
2428
private StepRecommendationResponseDto stepData;
@@ -30,12 +34,14 @@ public class ChatResponseDto {
3034
public ChatResponseDto(String message) {
3135
this.message = message;
3236
this.type = MessageType.TEXT;
33-
this.timestamp = LocalDateTime.now();
37+
this.sender = MessageSender.CHATBOT;
38+
this.createdAt = LocalDateTime.now();
3439
}
3540

3641
public ChatResponseDto(String message, StepRecommendationResponseDto stepData) {
3742
this.message = message;
38-
this.timestamp = LocalDateTime.now();
43+
this.sender = MessageSender.CHATBOT;
44+
this.createdAt = LocalDateTime.now();
3945
this.stepData = stepData;
4046

4147
// stepData 내용에 따라 type 자동 설정

src/main/java/com/back/domain/chatbot/service/ChatbotService.java

Lines changed: 52 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -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

Comments
 (0)