예외와 트랜잭션 커밋, 롤백 - 활용

학습 페이지

기존에 이런 의문이 들었다. 스프링은 기본정책이, 체크 예외는 커밋하고 언체크 예외는 롤백하는 것으로 되어있을까?

스프링은 다음과 같이 예외를 고려한다.

런타임 예외**(언체크 예외)**는 복구가 불가능한 예외, 반면에 체크 예외는 비즈니스 로직과 관련되어있는 비즈니스 예외

💡물론 이런 기본 정책은 rollbackFor 를 통해 따르지 않을 수 있다.

비즈니스 예외라는게 뭘까? 다음의 예시를 보자. 주문시 상황에 따라 다음과 같이 조치한다.

  1. 정상 - 주문시 결제를 성공하면 주문 데이터를 저장하고 결제 상태를 ‘완료’로 처리한다.
  2. 시스템 예외 - 주문시 내부에 복구 불가능한 예외가 발생하면 전체 데이터를 롤백한다.
  3. 비즈니스 예외 - 주문시 결재 잔고가 부족하면 주문 데이터를 저장하고, 결제 상태를 대기로 처리한다. 이때 고객에게 잔고 부족을 알리고 별도의 계좌로 입금하도록 한다.

이때 결제 잔고가 부족하면 NotEnoughMoneyException 이라는 체크 예외가 발생한다고 해보자. 이런 체크예외의 발생은 시스템에 문제가 생겼다는게 아님. 오히려 시스템이 정상적으로 동작하고 있다는 의미이다. 이런 예외를 비즈니스 예외라고 한다. 비즈니스 예외는 매우 중요하고 반드시 처리해야하는 경우가 많아 체크예외로 둔다.

위 상황을 직접 실습해보자.

package hello.springtx.order;

public class NotEnoughMoneyException extends Exception {

    public NotEnoughMoneyException(String message){
        super(message);
    }
}

이런 비즈니스 예외는 발생시 롤백하면 안된다. 오히려 커밋하되, 예외가 발생했다는 상태로 커밋을 해줘야 한다.