전체 글
-
이번 포스트에서는 MCP의 통신 방식에 대해 살펴보자. MCP 통신 방식 MCP 통신 아키텍쳐MCP 통신은 다음의 3 layer 아키텍쳐를 따른다.클라이언트/서버 계층인 MCP Client와 MCP Server는 각각 클라이언트와 서버 측 프로토콜 작업을 관리하며 둘 다 통신 관리를 위해 MCP Session을 사용한다. 세션 계층인 MCP Session은 Server와 Client의 통신 상태를 관리한다.전송 계층인 MCP Transport는 Stdio, SSE, WebSocket 등 여러 전송 구현을 지원하며 JSON-RPC 메시지의 직렬화와 역직렬화를 처리한다.JSON-RPC(JSON-Remote Procedure Call)은 JSON으로 원격 함수를 호출하고 결과를 JOSN을 받는 프로토콜로 가볍..
02. MCP 통신 방식이번 포스트에서는 MCP의 통신 방식에 대해 살펴보자. MCP 통신 방식 MCP 통신 아키텍쳐MCP 통신은 다음의 3 layer 아키텍쳐를 따른다.클라이언트/서버 계층인 MCP Client와 MCP Server는 각각 클라이언트와 서버 측 프로토콜 작업을 관리하며 둘 다 통신 관리를 위해 MCP Session을 사용한다. 세션 계층인 MCP Session은 Server와 Client의 통신 상태를 관리한다.전송 계층인 MCP Transport는 Stdio, SSE, WebSocket 등 여러 전송 구현을 지원하며 JSON-RPC 메시지의 직렬화와 역직렬화를 처리한다.JSON-RPC(JSON-Remote Procedure Call)은 JSON으로 원격 함수를 호출하고 결과를 JOSN을 받는 프로토콜로 가볍..
2026.01.22 -
이번 포스트에서는 MCP의 개념에 대해 살펴보자. MCP(Model Context Protocol) MCP의 정의와 문제 상황MCP(Model Context Protocol)란 AI 모델(LLM)이 외부 데이터(구글 드라이브, GitHub 등)나 도구와 통신할 때 사용하는 오픈 표준 규약으로, 앤트로픽(Anthropic)이 개발하여 오픈소스로 공개했다.왜 MCP라는 개념이 등장했는지 생각해 보자.ChatGPT, Claude, Gemini 같은 LLM을 이용해 내 컴퓨터의 파일 내용을 읽거나 구글 캘린더를 확인하려면 어떻게 해야 할까?Spring 개발자라면 Spring AI의 'Tool Calling' 기능을 이용해 구현할 수 있다. Spring AI는 라이브러리 내부에서 모델별 차이를 추상화해주므로,..
01. MCP란?이번 포스트에서는 MCP의 개념에 대해 살펴보자. MCP(Model Context Protocol) MCP의 정의와 문제 상황MCP(Model Context Protocol)란 AI 모델(LLM)이 외부 데이터(구글 드라이브, GitHub 등)나 도구와 통신할 때 사용하는 오픈 표준 규약으로, 앤트로픽(Anthropic)이 개발하여 오픈소스로 공개했다.왜 MCP라는 개념이 등장했는지 생각해 보자.ChatGPT, Claude, Gemini 같은 LLM을 이용해 내 컴퓨터의 파일 내용을 읽거나 구글 캘린더를 확인하려면 어떻게 해야 할까?Spring 개발자라면 Spring AI의 'Tool Calling' 기능을 이용해 구현할 수 있다. Spring AI는 라이브러리 내부에서 모델별 차이를 추상화해주므로,..
2026.01.21 -
이번 포스트에서는 github에 자바 알고리즘 문제에 대한 mr 이 전달된 경우 자동으로 AI가 피드백을 달아주도록 파이프라인을 구축해보자.🚀 개요목표: Merge Request(MR)가 생성되면 AI가 자동으로 코드를 읽고 분석 댓글 작성사용 기술: GitLab CI/CD, Python, Google Gemini 2.5 Flash API환경: Synology NAS (Self-hosted GitLab Runner) 준비물 Google Gemini API 키 발급Google AI Studio에서 API 키를 발급받는다. Gemini 2.5 Flash 모델 정도 쓰면 매우 강력한 추론 성능을 무료(Free Tier 기준)로 사용할 수 있다. GitLab Access Token 발급 받기MR에 분석 결..
Gitlab actions를 이용한 algorithm MR 피드백 처리이번 포스트에서는 github에 자바 알고리즘 문제에 대한 mr 이 전달된 경우 자동으로 AI가 피드백을 달아주도록 파이프라인을 구축해보자.🚀 개요목표: Merge Request(MR)가 생성되면 AI가 자동으로 코드를 읽고 분석 댓글 작성사용 기술: GitLab CI/CD, Python, Google Gemini 2.5 Flash API환경: Synology NAS (Self-hosted GitLab Runner) 준비물 Google Gemini API 키 발급Google AI Studio에서 API 키를 발급받는다. Gemini 2.5 Flash 모델 정도 쓰면 매우 강력한 추론 성능을 무료(Free Tier 기준)로 사용할 수 있다. GitLab Access Token 발급 받기MR에 분석 결..
2026.01.14 -
이번 포스트에서는 SSH 키를 생성해서 Github에 등록하는 과정을 정리해보자. SSH 키 생성 및 적용 로컬에서 SSH 키(공개키/비밀키)생성# 새 SSH 키 생성 (이미 있다면 건너뛰기)ssh-keygen -t rsa -b 4096 -C "github-actions@multitools"# 저장 위치 물어보면 엔터 (기본값: ~/.ssh/id_rsa)# 패스워드 물어보면 엔터 (비밀번호 없이 생성) 공개키를 Synology NAS에 복사# 공개키를 NAS에 복사 # 22: 서버의 ssh port 번호 ssh-copy-id -p server_ssh_port userid@host_address# 또는 수동으로 복사하는 방법:cat ~/.ssh/id_rsa.pub | ssh quietjun@quietj..
SSH 키 생성이번 포스트에서는 SSH 키를 생성해서 Github에 등록하는 과정을 정리해보자. SSH 키 생성 및 적용 로컬에서 SSH 키(공개키/비밀키)생성# 새 SSH 키 생성 (이미 있다면 건너뛰기)ssh-keygen -t rsa -b 4096 -C "github-actions@multitools"# 저장 위치 물어보면 엔터 (기본값: ~/.ssh/id_rsa)# 패스워드 물어보면 엔터 (비밀번호 없이 생성) 공개키를 Synology NAS에 복사# 공개키를 NAS에 복사 # 22: 서버의 ssh port 번호 ssh-copy-id -p server_ssh_port userid@host_address# 또는 수동으로 복사하는 방법:cat ~/.ssh/id_rsa.pub | ssh quietjun@quietj..
2026.01.14 -
이번 포스트에서는 DB To DB가 아니라 RestApi로 제공되는 데이터를 백업하는 과정을 살펴보자. RestApi Backup 결재 정보 처리를 위한 Model 처리먼저 결재 정보를 페이지 단위로 서비스하는 Rest API를 생각해보자.먼저 sakila 쪽에는 페이지 단위로 결재 정보를 반환하는 쿼리 처리가 필요하다. SELECT payment_id, customer_id, staff_id, rental_id, amount, payment_date, last_update FROM payment ORDER BY payment_id ASC limit 10 offset #{offset} // SakilaMapper.javapublic interface Sakila..
10. RestApi Batch이번 포스트에서는 DB To DB가 아니라 RestApi로 제공되는 데이터를 백업하는 과정을 살펴보자. RestApi Backup 결재 정보 처리를 위한 Model 처리먼저 결재 정보를 페이지 단위로 서비스하는 Rest API를 생각해보자.먼저 sakila 쪽에는 페이지 단위로 결재 정보를 반환하는 쿼리 처리가 필요하다. SELECT payment_id, customer_id, staff_id, rental_id, amount, payment_date, last_update FROM payment ORDER BY payment_id ASC limit 10 offset #{offset} // SakilaMapper.javapublic interface Sakila..
2026.01.10 -
이번 포스트에서는 Batch 작업 실패 시 대처를 위한 fault tolerant에 대해 살펴보자. FaultTolerant 전략Tolerant란 관대한이라는 뜻이다. FaultTolerant는 따라서 실패에 관대한 내 결함성을 의미한다.지난 포스트에서 살펴봤던 시나리오를 다시 생각해보자.중간에 작은 오류가 발생하더라도 예외가 발생하고 배치 작업은 중단된다. 물론 다지 중단지점에서 재 시작 할 수는 있지만 일단 기존의 프로세스는 중단된다.긴 배치 작업을 처리하다 보면 일시적인 네트워크 오류 상황이나 DB 커넥션 풀이 부족한 상황, 외부 API 호출 실패 상황 등 순간적인 장애 등이 발생하는 경우가 왕왕 있다. 이때마다 그냥 배치를 중단 시킨다기 보다는 관대하게 몇 초 있다가 다시 시도(retry)하거..
09. Backup Batch - 5이번 포스트에서는 Batch 작업 실패 시 대처를 위한 fault tolerant에 대해 살펴보자. FaultTolerant 전략Tolerant란 관대한이라는 뜻이다. FaultTolerant는 따라서 실패에 관대한 내 결함성을 의미한다.지난 포스트에서 살펴봤던 시나리오를 다시 생각해보자.중간에 작은 오류가 발생하더라도 예외가 발생하고 배치 작업은 중단된다. 물론 다지 중단지점에서 재 시작 할 수는 있지만 일단 기존의 프로세스는 중단된다.긴 배치 작업을 처리하다 보면 일시적인 네트워크 오류 상황이나 DB 커넥션 풀이 부족한 상황, 외부 API 호출 실패 상황 등 순간적인 장애 등이 발생하는 경우가 왕왕 있다. 이때마다 그냥 배치를 중단 시킨다기 보다는 관대하게 몇 초 있다가 다시 시도(retry)하거..
2026.01.09 -
이번 포스트에서는 배치 작업 실패 시 restart에 대해 살펴보자. 문제 상황의 이해 문제 상황대량의 데이터를 batch로 처리하다 보면 로직적인 문제 뿐 아니라 네트워크 문제, 데이터 오류 등 다양한 문제가 발생할 수 있다. 여기서는 이런 상황을 가정하여 ItemProcessor에서 payment_id==12000인 경우 임의로 오류를 발생시켜 보자.// 클래스 레벨에 Map 선언private int failCount = 3;@Bean@StepScopeItemProcessor paymentFailProcessor( @Value("#{jobParameters['yearMonth']}") String yearMonth) { return payment -> { log..
08. Backup Batch - 4이번 포스트에서는 배치 작업 실패 시 restart에 대해 살펴보자. 문제 상황의 이해 문제 상황대량의 데이터를 batch로 처리하다 보면 로직적인 문제 뿐 아니라 네트워크 문제, 데이터 오류 등 다양한 문제가 발생할 수 있다. 여기서는 이런 상황을 가정하여 ItemProcessor에서 payment_id==12000인 경우 임의로 오류를 발생시켜 보자.// 클래스 레벨에 Map 선언private int failCount = 3;@Bean@StepScopeItemProcessor paymentFailProcessor( @Value("#{jobParameters['yearMonth']}") String yearMonth) { return payment -> { log..
2026.01.08 -
이번 포스트에서는 Job을 실행시켜보자. JobOperator 기본JobOperator는 JobOperatorFactoryBean에 의해 공급되며 기본 빈으로 제공 되기 때문에 쉽게 주입받아서 사용할 수 있다.public class JobOperatorFactoryBean implements FactoryBean, ApplicationContextAware, InitializingBean { ...}JobOperator의 start()를 호출하면 JobExecution을 만들고 여기에 JobParameters를 저장해서 Job을 실행하게..
07. Backup Batch - 3이번 포스트에서는 Job을 실행시켜보자. JobOperator 기본JobOperator는 JobOperatorFactoryBean에 의해 공급되며 기본 빈으로 제공 되기 때문에 쉽게 주입받아서 사용할 수 있다.public class JobOperatorFactoryBean implements FactoryBean, ApplicationContextAware, InitializingBean { ...}JobOperator의 start()를 호출하면 JobExecution을 만들고 여기에 JobParameters를 저장해서 Job을 실행하게..
2026.01.07