Spring 6

[Spring] 한 명의 오류가 전체 배치를 롤백시킨 이유: 트랜잭션 경계 재설계 기록

들어가면서정기 결제, 포인트 적립, 쿠폰 지급과 같이 금액이 직접적으로 연관된 시스템에서가장 중요한 것은 처리 속도가 아니라 데이터 정합성과 안정성입니다.정기 결제 배치 시스템을 운영하던 중단 한 명의 결제 실패가 이미 성공한 여러 건의 결제까지 모두 롤백되는 문제를 경험했습니다.더 큰 문제는로그에는 실제 예외가 발생한 위치가 아닌 UnexpectedRollbackException만 남아 있어서원인을 파악하는 데 생각보다 많은 시간이 소요되었다는 점이었습니다.이 글은 당시 문제를 해결하는 과정에서 제가 무엇을 놓치고 있었고트랜잭션을 어떻게 다시 바라보게 되었는지를 정리하기 위해 작성하게 되었습니다.본 글에서는 다음 세 가지를 중심으로 이야기를 풀어보려 합니다.UnexpectedRollbackExcepti..

Spring 2025.12.24

[Spring] @Transactional이 동작하지 않는 이유: Proxy와 내부 호출(Self-Invocation)의 함정

들어가면서스프링 환경에서 트랜잭션을 관리할 때, 우리는 마법처럼 편리한 @Transactional 어노테이션에 익숙해져 있습니다.하지만 이 '마법'이 때로는 우리를 배신하기도 합니다.분명 어노테이션을 붙였는데도 롤백이 안 되거나, 아예 트랜잭션이 적용되지 않는 상황을 마주하게 됩니다.데이터 정합성과 직결되는 트랜잭션 처리에서 이러한 문제는 치명적인 장애로 이어질 수 있습니다.따라서 "왜 안 되는지"에 대한 명확한 이해는 선택이 아닌 필수입니다.이 글에서는 스프링 트랜잭션의 '마법'이 벗겨지는 순간, 즉 AOP Proxy 패턴의 구조적 한계를 직접 코드로 파헤치고 그 해결책을 알아봅니다.AOP와 Proxy@Transactional이나 @Cacheable 같은 어노테이션이 마법처럼 동작할 수 있는 이유는 스..

Spring 2025.12.09

Function Calling으로 LLM에게 메서드 제공하기 (feat. AI Agent)

들어가며Spring AI를 공부하면서 가장 인상 깊었던 기능이 바로 Tool Calling(Function Calling)입니다.그동안은 프롬프트와 RAG를 통해서만 LLM에 외부 정보를 전달할 수 있었지만, 이제는 LLM이 직접 외부에 접근할 수 있는 시대가 열렸습니다.물론 모든 모델이 이 기능을 지원하는 것은 아닙니다. 예를 들어 Ollama에서는 해당 기능이 가능한 모델에 Tools 라벨이 표시됩니다.Spring AI 공식 문서에서는 Tool Calling의 활용 범위를 크게 두 가지로 설명하고 있습니다.정보 검색: 데이터베이스, 웹 서비스, 파일 시스템 또는 웹 검색 엔진과 같은 외부 소스에서 정보를 검색 (예: RAG 구현)조치 수행: 이메일 전송, 데이터베이스에 새 레코드 생성, 양식 제출, ..

Spring 2025.08.10

Advisor로 LLM에 추가 정보 제공 및 응답 가공하기 (feat. RAG)

들어가면서Spring AI는 최근 1.0.0 정식 버전으로 출시되며, 내부 구조와 주요 기능이 대폭 정리되었습니다.그중에서도 LLM을 실무에서 안전하고 유연하게 다루기 위해 반드시 이해해야 할 핵심 기능이 바로 Advisor입니다.Advisor는 LLM 호출 전/후의 데이터를 가공하거나 보강할 수 있는 인터셉터(Interceptor) 역할을 수행합니다.이를 통해 외부 정보를 주입하거나, 민감한 응답을 걸러내는 등의 고급 흐름 제어가 가능합니다.Spring AI의 Advisor는 다음과 같은 작업에 활용됩니다:프롬프트 전처리: 고정 지시문 추가, 외부 문서 삽입(RAG), 로깅 등응답 후처리: 민감한 내용 필터링, 마스킹, 응답 포맷 보정, 로깅 등이번 글에서는 Advisor의 구조와 동작 방식을 예제와 ..

Spring 2025.08.03

Spring AI로 LLM 연결하기(Feat: ollama)

들어가면서올해 초 LLM에 관심이 생겨 이것저것 찾아보다가 Spring AI를 알게 되었고, 최근 정식 버전인 1.0.0이 출시되면서 본격적으로 공부하게 되었습니다.제가 느끼기에 Spring AI는 LLM 연결을 매우 쉽게 도와주며, 다음과 같은 다양한 기능을 제공합니다:프롬프트 전처리/후처리를 위한 AdvisorJSON → DTO 구조화 출력 지원LLM이 메서드를 직접 호출하는 Function CallingRAG, MCP, 멀티모달 등 다양한 고급 기능 지원덕분에 이제는 Python 기반 도구가 아니더라도, Java 환경에서도 LLM을 효과적으로 활용할 수 있게 되었습니다.이 블로그 시리즈는 총 3편으로 구성될 예정이며, 각 주제는 다음과 같습니다:Spring AI로 LLM 연결하고 구조화된 출력하기A..

Spring 2025.07.27

[Spring] Factory Method Pattern 사용하기 (Feat: injecting Collections)

Factory Method Pattern이란?팩토리 메소드 패턴에서는 객체를 생성하기 위한 인터페이스를 정의하는데, 어떤 구현체의 인스턴스를 만들지는 구현체 클래스에서 결정하게 만드는 패턴입니다.결합도를 낮추고 캡슐화와 추상화를 통해 유지보수성을 높이기 위해서 사용됩니다.Factory Method Pattern의 역할생성 과정을 캡슐화하여 생성 과정의 변경 사항은 호출자에게 투명성을 가집니다.생성 과정을 재사용할 수 있습니다.복잡한 생성 과정을 캡슐화하므로, 호출자는 객체 생성 방벙을 알 필요가 없습니다.생성 과정과 사용 과정을 분리하여 복잡한 코드를 간결하게 바꿀 수 있습니다.injecting Collections이란?Spring에서 선언됨 Interface에 여러개의 구현체가 있을 경유 List, S..

Spring 2025.03.23