Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
12 changes: 12 additions & 0 deletions src/main/java/com/finz/controller/CoachController.java
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,8 @@
import lombok.extern.slf4j.Slf4j;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.*;
import com.finz.dto.coach.CoachMessageDto;
import java.util.List;

@Slf4j
@RestController
Expand Down Expand Up @@ -41,4 +43,14 @@ public ResponseEntity<CoachResponseDto> sendMessage(@RequestBody MessageRequest
CoachResponseDto response = coachService.generateResponse(DEFAULT_USER_ID, request);
return ResponseEntity.ok(response);
}

// 그간의 대화 내역 조회
@GetMapping("/history")
@Operation(summary = "대화 내역 조회", description = "AI 코치와의 전체 대화 내역을 조회합니다.")
public ResponseEntity<List<CoachMessageDto>> getChatHistory() {
log.info("대화 내역 조회 요청 - userId: {}", DEFAULT_USER_ID);

List<CoachMessageDto> history = coachService.getChatHistory(DEFAULT_USER_ID);
return ResponseEntity.ok(history);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -11,4 +11,6 @@ public interface CoachMessageRepository extends JpaRepository<CoachMessage, Long
// 사용자별 최근 대화 조회 (최신순)
List<CoachMessage> findTop20ByUserIdOrderByCreatedAtDesc(Long userId);

// 채팅방 입장 시 '전체' 대화 내역을 불러오기 위한 메서드 (시간 오름차순)
List<CoachMessage> findByUserIdOrderByCreatedAtAsc(Long userId);
}
30 changes: 30 additions & 0 deletions src/main/java/com/finz/dto/coach/CoachMessageDto.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,30 @@
package com.finz.dto.coach;

import com.finz.domain.coach.CoachMessage;
import com.finz.domain.coach.MessageSender;
import com.finz.domain.coach.MessageType;
import lombok.Builder;
import lombok.Getter;

import java.time.LocalDateTime;

// 과거 채팅 내역 조회용 DTO
@Getter
@Builder
public class CoachMessageDto {
private Long messageId;
private MessageSender sender;
private MessageType messageType;
private String content;
private LocalDateTime createdAt;

public static CoachMessageDto fromEntity(CoachMessage entity) {
return CoachMessageDto.builder()
.messageId(entity.getMessageId())
.sender(entity.getSender())
.messageType(entity.getMessageType())
.content(entity.getContent())
.createdAt(entity.getCreatedAt())
.build();
}
}
15 changes: 14 additions & 1 deletion src/main/java/com/finz/service/CoachService.java
Original file line number Diff line number Diff line change
Expand Up @@ -33,7 +33,20 @@ public class CoachService {
private final GoalRepository goalRepository;
private final ExpenseRepository expenseRepository;
private final GeminiApiClient geminiClient;


@Transactional(readOnly = true) // 데이터 변경이 없는 조회 작업
public List<CoachMessageDto> getChatHistory(Long userId) {
log.info("대화 내역 조회 - userId: {}", userId);

// 1. Repository를 통해 엔티티 조회 (시간 오름차순)
List<CoachMessage> messages = messageRepository.findByUserIdOrderByCreatedAtAsc(userId);

// 2. 엔티티 리스트를 DTO 리스트로 변환
return messages.stream()
.map(CoachMessageDto::fromEntity) // DTO의 팩토리 메서드 사용
.collect(Collectors.toList());
}

// 빠른 제안: 목표 설정 대화 시작
@Transactional
public CoachResponseDto startGoalSettingConversation(Long userId) {
Expand Down