JSCODE Logo
JSCODE 박재성JSCODE 제이온JSCODE 시니
온라인 강의프로그래밍 과외책/전자책무료 강의
유튜브블로그
후기
완강 후기 이벤트블로그 리뷰 이벤트AWS SAA 합격 후기 이벤트
회사명 : JSCODE대표 : 박재성사업자 등록번호 : 244-22-01557통신판매업 : 제 2023-인천미추홀-0381 호

서울특별시 구로구 경인로 20가길 11(오류동, 아델리아)

Copyright ⓒ 2026 JSCODE - 최상위 현업 개발자들의 프로그래밍 교육 All rights reserved.

이용약관개인정보처리방침

실무에 바로 적용하는 Spring AI: Spring 서비스에 챗봇·RAG·MCP 도입하기

백엔드 개발자를 위한 LLM 기초

Prompt란 무엇일까?
Tokens란 무엇일까? /
Embeddings란 무엇일까? / Semantic Space
Fine Tuning이란 무엇일까?
RAG란 무엇일까?
AI Models란 무엇일까?
AI Model Providers란 무엇일까?

Spring AI 기본기

Spring AI란 무엇일까? / 백엔드 개발자가 왜 Spring AI를 배워야할까?
Spring AI 1.0 GA의 탄생
Spring AI와 LangChain - 어떤 도구를 선택해야 할까?
Spring AI와 LangChain - Chat Model 쉽게 이해하기
Spring AI와 LangChain - VectorStore 인터페이스

Spring AI 핵심 구성요소

핵심 컴포넌트 - ChatClient, Advisors, Prompts, Models, Structured Output
Spring AI ChatClient란 무엇일까?
Spring AI Advisor란 무엇일까?
Spring AI Prompts란 무엇일까?
Spring AI Models이란 무엇일까?
Spring AI Structured Output이란 무엇일까?

