[Spring DB] 트랜잭션과 예외

olsohee·2023년 6월 13일
0

Spring DB

목록 보기
4/4

예외 발생시 스프링 트랜잭션 AOP는 예외 종류에 따라 트랜잭션을 커밋하거나 롤백한다.

  • 체크 예외(Exception) 발생 -> 커밋

  • 언체크 예외(RuntimeException, Error) 발생 -> 롤백

그렇다면 스프링은 왜 체크 예외는 커밋하고 언체크 예외는 롤백할까? 스프링은 체크 예외는 비즈니스 의미가 있을 때 사용하고, 언체크 예외는 복구 불가능한 예외로 가정한다. 물론 이런 정책을 꼭 따를 필요는 없으며, rollbackFor 옵션을 사용해서 체크 예외도 롤백할 수 있다.

  • 체크 예외: 비즈니스적 의미가 있을 때 사용 -> 커밋

  • 언체크 예외: 복구 불가능한 예외 -> 롤백

고객이 주문을 하는 상황을 예로 들었을 때, 다음과 같은 상황들이 발생할 수 있다.

  • 정상: 주문시 결제를 성공하면 주문 데이터를 저장하고 결제 상태를 '완료' 처리한다.

  • 시스템 예외: 주문시 내부에 복구 불가능한 예외가 발생하면 전체 데이터를 롤백한다.

  • 비즈니스 예외: 주문시 결제 잔고가 부족하면 주문 데이터를 저장하고 결제 상태를 '대기'로 처리한다. 그리고 고객에게 잔고 부족을 알리고 별도의 계좌로 입금하도록 안내한다.

위 상황에서 비즈니스 예외의 경우, 트랜잭션을 커밋하여 고객의 주문 데이터를 저장하고 고객에게 별도의 계좌로 입금하도록 알려야 한다. 이 경우 롤백하면 주문 데이터 자체가 사라지기 때문에 롤백하면 안된다. 이렇게 시스템에 문제가 있어서 발생하는 예외가 아닌 비즈니스 상황에서 문제가 되어 발생한 예외를 비즈니스 예외라 하고, 이런 비즈니스 예외는 별도의 처리를 해야 하는 경우가 많으므로 체크 예외를 발생시키고 커밋해야 한다. 만약 비즈니스 상황에 따라 체크 예외의 경우에도 커밋하지 않고 롤백하고 싶다면, rolllbackFor 옵션을 사용하면 된다.

profile
공부한 것들을 기록합니다.

0개의 댓글

관련 채용 정보