최근 스프링 AI가 공식으로 배포가 되었고, 약간 늦었지만 이를 사용해보았습니다. Spring IO 페이지에 있는 Spring AI 공식문서를 참고하여 작업했습니다.
Spring AI는 AI 엔지니어링을 위한 애플리케이션 프레임워크입니다. 이 프레임워크의 목표는 Spring 생태계의 설계 원칙(이식성, 모듈식 설계 등)을 AI 분야에 적용하고, POJO를 애플리케이션의 구성 요소로 활용하는 방식을 AI 분야에 확산시키는 데 있습니다.
Spring AI 채팅 모델 API는 다양한 AI 모델과 상호작용하기 위한 간편하고 이식성 높은 인터페이스로 설계되어, 개발자가 최소한의 코드 변경으로 서로 다른 모델 간 전환이 가능하도록 합니다. 이러한 설계는 Spring의 모듈성과 상호교환성 철학과 부합합니다. 특히 각종 주요 LLM API 제공 업체에 맞추어 세분화된 라이브러리를 제공합니다.
또한 입력 캡슐화를 위한 프롬프트(Prompt) 클래스, 출력 처리를 위한 채팅 응답(ChatResponse) 클래스와 같은 보조 클래스의 도움으로 채팅 모델 API는 AI 모델과의 통신을 통합합니다. 요청 준비와 응답 파싱의 복잡성을 관리하여 직접적이고 간소화된 API 상호작용을 제공합니다.
Spring Boot 프로젝트를 기준으로 설명합니다.
구체적인 버전을 명시하지 않으면 Maven Repository에서 가져오기 할 때 오류가 발생합니다.
implementation 'org.springframework.ai:spring-ai-starter-model-openai:1.0.1'
이후 GPT API 콘솔에서 발급 받은 API Key를 프로젝트 설정파일에 넣어주세요.
spring.ai.openai.api-key=<your-openai-api-key>
@Configuration 어노테이션이 설정된 클래스에 위 함수를 추가하여 Bean으로 등록합니다. 이는 Spring에서 의존성 주입 (DI, Dependency Injection) 기능을 통해 ChatClient 객체를 사용가능 하게 해줍니다.
@Bean public ChatClient openAiChatClient(OpenAiChatModel chatModel) { OpenAiChatOptions defaultOptions = OpenAiChatOptions.builder() .model("gpt-4.1-nano") .temperature(0.5) .build(); return ChatClient.builder(chatModel) .defaultOptions(defaultOptions) .build(); }
이때 application.properties 에 옵션을 설정해도 되지만, 저는 OpenAiChatOptions 객체를 별도로 만들어서 구현했습니다. 선호하시는 방향으로 개발하세요.
Spring AI는 다양한 옵션을 제공합니다. Chat Properties를 참고해주세요.
GPT-5 는 Temperature 옵션을 지원하지 않습니다.
Unsupported value: 'temperature' does not support 0.7 with this model. Only the default (1) value is supported.
GPT-5 와 o4와 같은 추론을 기본적으로 사용하는 모델은 temperature 옵션을 사용할 수 없습니다.
Spring AI에서 기본적으로 지원하는 temperature의 default 값이 0.7이어서 반드시 1.0으로 설정을 해주어야 사용이 가능했습니다.
Spring AI에서 프롬프트는 단순한 문자열을 넘어서 구조화된 메시지 시스템으로 설계되었습니다. 이러한 구조화된 접근 방식은 AI와의 소통에서 뉘앙스와 효과성을 향상시키며, 프롬프트의 각 부분이 상호작용에서 별개의 명확한 역할을 수행하도록 합니다.
저는 SystemRole과 User Role만 사용하면 되어서 두개를 다음과 같이 정의했습니다.
구체적인 프롬프트 작성 방법은 Best Prompts for Text Summarization: Guide to AI Summaries를 참고했습니다.
System Role
당신은 **기술 블로그** 글을 요약하는 카피라이터입니다. 당신의 요약문은 개발을 공부하는 사람들이 원문 게시물을 읽고 싶게 만들어야 합니다. [최종 출력 조건] - 2문장 또는 3문장으로 작성. - 각 문장은 반드시 8~12 단어 사이여야 하며, 어길 경우 잘못된 출력으로 간주한다. - 자연스럽게 구어체로 작성하되 과도한 감탄/수식 금지 - 오직 요약문만 출력할 것. 불필요한 접두사/설명/메타텍스트는 금지. - 문장은 마침표로 끝내고 줄바꿈 없이 이어쓴다.
User Role
[스타일 참고 예시] ---- {examples} ---- [요약할 원문] <<< {text} >>> [요약 결과]
이렇게 생성한 String 객체를 SystemMessage, UserMessage 객체의 생성자로 전달하면 Spring AI가 정의한 메시지가 완성됩니다.
return new SystemMessage(msg);
User Role을 정의할 때 {examples}와 {text}와 같이 중괄호로 데이터를 배치했습니다. Spring AI는 실제로 API 호출시에 이 부분들을 치환하는 기능을 제공합니다.
return new UserMessage(new PromptTemplate(userMessageTemplate).render(Map.of( "examples", examples, "text", text )));
마지막으로는 만든 Message들을 List로 만들어서 프롬프트 생성 메서드 체이닝에 전달하여 완성합니다.
return chatClient.prompt() .messages(systemMessage, userMessage) .call().content();
미리 정의해둔 블로그 게시물 작성 페이지에서 생성기능을 테스트 해보았습니다. 다양한 모델을 시도해보며, 어떤 결과물이 마음에 드는 지 테스트 해보았습니다.
GPT 5 mini (입력: $0.25/1M, 출력: $2/1M, 실행시간 36s)

