트랜잭션4 @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. 회원가입 API가 5초나 걸린다고요? @TransactionalEventListener로 스파게티 코드 분리하기 안녕하세요, 여러분의 든든한 IT 길잡이 데브프리입니다. 백엔드 서버를 개발하다 보면 서비스 규모가 커질수록 하나의 API에 수많은 요구사항이 덕지덕지 붙기 시작합니다. 처음에는 단순히 DB에 회원 정보를 저장하기만 했던 '회원가입 API'가 있다고 가정해 봅시다.시간이 지나면서 기획팀의 요구에 따라 "가입 시 환영 이메일 발송", "가입 축하 1,000 포인트 지급", "슬랙(Slack) 알림 전송" 기능이 끝없이 추가됩니다. 이 모든 로직을 UserService.register()라는 하나의 메서드에 욱여넣으면 어떤 일이 발생할까요? 이메일 발송 서버가 느려지면 사용자는 회원가입 버튼을 누르고 5초 동안 멍하니 로딩 화면만 봐야 합니다. 더 최악인 것은, 이메일 발송에 실패해서 예외가 터지면 회원가입.. 2026. 8. 6. 트랜잭션(Transaction)이란? '은행 송금' 비유와 ACID 속성 완벽 정리! 안녕하세요, 여러분의 든든한 IT 길잡이 데브프리입니다. 스프링 부트(Spring Boot)로 게시판이나 쇼핑몰을 만들다 보면, DB에 데이터를 저장하는 서비스 로직 위에 마법의 단어인 @Transactional을 무심코 붙이게 됩니다. "이걸 붙이면 데이터가 안전하게 저장된대!" 하고 넘어가기 쉽지만, 백엔드 기술 면접에서 "트랜잭션이 무엇이고, ACID 속성이 무엇인지 설명해 보세요"라는 질문을 받으면 눈앞이 캄캄해지곤 합니다. 데이터베이스를 다루는 개발자라면 숨 쉬듯이 알아야 하는 이 개념! 오늘은 복잡한 컴퓨터 공학 용어 대신, '은행 계좌 이체'라는 아주 직관적인 비유를 통해 트랜잭션의 개념과 4가지 핵심 속성(ACID)을 평생 잊지 않게 정리해 드리겠습니다. 1. 트랜잭션(Transaction.. 2026. 7. 13. 이전 1 다음