본문으로 건너뛰기

© 2026 Molayo

Dev.to헤드라인2026. 06. 24. 10:22

AI를 활용한 현대적인 Java: LangChain4j, Quarkus, RAG 및 MCP 실무 엔터프라이즈 적용

요약

Java 생태계에서 LangChain4j, Quarkus, RAG, MCP를 활용하여 엔터프라이즈급 AI 애플리케이션을 구축하는 실무 방법을 소개합니다. 프로토타입을 넘어 프로덕션 환경에 적합한 안정적인 아키텍처 설계와 기술 스택 통합 방안을 다룹니다.

핵심 포인트

  • LangChain4j를 활용한 Java 친화적인 AI 서비스 추상화
  • Quarkus와 LangChain4j의 네이티브 통합을 통한 성능 최적화
  • RAG 및 MCP를 이용한 데이터 컨텍스트 및 도구 경계 구축
  • LLM 프로바이더 교체가 용이한 격리된 아키텍처 설계

Java 생태계가 프로덕션 환경에서의 AI를 공식화하고 있습니다. 이 글은 프로토타입 단계를 넘어 안정적인 계약(contract) 단계로 나아가고자 하는 분들을 위한 구체적인 빌딩 블록을 소개합니다.

배경: 생태계가 보내는 신호

"Java 생태계는 이미 프로덕션에서 실행되고 있는 것들에 대해 상호 운용성 표준, 기여 거버넌스, 프레임워크 기본값 등 공식적인 구조를 부여하고 있습니다."

Moraes 교수의 통찰은 정확하며 이 글의 나침반 역할을 합니다. A2A Java SDK가 GA(1.0.0.Final)에 도달했고, Quarkus 3.37은 기본적으로 리플렉션(reflection)이 없는 Jackson 직렬화를 활성화했으며, OpenJDK 자체도 AI가 생성한 코드에 대한 규정을 마련해야 했습니다. 이는 이미 대규모로 채택이 이루어지고 있다는 신호입니다. 이제 개발자의 과제는 Java에서 AI를 사용할 것인지 여부를 평가하는 것이 아니라, 이미 안정적인 계약이 된 기술들 위에서 어떻게 구축할 것인지를 아는 것입니다.

이 글은 바로 그 점을 다룹니다. 오늘 바로 프로덕션에 적용할 수 있는 세 가지 구체적인 기둥, 즉 LLM 오케스트레이션 레이어로서의 LangChain4j, 컨텍스트 전략으로서의 RAG (Retrieval-Augmented Generation), 그리고 도구(tool)와 데이터의 경계로서의 MCP (Model Context Protocol)를 소개합니다.

LangChain4j: 당신의 스택을 이미 알고 있는 SDK

LangChain4j는 LangChain 생태계의 Java 버전이지만, 선언적 어노테이션(annotations), Spring Boot 및 Quarkus와의 네이티브 통합, 그리고 비즈니스 로직을 변경하지 않고 설정을 통해 교체 가능한 다양한 LLM 제공업체(OpenAI, Anthropic, Ollama, Azure OpenAI, Bedrock 등) 지원 등 진정한 Java 언어로 구축되었습니다.

핵심 개념은 AI Service입니다. 이는 프레임워크가 빌드 타임(또는 런타임)에 구현하는 어노테이션이 지정된 Java 인터페이스로, 프롬프트(prompt), 모델 호출, 응답 파싱의 전체 사이클을 추상화합니다.

