AOP2 @Transactional을 붙였는데 롤백이 안 된다고요? 스프링 AOP 프록시 내부 호출(Self-Invocation)의 함정 안녕하세요, 여러분의 든든한 IT 길잡이 데브프리입니다. 스프링 부트(Spring Boot)로 백엔드를 개발하다 보면 특정 로직이 실패했을 때 데이터베이스를 이전 상태로 되돌리기 위해 @Transactional 어노테이션을 숨 쉬듯이 사용하게 됩니다. 그런데 개발 서버에서 테스트를 하던 중 등골이 서늘해지는 상황을 마주할 때가 있습니다. 명백하게 데이터베이스 저장 도중 런타임 예외(RuntimeException)가 발생해서 에러 로그가 시뻘겋게 찍혔는데, DB를 확인해 보니 데이터가 롤백(Rollback)되지 않고 버젓이 저장되어 있는 기현상입니다. "어? 분명히 메서드 위에 @Transactional을 예쁘게 붙여놨는데 왜 롤백이 안 된 거지?" 오늘은 실무에서 백엔드 개발자들이 가장 많이 당하는 함정.. 2026. 8. 14. 예외 처리(try-catch)를 했는데 왜 롤백될까? UnexpectedRollbackException 완벽 해결법 안녕하세요, 여러분의 든든한 IT 길잡이 데브프리입니다. 스프링 부트(Spring Boot)로 백엔드 비즈니스 로직을 짜다 보면 이런 요구사항을 흔히 마주합니다. "고객이 주문을 완료하면 핵심 데이터(주문 정보)는 무조건 DB에 저장되어야 하고, 부가적인 데이터(주문 이력 로그) 저장에 실패하더라도 메인 주문은 절대 취소(롤백)되면 안 됩니다!" 이 요구사항을 구현하기 위해 백엔드 개발자들은 아주 자연스럽게 이력 저장 로직을 try-catch 문으로 감싸서 에러를 무시하도록 코드를 작성합니다. 하지만 실서버에 배포하고 로그 저장이 실패하는 순간, 잡았다고 생각했던 에러는 온데간데없고 뜬금없이 아래와 같은 시뻘건 에러가 터지며 주문까지 통째로 롤백(Rollback)되어 버립니다.Javaorg.springf.. 2026. 8. 13. 이전 1 다음