Spring AI: Spring Boot 애플리케이션에 생성형 AI(Generative AI) 도입하기
요약
Spring AI는 Java 개발자가 Spring Boot 애플리케이션에 생성형 AI 기능을 쉽게 통합할 수 있도록 돕는 프레임워크입니다. AI 모델, 벡터 스토어, RAG 등을 위한 추상화된 API를 제공하여 특정 제공업체에 종속되지 않는 이식성 높은 애플리케이션 구축을 지원합니다.
핵심 포인트
- Spring 친화적인 추상화로 AI 모델 및 RAG 기능 통합 지원
- 특정 AI 제공업체에 종속되지 않는 이식 가능한 API 제공
- ChatClient, 벡터 스토어, 도구 호출 등 핵심 컴포넌트 포함
- 엔터프라이즈 Java 애플리케이션의 유지보수성 및 일관성 향상
인공지능(Artificial Intelligence)은 전문 데이터 과학 팀이 다루는 영역에서 애플리케이션 개발자가 일상적인 소프트웨어에 직접 통합할 수 있는 기능으로 변화했습니다.
Java 개발자들에게 이는 흥미로운 질문을 던집니다:
소프트웨어를 구축하는 방식을 완전히 바꾸지 않고 어떻게 Spring Boot 애플리케이션에 AI를 통합할 수 있을까?
이 지점에서 Spring AI가 등장합니다.
Spring AI는 AI 모델, 임베딩 (embeddings), 벡터 스토어 (vector stores), 도구 호출 (tool calling), 검색 증강 생성 (Retrieval-Augmented Generation (RAG)), 채팅 메모리 (chat memory) 및 기타 AI 기능들을 다루기 위한 Spring 친화적인 추상화(abstractions)를 제공합니다. 또한 애플리케이션 코드가 단일 AI 제공업체에 밀접하게 결합되지 않도록 이식 가능한 API를 제공합니다. ([—Home—][1])
이미 Spring Boot, 의존성 주입 (dependency injection), REST API, 설정 (configuration), 마이크로서비스 (microservices)에 익숙한 개발자들에게 Spring AI는 AI 지원 애플리케이션을 구축하기 위한 친숙한 프로그래밍 모델을 제공합니다.
Spring AI란 무엇인가?
Spring AI는 Java 애플리케이션에 AI 기능을 더 쉽게 통합할 수 있도록 설계된 Spring 생태계의 프레임워크입니다.
높은 수준(high level)에서 흐름은 다음과 같습니다:
Client
|
v
...
중요한 아이디어는 애플리케이션이 모든 곳에서 제공업체별 통합을 구현하는 대신, Spring AI 추상화를 통해 통신한다는 점입니다.
Spring AI는 채팅 모델 (chat models), 임베딩 (embeddings), 벡터 스토어 (vector stores), 텍스트-이미지 변환 (text-to-image), 오디오 전사 (audio transcription), 텍스트-음성 변환 (text-to-speech), 도구 호출 (tool calling) 등에 관한 API를 제공합니다. ([—Home—][1])
이는 유지보수성과 기존 Spring 아키텍처와의 통합이 중요한 엔터프라이즈 Java 애플리케이션에 특히 흥미로운 요소가 됩니다.
왜 Spring AI가 필요한가?
고객 지원 챗봇을 구축하고 싶다고 가정해 봅시다.
프레임워크가 없다면, 우리의 애플리케이션은 다음과 같은 사항들을 직접 처리해야 할 수도 있습니다:
- AI 제공업체(AI provider)로의 HTTP 요청 (HTTP requests)
- 인증 (Authentication)
- 프롬프트 구성 (Prompt construction)
- 응답 파싱 (Response parsing)
- 대화 기록 (Conversation history)
- 임베딩 (Embeddings)
- 벡터 데이터베이스 (Vector databases)
- 도구/함수 호출 (Tool/function calling)
- 에러 처리 (Error handling)
- 재시도 메커니즘 (Retry mechanisms)
- 관측 가능성 (Observability)
애플리케이션이 성장함에 따라, 이러한 AI 전용 코드들이 비즈니스 레이어(business layer) 전반에 퍼질 수 있습니다.
Spring AI는 AI 통합을 더 깔끔하게 유지하고 Spring Boot 아키텍처와 더 일관성을 가질 수 있도록 하는 추상화(abstractions)를 제공합니다.
애플리케이션 전반에 걸쳐 특정 제공업체 전용 코드를 작성하는 대신, ChatClient, 모델 API, 어드바이저(advisors), 벡터 스토어(vector stores), 도구 호출(tool-calling) 지원과 같은 Spring AI 컴포넌트를 사용할 수 있습니다. ([[Home][2]])
핵심 컴포넌트: ChatClient
Spring AI에서 가장 중요한 API 중 하나는 ChatClient입니다.
이는 채팅 모델에 프롬프트를 보내기 위한 유연한(fluent) API를 제공합니다.
기본적인 예시는 다음과 같습니다:
@RestController
@RequestMapping("/ai")
public class AIController {
...
이제 애플리케이션은 다음과 같은 엔드포인트를 노출할 수 있습니다:
GET /ai/ask?question=Explain Kafka partitioning
요청은 Spring AI를 통해 구성된 채팅 모델로 전달되며, 생성된 응답이 클라이언트로 반환됩니다.
ChatClient API는 또한 시스템 메시지(system messages), 사용자 메시지(user messages), 어드바이저(advisors), 구조화된 출력(structured output), 도구 호출(tool calling) 및 기타 고급 기능들을 지원합니다. ([[Home][2]])
AI 모델 구성하기
Spring AI는 여러 AI 제공업체와의 통합을 지원합니다.
예를 들어, OpenAI 기반 애플리케이션은 Spring AI OpenAI starter를 사용할 수 있습니다.
<dependency>
<groupId>org.springframework.ai</groupId>
<artifactId>spring-ai-starter-model-openai</artifactId>
...
정확한 의존성(dependency) 세트는 사용 중인 Spring AI 기능에 따라 달라집니다. 공식 문서에서는 호환 가능한 의존성 버전을 관리하기 위해 Spring AI BOM을 사용할 것을 권장합니다. ([[Home][3]])
설정은 애플리케이션 속성(application properties) 또는 환경 변수(environment variables)를 통해 제공할 수 있습니다.
예시:
spring.ai.openai.api-key=${OPENAI_API_KEY}
운영 환경(Production)에서는 API 키를 소스 코드에 절대 하드코딩해서는 안 됩니다. 보안이 보장된 비밀 관리(Secret-management) 메커니즘을 통해 제공되어야 합니다.
Spring AI를 활용한 프롬프트 엔지니어링 (Prompt Engineering)
간단한 프롬프트는 다음과 같이 작성할 수 있습니다:
String response = chatClient
.prompt()
.user("Explain Java CompletableFuture with an example")
...
하지만 실제 애플리케이션에서는 대개 더 많은 제어권이 필요합니다.
예를 들어, 시스템 지침(System instruction)을 제공할 수 있습니다:
String response = chatClient
.prompt()
.system("""
...
시스템 지침과 사용자 입력(User input)을 분리하는 이 방식은 도메인 특화 어시스턴트(Domain-specific assistants)를 구축할 때 특히 유용합니다.
예시:
System:
You are an internal banking support assistant.
...
이렇게 하면 AI가 애플리케이션에 의해 정의된 규칙 내에서 작동할 수 있습니다.
Spring AI와 RAG
기업용 AI 애플리케이션에서 가장 중요한 개념 중 하나는 흔히 RAG라고 불리는 **검색 증강 생성 (Retrieval-Augmented Generation)**입니다.
사내용 챗봇을 구축한다고 가정해 보겠습니다.
직원들이 다음과 같이 질문할 수 있습니다:
우리 회사의 휴가 정책은 무엇인가요?
일반적인 LLM(Large Language Model)은 회사의 최신 휴가 정책을 알지 못할 수 있습니다.
모든 프롬프트에 전체 정책 문서를 집어넣으려고 시도할 수도 있지만, 이는 금방 비효율적이 됩니다.
RAG는 이 문제를 해결합니다.
일반적인 아키텍처는 다음과 같습니다:
Documents
|
v
...
Spring AI는 벡터 저장소(Vector-store) 추상화와 RAG 관련 API를 통해 이 아키텍처를 지원합니다. Spring AI의 어드바이저(Advisor) 기반 접근 방식은 벡터 저장소에서 관련 정보를 검색하여 해당 컨텍스트(Context)를 채팅 모델에 제공할 수 있습니다. ([Home][4])
임베딩 (Embeddings)이란 무엇인가?
RAG를 이해하려면 임베딩(Embeddings)을 이해해야 합니다.
임베딩은 텍스트를 의미론적 의미(Semantic meaning)를 포착하는 수치적 표현으로 변환합니다.
예를 들어:
"How do I reset my password?"
와
"I forgot my login password."
는 서로 다른 단어를 사용하지만, 의미론적 의미는 유사합니다.
따라서 이들의 임베딩은 벡터 공간(Vector space)에서 서로 가까이 위치할 수 있습니다.
벡터 데이터베이스(Vector database)는 이러한 표현(representation)을 사용하여 의미론적으로 관련 있는 정보를 찾을 수 있습니다.
이것이 현대 AI 애플리케이션에서 벡터 스토어(Vector stores)가 매우 중요한 이유입니다.
벡터 스토어(Vector Store) 사용하기
Spring AI는 애플리케이션 코드가 공통 프로그래밍 모델을 통해 벡터 데이터베이스와 상호작용할 수 있도록 VectorStore 추상화를 제공합니다. ([ Home][1])
간소화된 예시는 다음과 같습니다:
@RequiredArgsConstructor
@Service
public class DocumentService {
...
문서가 벡터로 저장되면, 의미론적 유사성(semantic similarity)을 기반으로 검색할 수 있습니다.
이를 통해 다음과 같은 애플리케이션을 구축할 수 있습니다:
기업 문서 어시스턴트 (Company Documentation Assistant)
|
v
...
Spring AI의 어드바이저(Advisors)
Spring AI의 또 다른 강력한 개념은 **어드바이저(Advisor)**입니다.
어드바이저는 ChatClient 상호작용 주변에 추가적인 동작을 적용할 수 있게 해줍니다.
예를 들어, 어드바이저는 다음과 같은 용도로 사용될 수 있습니다:
- 대화 메모리 (Conversation memory)
- RAG (Retrieval-Augmented Generation)
- 로깅 (Logging)
- 추가 컨텍스트 (Additional context)
- 도구 호출 (Tool calling)
- 요청/응답 처리 (Request/response processing)
Spring AI는 여러 어드바이저 메커니즘을 제공하며, 공식 문서는 어드바이저가 어떻게 ChatClient 흐름에 구성(composed)될 수 있는지를 보여줍니다. ([ Home][2])
예시:
String response = chatClient
.prompt()
.advisors(advisorSpec -> advisorSpec
...
이러한 접근 방식은 AI 관련 횡단 관심사(cross-cutting behavior)가 비즈니스 로직에 직접 섞이지 않아도 되기 때문에 매우 가치 있습니다.
대화 메모리 (Conversation Memory)
모든 요청이 완전히 새로운 대화로 취급된다면 챗봇은 그리 유용하지 않을 것입니다.
다음 상황을 고려해 보세요:
사용자:
Kafka란 무엇인가요?
...
마지막 질문은 이전 대화의 문맥(context)에 의존합니다.
Spring AI는 어드바이저 아키텍처를 통해 대화 메모리를 지원합니다. 예를 들어, MessageChatMemoryAdvisor는 프롬프트(prompt)에 대화 이력을 추가할 수 있습니다. ([ Home][2])
이를 통해 애플리케이션은 더욱 자연스러운 대화를 유지할 수 있습니다.
도구 호출 (Tool Calling)
현대 AI 애플리케이션의 가장 흥미로운 기능 중 하나는 **도구 호출 (tool calling)**입니다.
단순히 텍스트를 생성하는 대신, AI 모델은 애플리케이션 함수를 실행해야 할 필요가 있다고 판단할 수 있습니다.
예시:
사용자:
12345번 주문의 상태가 어떻게 되나요?
AI는 애플리케이션 데이터가 필요하다고 판단할 수 있습니다.
흐름은 다음과 같습니다:
사용자
|
v
...
Spring AI는 도구 호출 (tool calling) 지원을 제공하며, 도구 실행을 ChatClient 흐름에 통합합니다. ([Home][5])
여기에는 중요한 차이점이 있습니다:
AI가 귀하의 데이터베이스에 직접 접근해서는 안 됩니다.
대신, AI는 제어된 애플리케이션 수준의 도구를 호출해야 합니다.
예시:
@Tool
public String getOrderStatus(String orderId) {
...
인증 (authorization), 검증 (validation), 데이터베이스 접근 (database access) 및 비즈니스 규칙 (business rules)에 대한 책임은 애플리케이션에 남아 있습니다.
AI는 무엇이 필요한지를 결정하고, 애플리케이션은 무엇을 할 수 있는지를 제어합니다.
실무적인 Spring AI 아키텍처
기업용 고객 지원 플랫폼을 가정해 보겠습니다.
┌─────────────────────┐
│ Frontend │
└──────────┬──────────┘
...
이 아키텍처를 통해 기존의 Spring Boot 서비스와 AI 기능이 공존할 수 있습니다.
예를 들어:
- Spring Security가 인증 (authentication)을 처리합니다.
- Spring Boot가 REST API를 처리합니다.
- Kafka가 비동기 이벤트 (asynchronous events)를 처리합니다.
- MySQL이 트랜잭션 데이터 (transactional data)를 저장합니다.
- 벡터 저장소 (vector store)가 의미론적 검색 (semantic search)을 처리합니다.
- Spring AI가 AI 오케스트레이션 (orchestration)을 처리합니다.
- LLM이 자연어 추론 (natural-language reasoning) 및 생성을 처리합니다.
이 지점이 바로 Spring AI가 엔터프라이즈 Java 개발자들에게 특히 유용한 이유입니다.
Spring AI + 마이크로서비스 (Microservices)
Spring AI는 마이크로서비스를 대체하지 않습니다.
대신, AI 기능은 마이크로서비스 아키텍처 내의 또 다른 구성 요소로 도입될 수 있습니다.
예시:
API Gateway
|
┌────────────────┼────────────────┐
...
AI 서비스는 REST, Kafka 또는 제어된 도구를 통해 다른 서비스와 통신할 수 있습니다.
예를 들어:
고객 문의 (Customer Query)
|
v
...
이러한 아키텍처는 AI 특화 관련 사항들이 모든 마이크로서비스 (Microservice)로 유출되는 것을 방지합니다.
Spring AI + Kafka
Spring AI는 이벤트 기반 아키텍처 (Event-driven architecture)에도 자연스럽게 통합될 수 있습니다.
고객 피드백 시스템을 예로 들어보겠습니다.
고객 (Customer)
|
v
...
예를 들어, 들어오는 피드백은 다음과 같이 분류될 수 있습니다:
긍정 (Positive)
부정 (Negative)
중립 (Neutral)
또는 다음과 같이 카테고리화될 수 있습니다:
결제 문제 (Payment Issue)
로그인 문제 (Login Issue)
배송 문제 (Delivery Issue)
...
그 결과는 다른 Kafka 토픽 (Topic)으로 발행될 수 있습니다.
이는 AI 프로세싱이 비동기적 (Asynchronous)이며, 원래의 HTTP 요청을 차단 (Block)할 필요가 없는 경우에 특히 유용합니다.
Spring AI는 어디에 사용될 수 있는가?
Spring AI는 많은 엔터프라이즈 애플리케이션 (Enterprise application)에서 사용될 수 있습니다.
1. 내부 지식 어시스턴트 (Internal Knowledge Assistant)
직원들은 다음과 같은 사항에 대해 질문할 수 있습니다:
- 정책 (Policies)
- 아키텍처 문서 (Architecture documents)
- 기술 문서 (Technical documentation)
- 인사(HR) 문서
- 제품 매뉴얼 (Product manuals)
RAG (Retrieval-Augmented Generation)는 답변이 생성되기 전에 관련 내부 콘텐츠를 검색할 수 있습니다.
2. 고객 지원 (Customer Support)
챗봇은 실시간 정보를 위해 애플리케이션 도구를 사용하면서 고객의 일반적인 질문에 답변할 수 있습니다.
예를 들어:
"내 주문 상태는 무엇인가요?"
"환불 정책은 어떻게 되나요?"
"내 패키지는 언제 도착하나요?"
3. 문서 처리 (Document Processing)
AI는 다음과 같은 문서에서 정보를 추출할 수 있습니다:
송장 (Invoices)
계약서 (Contracts)
보고서 (Reports)
...
추출된 정보는 전통적인 데이터베이스 (Database)에 저장될 수 있습니다.
4. 개발자 어시스턴트 (Developer Assistants)
다음과 같은 기능을 수행하는 내부 개발자 도구를 구축할 수 있습니다:
코드 설명 (Explain code)
단위 테스트 생성 (Generate unit tests)
로그 분석 (Analyze logs)
...
5. 로그 분석 (Log Analysis)
Spring Boot 시스템은 선택된 애플리케이션 로그를 AI 서비스로 보내 다음과 같이 물을 수 있습니다:
이 트랜잭션은 왜 실패했나요?
AI는 방대한 에러 트레이스 (Error trace)를 요약하고 발생 가능한 실패 영역을 식별할 수 있습니다.
6. 자연어 인터페이스 (Natural Language Interfaces)
여러 개의 UI 필터를 구축하는 대신:
고객 = ABC
상태 = 실패 (FAILED)
날짜 > 2026-01-01
사용자는 다음과 같이 물을 수 있습니다:
2026년 1월 1일 이후 고객 ABC의 모든 실패한 트랜잭션을 보여줘
애플리케이션은 이러한 자연어 요청을 구조화된 작업(structured operation)으로 변환할 수 있습니다.
Spring AI vs 직접적인 REST 통합 (Direct REST Integration)
자연스럽게 다음과 같은 의문이 생길 수 있습니다:
왜 RestClient나 WebClient를 사용하여 단순히 AI 제공업체의 REST API를 호출하지 않는가?
물론 그렇게 할 수 있습니다.
매우 작은 규모의 애플리케이션이라면 직접적인 API 통합도 충분히 수용 가능할 수 있습니다.
하지만 애플리케이션이 발전함에 따라 다음과 같은 추가적인 AI 관련 고려 사항들이 나타납니다:
제공업체 통합 (Provider Integration)
프롬프트 관리 (Prompt Management)
임베딩 (Embeddings)
...
Spring AI는 이러한 영역 중 많은 부분에 대해 추상화(abstractions)를 제공합니다.
따라서 가장 큰 장점은 단순히 "AI API를 호출하는 것"이 아닙니다.
진정한 장점은 익숙한 Spring 애플리케이션 아키텍처 내로 AI 역량을 가져오는 것입니다.
운영 환경 고려 사항 (Production Considerations)
개념 증명(Proof of Concept, PoC)을 구축하는 것은 쉽습니다.
AI 자동 생성 콘텐츠
본 콘텐츠는 Dev.to AI tag의 원문을 AI가 자동으로 요약·번역·분석한 것입니다. 원 저작권은 원저작자에게 있으며, 정확한 내용은 반드시 원문을 확인해 주세요.
원문 바로가기