// 인터페이스 선언 — 개발자가 작성해야 할 모든 것
@RegisterAiService(retriever = EmbeddingStoreRetriever.class)
public interface DocumentAssistant {
...

Quarkus를 사용하면 quarkus-langchain4j 확장이 CDI를 통해 서비스를 주입하고, application.properties를 통해 LLM 프로바이더를 해결하며, 네이티브 이미지 (native image)의 이점을 자동으로 적용합니다. 여기에는 Quarkus 3.37에서 기본적으로 활성화된 Jackson의 리플렉션 프리 (reflection-free) 플립이 포함되어, 애플리케이션 코드의 변경 없이도 콜드 스타트 (cold start)와 힙 (heap) 소비를 줄여줍니다.

Quarkus + 로컬 Ollama를 사용한 최소 설정

# application.properties
quarkus.langchain4j.ollama.base-url=http://localhost:11434
quarkus.langchain4j.ollama.chat-model.model-id=llama3
...

운영 환경에서는 Java 코드를 한 줄도 건드리지 않고 ollama 블록을 openai 또는 anthropic으로 교체하면 됩니다. 이러한 격리는 아키텍트가 체결해야 할 첫 번째 안정적인 계약입니다. 즉, 비즈니스 로직은 LLM 프로바이더를 결코 알 필요가 없어야 합니다.

RAG: 환각 없는 컨텍스트

언어 모델은 많은 것을 알고 있지만, 사용자의 데이터에 대해서는 아무것도 모릅니다. RAG — 검색 증강 생성 (Retrieval-Augmented Generation) — 는 이 문제를 해결하는 표준입니다. 모델을 훈련시키거나 파인튜닝 (fine-tuning) 하는 대신 (비싸고 느린 방식), 질문 시점에 자신의 데이터에서 가장 관련 있는 조각들을 검색하여 프롬프트 (prompt) 컨텍스트에 주입합니다.

파이프라인은 세 가지 고정된 단계로 구성됩니다: 인제스션 (ingestion, 문서의 파싱 및 청킹 (chunking)), 인덱싱 (indexing, 임베딩 (embeddings) 생성 및 벡터 스토어 (vector store) 저장), 그리고 검색 (retrieval, 쿼리 시점의 유사도 검색)입니다. LangChain4j는 통합된 API로 이 세 가지를 모두 지원합니다.

인제스션 파이프라인

@ApplicationScoped
public class DocumentIngestionService {

...

쿼리 시점의 검색

@ApplicationScoped
public class EmbeddingStoreRetriever implements ContentRetriever {

...

Oracle 또는 PostgreSQL (pgvector를 통해)을 사용하는 엔터프라이즈 환경의 경우, 설정을 통해 EmbeddingStore의 구현체가 교체되므로 검색 로직은 변경되지 않습니다. Oracle 기반의 운영 환경에서는 Oracle 23ai부터 사용 가능한 Oracle AI Vector Search가 추가적인 인프라 구성 요소를 제거할 수 있는 옵션이 됩니다.

"제가 사용할 의사결정 규칙은, 그 위에 구축할 수 있는 안정적인 계약(contract)과 아직은 흥미롭지만 불안정한(exciting-but-unstable) 것을 분리하는 것입니다."

Moraes 교수의 규칙을 RAG에 적용해 보겠습니다. 파이프라인 패턴(수집 (ingestion), 임베딩 (embedding), 유사도 검색 (similarity search), 증강된 프롬프트 (augmented prompt))은 안정적인 계약입니다. 아직 변동성이 있는 것은 벡터 스토어 (vector store)의 선택과 해당 도메인에 대한 최적의 청크 (chunk) 크기입니다. 두 번째 것을 조정하되, 첫 번째 것을 신뢰하십시오.

MCP: 에이전트에게 필요한 도구 경계 (tool edge)

Model Context Protocol (MCP)는 Anthropic이 주도하고 업계에서 채택한 개방형 표준으로, 도구와 데이터 소스를 언어 모델에 상호 운용 가능한 방식으로 노출합니다. RAG가 '지식'의 문제(모델이 무엇을 아는가)를 해결한다면, MCP는 '행동'의 문제(모델이 무엇을 할 수 있는가)를 해결합니다.

A2A (Agent2Agent, 에이전트 간 통신용)와 MCP (도구 및 데이터 경계용) 사이의 구분은 깔끔한 아키텍처를 구축하는 데 필수적입니다. 이 두 역할을 단일 컴포넌트에 혼합하는 것은 테스트가 불가능한 시스템으로 가는 가장 빠른 길입니다.

Quarkus에서의 MCP 서버

quarkus-mcp-server 확장은 단 하나의 어노테이션만으로 CDI 빈 (beans)을 MCP 도구로 노출합니다:

@ApplicationScoped
public class ContaCorrenteTools {

...

Quarkus는 이러한 도구들을 애플리케이션의 MCP 엔드포인트에 자동으로 등록합니다. Claude 어시스턴트든, 시스템 자체의 LangChain4j 오케스트레이터든 외부 에이전트는 Java 구현을 알 필요 없이 표준 프로토콜을 통해 도구를 발견하고 호출합니다.

AI 서비스에서 MCP 도구 사용하기

@RegisterAiService(tools = McpToolProvider.class)
public interface AssistenteFinanceiro {

...

전체 사이클은 다음과 같습니다: 사용자가 메시지를 보내면, LLM이 어떤 도구를 호출할지 결정하고, Quarkus가 자체 Java 엔드포인트를 대상으로 MCP 호출을 실행하며, 결과가 컨텍스트로서 LLM에 반환되고, 최종 응답이 실제 데이터를 바탕으로 생성됩니다. 모든 과정은 추적 가능하며 테스트 가능합니다.

세 가지의 결합: 참조 아키텍처 (Reference Architecture)

사용자의 질문부터 실제 데이터와 문서 컨텍스트를 포함한 응답에 이르기까지의 전체 흐름:

사용자
  |
  v
...

각 계층은 고유한 책임을 가집니다. AI Service (AI 서비스)가 오케스트레이션(Orchestration)을 수행합니다. RAG (검색 증강 생성)는 문서 지식을 제공합니다. MCP (Model Context Protocol)는 실시간 트랜잭션 데이터를 제공합니다. LLM (대규모 언어 모델)은 이를 합성합니다. 어떤 계층도 다른 계층을 직접 알 필요가 없으며, 오직 인터페이스 계약(Interface Contract)만을 따릅니다.

아무도 묻지 않는 질문: AI 생성 코드의 거버넌스 (Governance)

LLM이 생성한 기여를 차단하되 이해, 디버깅 및 검토를 위한 개인적 용도로만 사용하기로 한 OpenJDK의 결정과, 이와 반대되는 GraalVM의 결정은 단 하나의 정답은 존재하지 않음을 보여줍니다. 존재하는 것은 의도적인 정책의 필요성입니다. 일상적으로 AI 어시스턴트를 사용하는 팀에게 실질적인 질문은 다음과 같습니다:

