[Spring AI] #2. AiConfig 분석 – OpenAI API 연결 설정
※ 인프런 강의 Spring AI 실전 가이드: RAG 챗봇 만들기를 실습하는 내용입니다.
※ 해당 강의 코드를 코틀린 → 자바로 언어를 바꿔 진행하기 때문에 일부 코드 및 구현부가 다를 수 있습니다.
※ 실습이지만 코드를 직접 까보는 내용을 기록하는 포스팅이므로 강의 내용과 상이할 수 있습니다.
[Spring AI] #1. LLM 호출 실습 시작 – 구조 먼저 실행해보기
[Spring AI] #2. AiConfig 분석 – OpenAI API 연결 설정 방법
[Spring AI] #3-1. ChatService 분석 – 메시지 생성과 모델 호출 흐름
[Spring AI] #3-2. ChatService 분석 – buildRequestPrompt()로 요청 준비하기
[Spring AI] #3-3. ChatService 분석 – internalCall()로 요청과 응답 재구성 흐름 파악하기
[Spring AI] #4. ChatController 분석 – 요청 처리와 응답 흐름 정리
AiConfig 분석
AiConfig는 아래와 같은 코드를 가지고 있었으며 어노테이션에 대한 간략한 설명은 아래와 같습니다.
- @Configuration : 해당 클래스가 설정 클래스임을 선언합니다.
- @Value("${spring.ai.openai.api-key}") : application.properties에 정의된 spring.ai.openai.api-key 값을 불러와 변수에 담습니다.
- @Bean : 메서드가 반환하는 객체를 Spring Bean으로 등록하며 이 메서드는 Spring IoC 컨테이너가 호출하여 관리합니다.
@Configuration
public class AiConfig {
@Value("${spring.ai.openai.api-key}")
private String apiKey;
@Bean
public OpenAiApi openAiApi() {
return OpenAiApi.builder()
.apiKey(apiKey)
.build();
}
}
메서드의 반환 타입을 보면 OpenAiApi로 되어 있는데, 이는 Spring AI에서 OpenAI와의 통신을 담당합니다.
이후 메서드 안의 코드를 보면 정적 메서드 builder()를 호출하게 되는데 내부적으로 빌더 패턴 객체를 반환하며 이 빌더 객체는 apiKey, baseUrl, completionsPath 등 설정을 담을 수 있습니다.
apiKey()의 경우 OpenAiApi$Builder 클래스의 setter 메서드로써 API 호출할 때 Authorization 헤더에 포함될 OpenAI의 API Key를 설정해줍니다. 즉, OpenAI 서버와 통신을 할 때 "Authorization: Bearer sk-xxxx...." 처럼 사용되며 해당 메서드는 아래와 같이 구현되어 있습니다.
만약 전달받은 매개변수(simpleApiKey)가 null일 경우 Assert.notNull() 메서드에 의해 IlleagalArgumentException을 발생 시킵니다.
null이 아닐 경우엔 SimpleApiKey(ApiKey 인터페이스를 구현한 클래스)객체를 생성하며 다시 한번 null을 체크하고 value 필드에 값을 저장하며 최종적으로 생성된 SimpleApiKey 객체는 OpenAiApi$Builder의 apiKey필드에 주소값이 저장됩니다.
※ apiKey() 메서드와 SimpleApiKey() 생성자에서 null 체크 중복을?
중복되는 apiKey() 메서드의 null 체크를 부분을 제거하여 https://github.com/spring-projects/spring-ai/pull/3654 으로 PR을 올렸으며, 승인되어 merge 되었습니다. 다음 버전에서는 apiKey() 메서드에서 중복 체크하는 부분이 사라질 것으로 보입니다.
마지막으로 this는 빌더 객체 자신(this)을 반환하여 메서드 체이닝을 사용할 수 있도록 하기 위함이며 이는 빌더 패턴 객체를 직접 코드로 구현할 때 들어가는 부분입니다.
즉 AiConfig는 Spring AI에서 OpenAI API를 사용하기 위한 설정 클래스로써 API Key를 기반으로 OpenAiApi 객체를 Bean으로 등록하여 다른 컴포너트들이 OpenAI와 통신할 수 있도록 해주는 역할을 수행합니다.