열렬히.뛰기

코드분석 (2) : AI

Projects > 코드분석 (2) : AI

domain -> repository -> service -> dto -> controller

전체 로직 : 사용자가 요청시 → DB에서 일기를 불러와서 → 처리해주고 → AI 서버로 보내줌 → 다시 반환

Domain

코드 전체를 하나하나 보지 말고, 숲을 보자.

  • private으로 선언된 변수들 : DB와 연결되는 변수들.
  • public DailyAiInfo() : 생성자
  • public DailyAiInfo updateAiResult() : diarySummaryreplyContent를 업데이트
  • public DailyAiInfo updateAiResult() : replyStatus를 업데이트합니다.

repository

Spring Data JPA를 사용하여 데이터베이스와 상호작용

  • @Query : JPA가 기본적으로 제공하지 않는 커스텀 쿼리를 만들어줌.
  • 그 밑의 메소드 : @Query에 작성된 쿼리를 실행하는 메서드

service

1. AIService 클래스

AIService는 AI와 통신하여 일기 요약, 감정 분석, 편지 생성을 요청하는 역할을 합니다. 이 클래스는 AI API를 호출하고, 응답 데이터를 처리하여 DB에 저장하는 로직을 포함하고 있습니다.

generateRequestData:
	•	사용자의 페르소나와 14일~2일 전 일기 데이터를 바탕으로 AI 요청에 필요한 
		DTO(DailyAiLetterRequestDTO)를 생성합니다.
	•	AI에게 일기 데이터를 요약하고 감정을 분석할 수 있도록 데이터를 포맷팅하는 
		작업을 수행합니다.

requestLetter:
	•	AI API(AI_LETTER_URL)를 호출하여 사용자에게 
		응답 편지를 요청합니다.
	•	restTemplate을 사용하여 AI API에 POST 요청을 
		보내고, 응답 데이터를 처리합니다.

requestDiarySummary:
	•	AI에게 일기 데이터를 요약해달라고 요청하는 API(AI_SUMMARY_URL)를 호출합니다.

requestEmotion:
	•	AI에게 감정 분석을 요청하는 API(AI_EMOTION_URL)를 호출하여 감정 데이터를 반환받습니다.
	•	긍정, 중립, 부정의 감정을 각각 분석하고 그 결과를 반환합니다.

requestToAI:
	•	AI와 통신하여 여러 데이터를 종합적으로 처리하는 핵심 메서드입니다.
	•	사용자 일기 데이터를 가져와, AI에게 편지 요청, 감정 분석, 일기 요약을 요청하고 그 결과를 처리하여
		DailyAiInfo 엔티티로 저장합니다.
	

2. DailyAIReplyService 클래스

DailyAIReplyService는 AI 응답 데이터(DailyAiInfo)를 조회하고 관리하는 서비스입니다.

주로 AI가 생성한 편지 데이터를 조회하고, 사용자에게 반환하거나 DB에 저장하는 역할을 합니다.

findByIdAndUserId:
	•	특정 AI 응답 데이터(ID 및 사용자 ID로 식별)를 조회하여 해당 데이터를 반환합니다.
	•	조회된 데이터를 기반으로 응답 상태를 'Y'로 업데이트합니다.

findByCreatedDateAndUserIdOrderByCreatedDateDesc:
	•	사용자 ID와 날짜를 기준으로 최근 AI 응답 데이터를 조회합니다. 응답 데이터는 
		날짜 순으로 정렬됩니다.

save:
	•	AI 편지를 저장하는 메서드입니다. 먼저 해당 날짜에 대한 기존 AI 응답 데이터를 조회하고, 
		기존 데이터가 없을 경우 AI에게 새로운 편지를 요청하여 저장합니다.
	•	사용자 등급 및 일정 조건에 따라 편지 생성 여부를 제한하거나, 기존 데이터를 반환하는 로직이 
		포함되어 있습니다.

findByMonthAndUserId:
	•	특정 연도와 월에 해당하는 AI 요약 데이터를 조회합니다. 
		월별 데이터를 조회할 때, 안내 편지를 제외한 데이터를 반환하도록 필터링합니다.

dto

1. client 패키지의 DTO

client 패키지 안의 DTO들은 서버와 클라이언트 간의 데이터 통신을 위해 사용됩니다. 클라이언트에서 서버로 데이터를 요청하거나, 서버가 클라이언트에게 응답할 때 주고받는 정보가 이 패키지의 DTO들에 담깁니다.

  • 용도: 클라이언트와 서버 간의 데이터 전송
  • 주요 특징: 클라이언트가 AI와 관련된 기능을 요청하고, 서버는 그 결과를 클라이언트에 반환합니다.

주요 DTO들:

  1. AILetterRequestDTO: 사용자가 특정 날짜에 대해 AI 분석을 요청할 때 전달되는 정보입니다. 클라이언트에서 서버로 전송되는 요청 데이터입니다.
  2. AILetterResponseDTO: AI가 생성한 편지를 클라이언트에게 반환할 때 사용하는 응답 데이터입니다. 서버에서 클라이언트로 전송되는 응답 데이터입니다.
  3. AnalyzeMaxInfoDTO: 감정 분석 결과 중에서 최대 감정 점수를 포함한 데이터를 클라이언트에 전달하는 DTO입니다.
  4. DiarySummaryResponseDTO: AI가 분석한 일기 요약 데이터를 클라이언트에게 전달하는 DTO입니다.
  5. WeekEmotionsResponseDTO: 일주일 동안의 감정 분석 결과를 클라이언트에게 전달하는 DTO입니다. 감정 통계 데이터를 반환할 때 사용됩니다.

2. fastapi 패키지의 DTO

fastapi 패키지의 DTO들은 서버와 외부 AI 서비스 간의 통신에 사용됩니다. 이 패키지의 DTO들은 서버가 AI API(FastAPI)를 호출할 때 요청 및 응답 데이터를 처리하는 데 사용됩니다.

  • 용도: 서버와 AI 서비스(FastAPI) 간의 데이터 전송
  • 주요 특징: 서버가 외부 AI 서비스를 호출하여 편지 생성, 감정 분석, 일기 요약 등의 기능을 요청하고, 그 결과를 처리합니다.

주요 DTO들:

  1. DailyAiEmotionResponseDTO: AI 감정 분석 결과를 AI API로부터 받아오는 응답 데이터입니다.
  2. DailyAiLetterRequestDTO: AI에게 일기 데이터와 페르소나 정보를 보내어 편지를 생성하도록 요청할 때 사용하는 데이터입니다.
  3. DailyLetterSummaryResponseDTO: AI API로부터 받은 편지 요약 결과를 처리하는 응답 데이터입니다.
  4. DiaryContentDTO: AI에게 분석할 일기 데이터를 전달할 때 사용되는 DTO입니다. 일기 내용을 AI API에 전송합니다.
  5. DiarySummaryDTO: AI에게 전달할 요약된 일기 데이터를 포함하는 DTO입니다.

controller

전체적인 동작 요약

  1. AI 편지 목록 조회 (getAILetters): 클라이언트는 특정 날짜 또는 가장 최근의 AI 편지 목록을 조회할 수 있습니다.
  2. 특정 AI 편지 조회 (getAILetter): 특정 ID로 AI 편지를 조회할 수 있습니다.
  3. 월별 요약 조회 (getSummaryAtMonth): 특정 연도와 월에 해당하는 AI 일기 요약 데이터를 조회할 수 있습니다.
  4. AI 편지 생성 (save): 새로운 AI 편지를 생성하는 요청을 처리합니다.