
앱 개발 과정에서 새로운 기능을 테스트하고자 백엔드 API를 준비하면서 start.spring.io에서 프로젝트를 생성하는 중, 2023년 12월 1일부터 새로 추가된 것으로 보이는 Spring AI 라이브러리를 발견했습니다. 이미 JPA의 사용 편의성, 생산성, 그리고 객체지향적인 특성 등 다양한 기능을 경험하고 JPA을 선호하는 저로서는 이 새로운 라이브러리를 바로 활용해보고 싶어 이 글을 작성하게 되었습니다.
프로젝트환경
자바17
Spring Boot 3.2.3버전
Gradle - Groovy
IDE

일단 제일 보편적인 ChatGPT을 활용해서 코드을 작성해보겠습니다.
ChatGPT Plus+ 유저라도 OpanAI는 별개이기에 최소 5달러 충전해서 사용해야한다.
기능마다 필요한 라이브러리가 다르니 문서을 참고해주세요.
repositories {
mavenCentral()
maven { url 'https://repo.spring.io/milestone' }
}
dependencies {
implementation 'org.springframework.ai:spring-ai-openai-spring-boot-starter'
}
dependencyManagement {
imports {
mavenBom "org.springframework.ai:spring-ai-bom:${springAiVersion}"
}
}
spring.ai.openai.api-key=
spring.ai.azure.openai.embedding.options.model=text-embedding-ada-002
선택 spring.ai.openai.base-url= 기본값은 api.openai.com입니다.
복잡한 추가 설정이나 다른 구성 파일이 필요 없어 바로 시작할 수 있으며, 단지 컨트롤러에 OpenAiChatClient 인스턴스를 주입하는 것만으로 OpenAI 서비스를 호출하고 응답을 처리할 수 있습니다. 이렇게 하면, 복잡한 초기 설정 과정 없이도 손쉽게 OpenAI의 기능을 활용하여 프로젝트을 빠르게 구축할 수 있습니다.
// @RestController 어노테이션을 사용하여 Json 형태로 객체 데이터를 반환
@RestController
public class ChatGPT_Controller {
// OpenAiChatClient
private final OpenAiChatClient chatClient;
// 생성자에 @Autowired 어노테이션을 사용하여 OpenAiChatClient 객체의 의존성 주입을 요청하기
// 스프링 컨테이너는 OpenAiChatClient 타입의 빈을 찾아 이 변수에 자동으로 할당합니다.
@Autowired
public ChatGPT_Controller(OpenAiChatClient chatClient) {
this.chatClient = chatClient;
}
// @RequestParam을 사용하여 "message"라는 이름의 요청 파라미터를 String 타입의 message 변수에 바인딩합니다.
// 메세지가 없을시 기본 값을 "안녕하세요"으로 설정하여, 요청에서 message 파라미터가 누락된 경우 기본값을 사용합니다.
@GetMapping("/ai/generate")
public Map generate(@RequestParam(value = "message", defaultValue = "안녕하세요 ") String message) {
// chatClient의 call 메소드를 호출하여 입력받은 메시지를 처리하고,
// "generation"이라는 키와 함께 결과를 Map 객체로 래핑하여 반환합니다.
// 이 Map 객체는 JSON 형식으로 클라이언트에게 응답됩니다.
return Map.of("generation", chatClient.call(message));
}
// 비동기 스트림 처리 방식
// 반환 타입: Flux<ChatResponse>를 반환합니다.
// Flux는 Project Reactor에서 제공하는 반응형 프로그래밍을 위한 API 중 하나로,
// 여러 개의 데이터 아이템을 시간에 걸쳐 처리하고 반환할 때 사용합니다.
@GetMapping("/ai/generateStream")
public Flux<ChatResponse> generateStream(@RequestParam(value = "message", defaultValue = "Tell me a joke") String message) {
Prompt prompt = new Prompt(new UserMessage(message));
return chatClient.stream(prompt);
}
}
관련 글
저는 OpenAiChatClient 인스턴스가 주입이 안되는데.. dependency추가하시고나서 바로 주입이 되었나요??