GPT 5 nano (입력: $0.05/1M, 출력: $0.4/1M, 실행시간 18s)

GPT 4.1 nano (입력: $0.2/1M, 출력: $0.8/1M, 실행시간 3s)

결과는 생각보다 4.1이 가장 좋았습니다. 하지만 나머지 모델이 출력 결과물보다 더 아쉬운 부분은 API 호출에 걸리는 시간이었습니다. GPT 5 관련 모델은 스펙상 매우 빠름 또는 빠름으로 표시되었지만 느릴때는 40초까지 소요되었습니다.
사실 40초면 제가 직접 Summary를 작성하면 됩니다. 그렇기 때문에 GPT 5 계열을 사용하지 않기로 했습니다.
2025-09-12 12:43:53.857 [http-nio-8080-exec-3] WARN: Slow method execution detected - finished in 34739 ms
기존에 GPT API를 직접 REST로 호출할 때는 매번 HTTP 클라이언트 설정, 요청/응답 매핑, 에러 핸들링 등을 직접 구현해야 했습니다. 하지만 Spring AI 프레임워크를 사용하니 이런 보일러플레이트 코드가 대폭 줄어들었습니다.
특히 ChatClient를 Bean으로 등록하여 의존성 주입을 통해 관리할 수 있게 된 점이 큰 장점이었습니다. 기존 REST 방식에서는 API 키 관리, 연결 설정 등을 매번 신경써야 했지만, Spring AI에서는 설정 파일에 한 번만 정의하면 끝입니다.
순수 REST 호출에서는 JSON 구조를 직접 만들어야 했지만, Spring AI의 SystemMessage, UserMessage 클래스를 통해 역할별로 명확하게 구분된 프롬프트를 작성할 수 있었습니다. 이는 단순히 편의성을 넘어서 프롬프트의 의도를 코드로 명확하게 표현할 수 있게 해줍니다.
PromptTemplate 기능은 특히 인상적이었습니다. 기존에는 String 조작으로 동적 프롬프트를 만들어야 했는데, 템플릿 엔진과 유사한 방식으로 깔끔하게 처리할 수 있게 되었습니다. {examples}, {text} 같은 플레이스홀더를 사용해 가독성과 유지보수성이 크게 향상되었습니다.
다만 GPT-5 모델의 temperature 제한 같은 모델별 특성을 미리 알기 어려웠던 점은 아쉬웠습니다. 또한 프롬프트 엔지니어링 자체의 어려움은 프레임워크가 해결해주지 못하는 영역이므로, 이 부분은 계속 학습이 필요하다고 느꼈습니다.
전반적으로 Spring AI는 개발자가 AI 통합에만 집중할 수 있도록 인프라적인 복잡성을 해결해주는 훌륭한 프레임워크라고 생각합니다. 특히 Spring 생태계에 익숙한 개발자라면 러닝 커브 없이 바로 적용할 수 있다는 점이 가장 큰 장점인 것 같습니다.