Spring AI로 MCP 서버 만들기: 코드는 쉬운데 Spring Boot 3에서 안 뜹니다
Spring AI 2.0.1로 MCP 서버를 만들어 직접 붙여봤습니다. @McpTool 하나면 끝나는데, 그 전에 Jackson 3 때문에 Spring Boot 4로 올려야 했습니다.
Spring AI 2.0.1로 MCP 서버를 만들어 직접 붙여봤습니다. @McpTool 하나면 끝나는데, 그 전에 Jackson 3 때문에 Spring Boot 4로 올려야 했습니다.
JDK 24의 JEP 491로 synchronized pinning이 사라졌습니다. 지금 검색되는 가상 스레드 조언 절반이 낡았고, 진짜 병목은 커넥션 풀로 옮겨갔습니다.
Java 25 LTS의 JEP 18개 중 지금 바로 쓸 수 있는 것과 아직 프리뷰인 것을 구분했습니다. Scoped Values는 정식, 구조적 동시성은 아직 5번째 프리뷰입니다.
스타터 이름 변경부터 Jackson 3, 조용히 동작이 바뀌는 항목까지. Spring Boot 4.0에서 실제로 깨지는 것을 공식 가이드 기준으로 정리했습니다.
Spring Data JPA에서 엔티티를 삭제할 때 Batch update returned unexpected row count from update [0]; actual row count: 0; expected: 1 오류가 발생하는 경우가 있다. DELETE SQL 자체는 단순하지만, Hibernate가 예상한 삭제 건수와 데이터베이스가 반환한 삭제 건수가 다르면 예외로 처리될 수 있다. 특히 동일한 데이터를 여러 요청이 삭제하거나, 조회한 엔티티가 실제 DELETE 실행 전에 다른 … 더 읽기
PKCE 의무화, Implicit·ROPC 제거 등 OAuth 2.1 변경점과 Spring Security 마이그레이션 방법을 2026년 9월 기준으로 정리했습니다.
백엔드 시스템의 성능을 최적화하는 과정에서 가장 가성비가 좋고 즉각적인 효과를 볼 수 있는 기술은 단연 ‘캐싱(Caching)‘입니다. 관계형 데이터베이스(RDBMS)는 디스크 I/O를 기반으로 동작하기 때문에 물리적인 속도의 한계가 명확하며, 트래픽이 몰릴 경우 병목 현상의 주범이 됩니다. 반면 Redis와 같은 인메모리(In-Memory) 저장소는 RAM에 데이터를 저장하고 처리하므로, 디스크보다 수백 배 빠른 접근 속도를 제공합니다. 하지만 “Redis를 도입했다”는 사실만으로 모든 … 더 읽기
지난 포스팅에서 우리는 JPA의 낙관적 락과 비관적 락을 통해 데이터베이스 레벨에서 동시성 문제를 해결하는 방법을 배웠습니다. 하지만 서비스의 규모가 커져 서버가 한 대가 아닌 여러 대(Scale-out)가 되는 순간, 자바의 synchronized 키워드나 단일 애플리케이션 내부의 락은 무용지물이 됩니다. 각 서버의 메모리가 독립적이기 때문입니다. 물론 데이터베이스의 비관적 락(Pessimistic Lock)을 사용하면 서버가 여러 대여도 동시성을 제어할 수 있습니다. 하지만 DB … 더 읽기
지난 포스팅에서 우리는 JPA의 꽃이라 불리는 변경 감지(Dirty Checking)에 대해 알아보았습니다. 트랜잭션 안에서 엔티티의 값을 수정하기만 하면, JPA가 알아서 UPDATE 쿼리를 날려주는 편리한 기능이었습니다. 하지만 이 변경 감지에는 치명적인 성능적 한계가 존재합니다. 바로 “대량의 데이터를 수정해야 할 때“입니다. 예를 들어, 쇼핑몰 서비스에서 “모든 상품의 가격을 10% 인상한다”라는 요구사항이 있다고 가정해 봅시다. 상품이 100만 개라면 어떻게 될까요? 변경 … 더 읽기
Spring Data JPA를 사용하다 보면 신기한 경험을 하게 됩니다. 데이터베이스에서 객체를 조회한 후, setter 메서드로 값을 변경하기만 했는데 별도로 save()나 update() 메서드를 호출하지 않아도 DB에 변경 사항이 반영되는 현상입니다. 마치 자바 컬렉션에서 객체를 꺼내 필드를 수정한 것처럼 자연스럽게 동작합니다. 또한, 같은 ID를 가진 엔티티를 두 번 조회했는데 쿼리 로그에는 SELECT 문이 한 번만 찍히는 경우도 목격하게 됩니다. 이러한 JPA의 ‘마법’ 같은 기능 … 더 읽기