코드 저장소.

OpenFeign를 활용해서 일정추천기능 만들기. 본문

포폴/일정관리앱

OpenFeign를 활용해서 일정추천기능 만들기.

slown 2025. 4. 5. 20:50

목차

1.도입 배경

2.기술 스택 및 선택 이유

3.전체 구성

4.OpenFeign로 OpenAi 연동하기

5.프롬프트 설계 및 응답 처리

6.예외 및  장애 대응

7.결과 및 테스트

8.회고 및 다음단계

1.도입 배경

일정관리 프로젝트를 진행하면서 사용자의 하루 일정에서 비어 있는 시간대를 찾아 AI가 추천 일정을 제공해주는 기능이 필요했다. 이를 위해 OpenAI의 Chat Completions API를 사용해 프롬프트 기반 일정 생성을 시도했고, 통신은 OpenFeign + Spring Cloud를 사용해 안정적으로 구성했다.

2.기술 스택 및 선택 이유

  • Spring Boot 3.2: 기본 백엔드 프레임워크
  • OpenFeign: 외부 API(OpenAI) 호출 간결화
  • Resilience4j: 장애 발생 시 fallback 처리
  • OpenAI GPT-4o: 일정 추천 생성 로직 처리
  • Jackson + Regex: 응답 파싱 처리

3.전체 구성

[Client] → [ScheduleRecommendationController] → [ScheduleRecommendService]
           → [OpenAiClient (Feign)] → [OpenAI API]
                                     ↑
                          CircuitBreaker + Fallback 적용

4.OpenFeign으로 OpenAI 연동하기

@FeignClient(name = "OpenAi", url = "https://api.openai.com/v1",
             configuration = OpenApiConfig.class, fallback = OpenAiFallback.class)
public interface OpenAiClient {
    @PostMapping("/chat/completions")
    OpenAiResponse getChatCompletion(@RequestBody OpenAiRequest request);
}

OpenApiConfig에서 Authorization 헤더와 Retryer를 설정했고, 이후 장애를 고려해 @CircuitBreaker로 감쌌다.

5.프롬프트 설계 및 응답 처리

프롬프트는 다음과 같이 구성했다:

아래는 사용자의 일정 목록입니다.
- 4월 4일 10:00~12:00 : 회의
- 4월 4일 13:00~14:00 : 점심
빈 시간에 추천 일정을 생성해주세요.
반드시 JSON 형식만 출력해주세요.

응답 예시:

[
  {"contents": "운동", "scheduleMonth": 4, "scheduleDay": 4, "startTime": "2025-04-04T07:00", "endTime": "2025-04-04T08:00"}
]

이를 정규표현식으로 파싱:

private static final Pattern JSON_PATTERN = Pattern.compile("```json\\s*(\\[.*?])\\s*```", Pattern.DOTALL);

6.예외 및 장애 대응: Circuit Breaker + Fallback

OpenAI 응답 실패나 타임아웃 시 다음과 같은 fallback을 리턴합니다.

return List.of(Schedules.builder()
  .contents("AI 추천 일정 제공 불가 - 기본 일정")
  .build());

예외 발생 시 CheckedException → RuntimeException으로 변환해 통제 가능하게 처리했습니다.

7.결과 및 테스트

요청:

GET /api/chat/recommend?userId=test&page=0&size=5

응답:

[
  {"contents": "독서", "startTime": "2025-04-04T17:00:00"}
]

8.회고 및 다음 단계

이 기능을 구현하며 깨달은 점:

  • AI 연동은 통신이 아니라 데이터 구조화가 핵심이다.
  • 장애 대비 설계가 없으면 실제 운영에서는 치명적이다.
  • prompt 설계는 마치 API spec을 만드는 것처럼 정교해야 한다.

향후 개선할 사항:

  • 추천 일정을 사용자 일정과 자동 충돌 체크
  • 추천 일정 결과를 DB에 저장하여 사용자 히스토리 관리
  • 사용자가 원하는 일정 타입(Personal/Work 등) 기반 필터링