Spring AI - Tool Calling과 MCP

김소희·2025년 11월 27일

LLM의 한계와 실무 적용의 벽

ChatGPT와 Claude의 등장은 대규모 언어 모델(LLM, Large Language Model) 시대를 활짝 열었다. LLM은 다양한 출처에서 수집되고 정제된 방대한 텍스트 데이터를 학습하여 마치 사람과 같이 대화하며 자연어 처리 작업을 수행할 수 있는 인공지능 모델이다. 하지만 이러한 LLM은 몇 가지 중요한 한계를 가지고 있다.

첫째, 특정 도메인에 대한 전문 지식이 제한적이다. 둘째, 특정 업무나 기업 환경에 최적화되어 있지 않다. 셋째, 학습 데이터 이후의 최신 정보를 알지 못한다. 넷째, 회사 내부 데이터나 개인 정보에 접근할 수 없다. 이러한 한계들은 LLM을 실무에 바로 적용하는 데 큰 장벽이 된다.

LLM의 한계를 보완하는 기술들

이러한 한계를 극복하기 위해 여러 기술들이 등장했다. 파인튜닝은 모델의 스타일이나 패턴을 조정하는 기법으로, 예를 들어 반말로 대화하던 모델을 존댓말로 바꾸는 작업을 수행한다. 요즘은 시스템 프롬프트만 잘 작성해도 파인튜닝 없이 충분한 경우가 많지만, 서비스 품질을 99% 이상 균일한 답변으로 유지해야 하는 상황에서는 여전히 필요하다.

프롬프팅은 LLM에게 지시사항을 명확하게 전달하여 원하는 결과를 얻는 기법이다. RAG(Retrieval-Augmented Generation, 검색-증강 생성)는 외부 문서나 데이터베이스에서 관련 정보를 검색하여 LLM의 응답에 활용하는 방식이다. 하지만 이러한 기법들도 처리 과정의 복잡성이나 시간 문제 등 여러 한계를 가지고 있다.

Function Calling과 Tool Use의 등장

RAG의 한계를 극복하기 위해 2023년 중반부터 OpenAI와 Anthropic은 각각 Function Calling과 Tool Use라는 기능을 도입했다. 이 기술들은 LLM이 단순히 텍스트를 생성하는 것을 넘어 실제로 함수를 호출하고, API를 사용하며, 외부 시스템과 상호작용할 수 있게 만든다.

사람들은 AI에게 단순한 대화 상대가 아닌 에이전트 비서 기능을 원한다. 일정을 관리하고, 데이터를 조회하며, 작업을 자동화하는 능력 말이다. 에이전트를 구축하기 위해서는 Tool Calling과 MCP(Model Context Protocol)가 필수적이다.

MCP(Model Context Protocol)란 무엇인가

Claude를 개발한 Anthropic은 MCP(Model Context Protocol)라는 혁신적인 프로토콜을 발표했다. MCP는 요청과 응답을 JSON으로 표준화되게 처리하는 서버를 이용해서 다양한 서비스를 LLM과 연동하게 한다. JSON RPC 규약만 지킨다면 개발자가 만든 서버도 연결이 가능하다. 다만 보안적인 측면은 좀 더 고려해야 한다.

한화에서는 내부 교육으로 파이썬과 MCP를 무려 900명이나 수강했다고 한다. 이는 개발자에게 딥러닝이나 머신러닝을 바라기보다는 MCP를 잘 활용하기를 바라는 업계의 방향성을 보여준다.

MCP를 구성하는 세 가지 핵심 요소

MCP는 Model, Context, Protocol이라는 세 개의 단어로 구성된다. 각각의 의미를 살펴보자.

Model – 행동 주체

Model은 LLM(Large Language Model), 즉 GPT, Claude, LLaMA 같은 대규모 언어 모델로서 사용자의 입력을 이해하고, 행동 계획을 세우며, 필요할 경우 도구를 호출하고, 최종적으로 응답을 생성한다. 모델은 MCP 생태계에서 의사결정을 내리는 두뇌 역할을 담당한다.

Context – 행동 기반 정보

Context는 LLM(Model)이 작업을 수행하는 데 필요한 배경 정보다. 여기에는 툴 목록, 리소스(문서, 로그, DB 스키마), 대화 히스토리, 사용자 설정 등 모든 참조 가능한 데이터가 포함된다. LLM에게 "지금 너는 이런 툴을 쓸 수 있어", "이 문서를 참고할 수 있어", "응답은 이렇게 써야 해"라는 작업 환경을 알려줘서 LLM이 Context를 바탕으로 정확한 행동을 설계하도록 한다.

Protocol – 행동 방식

Protocol은 LLM이 단순한 질문 응답을 넘어, 외부 API 호출, 데이터 조회, 툴 사용 등 복잡한 작업까지 수행할 수 있도록 지원하는 통신 규약으로서 JSON-RPC 2.0 형식으로 설계되었다. LLM이 단순히 "이 툴을 써줘"라고 하는 것이 아니라, 정해진 문법에 따라 정확한 명령 형식으로 요청을 전달하고, 응답을 받도록 하여 툴 간 호환성, 보안성, 디버깅 가능성을 확보한다.

Spring AI Tool Calling이란?

