JSCODE Logo
블로그후기멘토진
회사명 : JSCODE대표 : 박재성사업자 등록번호 : 244-22-01557통신판매업 : 제 2023-인천미추홀-0381 호
학원 명칭 : 제이에스코드(JSCODE)원격학원학원설립ㆍ운영 등록번호 : 제6063호

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

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

이용약관개인정보처리방침
← 블로그 목록으로 돌아가기

[실습] 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