Spring AI로 만드는 채팅 API — 클라우드(OpenAI)와 로컬(Ollama

[실습] Spring AI 로컬 환경 설정 - Spring Boot 4.x, Gradle
[실습] OpenAI API Key 발급받기
[실습] OpenAI API를 활용한 채팅 API 환경 구축
[실습] Swagger UI를 활용한 테스트 - OpenAI API
[실습] Ollama 설치하기 / Hugging Face란 무엇일까? / GGUF
[실습] Ollama를 활용한 채팅 API 환경 구축
[실습] Swagger UI를 활용한 테스트 - Ollama
Spring AI 응답의 형태 - ChatClient Responses
[실습] Streaming으로 Flux 형태로 응답받기

실무에 쓰는 챗봇 만들기 - ‘대화 기억’부터 ‘CS 문의 자동 분류’까지

Spring AI Prompts - Chat Options란 무엇일까?
Spring AI Prompts - 프롬프트 엔지니어링 9가지 패턴
[실습] CLI 챗봇 개발 환경 아키텍처 미리보기
[실습] Chat Memory Advisor로 메모리 기능 추가하기
[실습] Chat Service 구현 - Advisor, CONVERSATION_ID
[실습] Spring Boot에서 CLI 기능 구현 및 테스트하기
[실습] Chat Controller 구현 - call과 stream 방식의 Chat REST API
[실습] Structured Output Converter를 통한 쇼핑몰 CS 문의 긴급도 분류하기

Vector Database와 유사도 검색 - RAG를 위한 핵심 개념

Vector Database란 무엇일까?
Vector Database Cosine Similarity란 무엇일까? / Spring AI의 Similarity Score
Spring AI Vector Store API
Metadata Filters란 무엇일까?

RAG 챗봇 만들기 - 데이터 전처리부터 ElasticSearch 연동까지

LLM 한계 극복을 위한 RAG 도입
실무에서 Spring AI를 통한 RAG 구현 방법
고품질 RAG를 위한 데이터 전처리 - Extract, Transform, Load
Spring AI RAG 기본 설계
[실습] RAG 챗봇 개발을 위한 로컬 환경 구축
[실습] RAG ETL 파이프라인 구현
[실습] RAG Advisors 구현
[실습] RAG Service 구현
[실습] RAG CLI 구현 및 실행 테스트
[실습] RAG REST API 구현
[실습] Docker 설치
[실습] ElasticSearch 기반 VectorStore로 변경하기

AI와 외부 시스템 연결하기 - Tool Calling으로 API 호출 자동화

Spring AI Tool Calling과 작동 프로세스
[실습] Tool Calling 개발 환경 구축
[실습] 지역별 날씨 조회 외부 API Tool 구현
[실습] Tool Service 구현
[실습] ToolCallingManager 설정
[실습] ToolChatConfig, ToolController 구현 - CLI, REST API
[실습] CLI 및 REST API 테스트

MCP로 완성하는 AI 연동 - Client & Server 개발과 외부 서버 활용

MCP란 무엇일까?
Tool Calling VS MCP
[실습] 아키텍처 미리보기
[실습] MCP Client 개발 환경 구축
[실습] MCP Server 개발 환경 구축
[실습] 외부 MCP Server와 연동한 실시간 날씨 조회 - MCP Client 개발
[실습] 외부 MCP Server와 연동한 실시간 날씨 조회 - MCP Server 개발
[실습] 외부 MCP Server와 연동한 실시간 날씨 조회 - MCP 연동
[실습] CLI 및 RestAPI 테스트
← 블로그 목록으로 돌아가기

[실습] CLI 및 RestAPI 테스트

JSCODE 시니
JSCODE 시니
2026. 06. 13.
author
JSCODE 시니
category
Spring AI
createdAt
Jun 13, 2026 09:55 AM
isPublic
isPublic
series
실무에 바로 적용하는 Spring AI: Spring 서비스에 챗봇·RAG·MCP 도입하기
slug
practice-testing-mcp-integration-cli-and-rest-api
type
post
updatedAt

✅ 1. CLI 설정

  • 기존의 CommandLineRunner 활용
 
 
 

✅ 2. McpController

McpController.java
package com.jscode.tool.rest; @RestController @RequestMapping("/mcp") public class McpController { private final McpService mcpService; public McpController(McpService mcpService) { this.mcpService = mcpService; } public record PromptBody( @NotEmpty @Schema(description = "대화 식별자", example = "jscode") String conversationId, @NotEmpty @Schema(description = "사용자 입력 프롬프트", example = "안녕하세요, 제주도 날씨 어떤지 알려주세요!") String userPrompt, @Nullable @Schema(description = "시스템 프롬프트(선택)", example = "당신은 유능한 어시스턴트입니다.") String systemPrompt, @Nullable @Schema(description = "채팅 옵션(선택)", implementation = DefaultChatOptions.class) DefaultChatOptions chatOptions ) {} @PostMapping(value = "/call", produces = MediaType.APPLICATION_JSON_VALUE) public ChatResponse call(@RequestBody @Valid PromptBody promptBody) { Prompt prompt = createPrompt(promptBody); // 완성된 프롬프트와 conversationID를 가지고 서비스 메서드 호출 return mcpService.call(promptBody.conversationId, prompt); } @PostMapping(value = "/stream", produces = MediaType.TEXT_EVENT_STREAM_VALUE) public Flux<String> stream(@RequestBody @Valid PromptBody promptBody){ Prompt prompt = createPrompt(promptBody); return mcpService.stream(promptBody.conversationId, prompt); } private static Prompt createPrompt(PromptBody promptBody) { List<Message> messages = new ArrayList<>(); if(promptBody.systemPrompt() != null && !promptBody.systemPrompt().isBlank()){ messages.add(new SystemMessage(promptBody.systemPrompt())); } messages.add(new UserMessage(promptBody.userPrompt())); Prompt.Builder promptBuilder = Prompt.builder().messages(messages); if(promptBody.chatOptions() != null){ promptBuilder.chatOptions(promptBody.chatOptions()); } return promptBuilder.build(); } }
 
 
 

✅ 3. RestAPI 테스트 - 외부 MCP

spring: application: name: tool # 애플리케이션 이름 ai: mcp: client: stdio: type: ASYNC enabled: true #MCP Client 활성화 initialized: true request-timeout: 5s startup-timeout: 60s connections: weather-mcp-server: command: /Users/siyeon/Downloads/tool/.venv/bin/python # MCP 서버 실행 Python 경로 args: - -m - mcp_weather_server # MCP 서버 실행 인자 # local-mcp-server: # command: java # args: # - "-jar" # - "/Users/siyeon/Downloads/mcp-server/build/libs/mcp-server-0.0.1-SNAPSHOT.jar" # - "--spring.main.banner-mode=off" # Spring Boot 배너 비활성화 (JSON 파싱 에러 방지) # - "--logging.pattern.console=" # 콘솔 로그 패턴 비우기 (JSON 프로토콜 오염 방지) # - "--spring.main.web-application-type=none" # 톰캣(Tomcat)을 끄고 비웹(STDIO) 모드로 구동 # sse: # connections: # local-mcp-server: # url: http://localhost:8081
notion image
 
 
 

✅ 4. RestAPI 테스트 - 우리가 작성한 MCP

spring: application: name: chat # 어플리케이션 이름 ai: mcp: client: enabled: true # MCP Client 활성화 type: SYNC # MCP Client 타입 stdio: connections: # weather-mcp-server: # command: /Users/jm/myenv/bin/python # MCP 서버 실행 Python 경로 # args: # - -m # - mcp_weather_server # MCP 서버 실행 인자 local-mcp-server: command: /usr/bin/java args: - -jar - /Users/siyeon/Downloads/mcp-server/build/libs/mcp-server-0.0.1-SNAPSHOT.jar - --spring.main.banner-mode=off # Spring Boot 배너 비활성화 - --logging.pattern.console= # 콘솔 로그 패턴 비우기 - --spring.ai.mcp.server.stdio=true # STDIO 기반 MCP 서버 활성화 - --spring.main.web-application-type=none # 웹 서버 기능 생략 (비웹 모드)
notion image
 
 
 

✅ 5. CLI 테스트 - SSE 방식

app: cli: enabled: true # CLI 모드 활성화 여부 chat: default-system-prompt: "한국어를 사용하는 tool 지원 AI 입니다." # 기본 system prompt ... 중략 sse: connections: local-mcp-server: url: http://localhost:8081
notion image