  • 머지(Merge) 전 반드시 인간의 검토를 거쳐야 하는 AI 생성 아티팩트(Artifact)는 무엇인가?
  • 팀은 핵심 비즈니스 로직 조각의 출처를 어떻게 문서화하는가?
  • 코드가 자동으로 생성되는 경우에도 CI (지속적 통합) 파이프라인이 테스트 커버리지(Test Coverage)를 검증하는가?
  • "그럴듯하지만 틀린(Plausible but wrong)" 것에 대한 명시적인 기준이 있는가 — 이는 OpenJDK가 실제 검토 비용으로 식별한 리스크입니다.

이러한 질문에는 기술적인 답변(Linter 규칙, 파이프라인 게이트, 최소 커버리지 등)이 있지만, 질문을 던지기로 결정하는 것은 엔지니어링 리더십의 영역입니다.

지금 구축해야 할 것과 기대해야 할 것

Moraes 교수가 제안한 구분, 즉 "안정적인 계약(Stable Contract)" 대 "흥미롭지만 불안정한 것(Exciting-but-unstable)"으로 돌아가 보겠습니다.

지금 구축할 것:

  • 선언적(Declarative) LangChain4j를 사용한 AI Service
  • 인프라(Oracle 또는 Postgres)에서 이미 사용 가능한 벡터 스토어(Vector Store)를 활용한 RAG 파이프라인
  • 기존 CDI 빈(Beans)으로부터 MCP를 통한 도구 노출
  • AI 생성 코드에 대한 내부 거버넌스 정책

지켜보되, 아직 배포하지 말 것:

  • A2A SDK (GA 상태이나 주변 프레임워크 생태계는 여전히 변화 중)
  • Project Valhalla value classes (JDK 28에서 프리뷰(preview) 제공 예정, 다음 LTS에서도 여전히 프리뷰 상태일 가능성 높음)
  • JDK 27의 양자 내성 TLS (Post-quantum TLS) (무료로 제공된다고 가정하기 전에 핸드셰이크(handshake) 지연 시간과 로드 밸런서(load balancer)와의 호환성을 측정할 것)

Java 생태계는 표준화에 시간이 걸리는 역사가 있지만, 일단 표준화되면 수십 년 동안 지속되는 방식으로 표준화됩니다. 오늘 안정적인 계약(contracts)을 이해하는 개발자는 다른 이들이 어떤 프레임워크를 채택할지 여전히 논쟁하는 동안 견고한 토대 위에서 구축을 진행할 것입니다.

참고 문헌

AI 자동 생성 콘텐츠

본 콘텐츠는 Dev.to AI tag의 원문을 AI가 자동으로 요약·번역·분석한 것입니다. 원 저작권은 원저작자에게 있으며, 정확한 내용은 반드시 원문을 확인해 주세요.

원문 바로가기
0

댓글

0