이것이 Spring AI다 - 텍스트 및 음성 대화에서 MCP Server까지 Spring AI의 모든 것
신용권 지음 / 한빛미디어 / 2025년 8월
평점 :
장바구니담기



생성형 AI 애플리케이션을 만든다고 하면 대개 파이썬을 먼저 떠올리게 된다. 랭체인이나 라마인덱스처럼 검증된 툴킷이 풍부하고, 공개 자료도 많아 프로토타이핑이 빠르기 때문이다. 그러나 서비스 현장은 또 다른 언어로 움직인다. 백엔드가 JVM 계열이고 Spring Boot로 구축된 시스템이라면, “AI를 어떻게 붙일 것인가”가 곧바로 실무의 문제로 바뀐다. 파이썬 생태계에서 익숙했던 개념들을 자바와 스프링의 문법으로 다시 정렬해 주고, 그 위에 RAG와 도구 호출, 그리고 최근 가장 뜨거운 화두인 MCP까지 연결해 보여준다.


Spring AI를 한 문장으로 요약하면, 자바 개발자가 생성형 AI 기능을 기존 스프링 방식으로 자연스럽게 통합할 수 있게 만드는 프레임워크라 할 만하다. OpenAI, Hugging Face 등 다양한 LLM을 자동으로 구성하고, 여러 벡터 저장소 연동도 지원한다. 대화 기억, RAG, 도구 호출 같은 핵심 기능이 단편적인 예제로 흩어져 있지 않고, 스프링 부트 개발자가 실제로 프로젝트를 만들 때 밟게 되는 순서로 정리되어 있다는 점이 이 책의 강점이다. 


1장에서 개발 환경을 구축하고, 2장 이후 반복해서 사용하게 될 공통 코드와 UI 구성 요소를 먼저 설명함으로써, 중간에 길을 잃지 않도록 발판을 마련한다. 의존성에 OpenAI 스타터를 추가하여 OpenAI가 제공하는 모델을 호출하는 흐름은 “스프링스럽게” 깔끔하게 정리되어 있는데, 예제 실행을 위해 application.properties에 API 키를 입력해야 하는 기본 사항을 명확히 짚어주는 것도 실습서로서의 책임감이 느껴진다. 이어서 ChatClient, SystemMessage, UserMessage 같은 구성 요소를 설명하며, LLM을 호출하는 방식이 단순한 문자열 요청이 아니라 “대화 문맥을 설계하는 일”이라는 감각을 자연스럽게 체득하게 한다.


중반 이후부터 책은 확실히 속도를 올린다. 9장 대화 기억에서는 Apache Cassandra 같은 분산 NoSQL 데이터베이스를 기억 저장소로 활용하는 흐름을 Docker 컨테이너로 구성하고, VS Code에서 Cassandra 확장까지 설치해 확인한다. 대화 기억을 단순히 메모리로 처리하는 수준이 아니라, 저장소를 선택하고 운용하는 관점으로 확장해 주기 때문에, “챗봇 데모”를 넘어 “서비스”에 가까운 감각을 얻는다.


11장 도구 호출은 생성형 AI가 ‘말만 잘하는 모델’에서 ‘일을 처리하는 모델’로 넘어가는 관문을 다룬다. @Tool 어노테이션으로 도구를 정의하고, LLM이 전달하는 매개값 외에 애플리케이션이 직접 관리하는 정보를 ToolContext로 주입하는 방식은, 도구 호출을 단순한 함수 실행이 아니라 ‘안전한 경계 설정’으로 이해하게 만든다. 파일 관리 도구나 인터넷 검색 도구를 결합하는 예제 역시, 실제 업무에서 바로 떠올릴 법한 형태로 구성되어 있어 실습의 체감도가 높다.


그리고 이 책의 하이라이트는 12장 MCP이다. MCP는 요즘 생성형 AI 업계에서 가장 자주 언급되는 키워드 중 하나인데, 이 책은 이를 “유형별 조합”으로 정리하며 이해의 부담을 낮춘다. 클라이언트와 서버 간 통신 방식부터 짚고, JSON-RPC 메시지 기반의 주고받음을 바탕으로, 동일 PC에서 서버를 구동할 때는 STDIO 방식, 다른 PC에서 구동될 때는 SSE 방식으로 통신한다는 구분을 명확히 보여준다. 특히 SSE는 한 번 연결을 구성한 뒤 서버가 지속적으로 데이터를 밀어주는 방식이라는 설명이, 실제 운영 관점에서 왜 이런 통신이 필요한지 감을 잡게 한다.


부록의 구성 또한 실무적이다. OpenAI API 키 발급 방법을 안내하는 데서 멈추지 않고, 외부 서버 실행을 위해 Docker Desktop 설치를 진행하며, 로컬 LLM을 위한 Ollama 설치와 llama3.2 2.3b 모델 다운로드 및 실행까지 이어진다. 여기서 독자는 “클라우드 LLM만이 답이 아니다”라는 선택지를 손에 넣는다. 비용과 보안, 지연 시간 같은 현실적인 제약 속에서 로컬 실행이 왜 필요해지는지를, 도구 설치와 실행 경험을 통해 납득하게 된다.


실습 흐름도 설득력이 있다. 먼저 MCP Server를 구성하고(build.gradle 의존성, application.properties 설정, 자바 파일에서 제공 도구 정의와 도구 메타정보 설정, 최종 jar 산출), 그 다음 해당 서버를 사용하는 애플리케이션을 구성한다. STDIO 방식에서는 애플리케이션 구동 시 서버도 함께 떠야 하므로 구성 파일에 MCP Server를 등록하고, LLM으로부터 도구 호출 요청을 받으면 애플리케이션이 MCP Server에 실행을 지시한 뒤 결과를 LLM에게 전달하는 전체 경로를 따라간다. 


서버 설정을 담은 JSON 파일에 서버 이름과 실행 파일 경로를 나열하고, 필요한 API KEY나 ACCESS TOKEN을 지정하는 방식은, “도구를 기능별로 분리해 여러 MCP Server로 운영하는 편이 사용하기 좋다”는 조언과 맞물려 설계 감각까지 전달한다. 또한 도구 호출 정보를 프롬프트의 시스템 텍스트에 포함시키지 않으면 할루시네이션 위험이 커진다는 경고는, 기술을 ‘되게 하는 법’에서 끝나지 않고 ‘안전하게 쓰는 법’까지 끌어올려 준다.


책을 덮고 나면 전체 구조가 또렷하게 남는다. 9장까지는 생성형 AI를 다루는 기본기, 10장 RAG, 11장 도구 호출, 12장 MCP는 중고급 주제를 다루며 최신 흐름을 밀도 있게 담아낸다. 텍스트 대화부터 멀티모달, 임베딩과 벡터 저장소, 대화 기억과 RAG, 도구 호출과 MCP까지 한 권에서 이어지니, 독자는 “어떤 기능을 언제 끼워 넣어야 하는지”라는 개발자의 질문에 답을 얻게 된다.


#SpringAI #스프링AI #SpringBoot #스프링부트 #Java #자바개발 #백엔드개발 #AI개발 #생성형AI #LLM #OpenAI #HuggingFace #ChatModel #ChatClient #프롬프트엔지니어링 #RAG #벡터DB #벡터저장소 #임베딩 #대화기억 #ToolCalling #도구호출 #MCP #MCPServer #JSONRPC #STDIO #SSE #Docker #Ollama




댓글(0) 먼댓글(0) 좋아요(2)
좋아요
공유하기 북마크하기찜하기 thankstoThanksTo