Spring AI의 Tool Calling은 LLM(모델)이 직접 "함수(function)" 또는 "API 엔드포인트"를 호출할 수 있도록 하는 기능이다. Tool Calling을 확장하면 MCP(Model Context Protocol)가 된다. Spring AI에서 Tool Calling을 구현하는 것이 곧 MCP의 핵심 개념을 실전에 적용하는 것이다.

Tool 등록 기본 구조

Spring AI에서 Tool은 주로 다음 2가지 방식으로 등록한다.

@Tool 어노테이션 사용

import org.springframework.ai.tool.Tool;
import org.springframework.stereotype.Component;

@Component
public class CalcTools {

    @Tool
    public int add(int a, int b) {
        return a + b;
    }
}

Bean으로 Tool 인터페이스 등록

import org.springframework.ai.tool.SimpleTool;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@Configuration
public class ToolConfig {

    @Bean
    public SimpleTool weatherTool() {
        return new SimpleTool(
            "getWeather",
            "Returns weather info for a given city",
            args -> {
                String city = args.get("city").asText();
                return "Today's weather in " + city + " is sunny";
            }
        );
    }
}

ChatClient에서 tool 사용하기

Spring AI는 ChatClient를 통해 Tool 호출을 자동으로 처리한다. 개발자가 일일이 함수 호출 로직을 작성할 필요가 없다.

@Autowired
private ChatClient chatClient;

public String call(String userMessage) {
    return chatClient.prompt()
            .user(userMessage)
            .tools()  // <<--- tool 자동 활성화
            .call()
            .content();
}

Tool Calling 실제 동작 예시

유저가 "3 더하기 5가 뭐야?"라고 질문했다고 가정해보자. 모델 내부에서는 다음과 같은 일이 벌어진다.

GPT는 "이건 수학 계산이구나 → add() 함수를 호출해야겠다"고 판단한다.

{
  "tool": "add",
  "arguments": { "a": 3, "b": 5 }
}

Spring AI가 자동으로 add(3,5) 메서드를 실행하고 결과값을 모델에게 다시 전달한 후 최종 답변을 생성한다.

ToolCalling 사용 시 ChatClient 흐름

String result = chatClient.prompt()
    .user("서울 날씨 알려줘")
    .tools()  // 도구 사용 가능 상태를 LLM에 전달
    .call()
    .content();

동작 순서는 다음과 같다. 첫째, LLM에게 user 메시지를 전달한다. 둘째, LLM이 필요하면 "tool 호출 요청"을 응답한다. 셋째, Spring AI가 그 tool 메서드를 실행한다. 넷째, 실행 결과를 LLM에 다시 전달한다(자동). 다섯째, LLM이 최종 답변을 생성한다. 여섯째, 우리는 .content()로 최종 답변을 받는다.

Spring AI Tool Calling의 장점

자동 함수 호출 기능은 GPT가 스스로 판단해서 직접 Java 메서드를 호출하게 한다. JSON 기반 파라미터 자동 검증으로 안정성이 확보된다. 자동 multi-step 처리로 Tool 실행 결과를 다시 모델에 전달하고 최종 응답을 생성하는 과정이 자동화된다. RAG, DB, API 연동이 쉬워져서 DB 검색, API 호출, 계산 등을 손쉽게 도구화할 수 있다.

실무에서 많이 쓰는 Tool 사례

고객 상담 챗봇

고객 정보 조회를 위한 getUserInfo(id), 주문 내역 확인을 위한 getOrderHistory(id), 주문 취소 처리를 위한 cancelOrder(id) 등의 도구를 활용한다.

사내 업무 자동화

휴가 신청을 생성하는 createVacationRequest(userId), 월별 급여를 계산하는 calculateSalary(month) 등의 도구로 업무를 자동화한다.

RAG 검색

문서를 검색하는 searchDocument(query), 유사한 임베딩 상위 5개를 가져오는 getTop5SimilarEmbeddings(vector) 등으로 검색 증강 생성을 구현한다.

시스템 점검 봇

서버 상태를 확인하는 checkServerStatus(), CPU 사용량을 조회하는 getCpuUsage(), 서비스를 배포하는 deployService(branch) 등으로 시스템 관리를 자동화한다.

Tool 사용 전후 비교

Tool 없이 LLM에게 질문하면 모델은 학습된 지식만으로 답변을 생성한다. 실시간 데이터나 내부 시스템 정보에 접근할 수 없어 제한적인 답변만 가능하다.

Tool을 사용하여 LLM에게 질문하면 모델이 필요한 도구를 호출하고, 실제 데이터를 조회하여 정확한 답변을 제공한다. 이것이 Tool Calling의 핵심 가치다.

마치며

Spring AI Tool Calling과 MCP는 LLM을 실무에 투입하기 위한 핵심 기술이다. 단순히 대화만 하는 AI가 아니라, 실제로 업무를 처리하고, 데이터를 조회하며, 시스템을 제어하는 AI 에이전트를 만들기 위해서는 이러한 기술들에 대한 이해가 필수적이다. 앞으로의 AI 개발은 모델을 학습시키는 것보다 MCP를 잘 활용하여 도구들을 연결하고 통합하는 능력이 더 중요해질 것이다.

참고자료

티스토리 - MCP

profile
백엔드 개발자의 노트

0개의 댓글