기존에 이런 의문이 들었다. 스프링은 기본정책이, 체크 예외는 커밋하고 언체크 예외는 롤백하는 것으로 되어있을까?
스프링은 다음과 같이 예외를 고려한다.
런타임 예외**(언체크 예외)**는 복구가 불가능한 예외, 반면에 체크 예외는 비즈니스 로직과 관련되어있는 비즈니스 예외
💡물론 이런 기본 정책은
rollbackFor
를 통해 따르지 않을 수 있다.
비즈니스 예외라는게 뭘까? 다음의 예시를 보자. 주문시 상황에 따라 다음과 같이 조치한다.
이때 결제 잔고가 부족하면 NotEnoughMoneyException
이라는 체크 예외가 발생한다고 해보자. 이런 체크예외의 발생은 시스템에 문제가 생겼다는게 아님. 오히려 시스템이 정상적으로 동작하고 있다는 의미이다. 이런 예외를 비즈니스 예외라고 한다. 비즈니스 예외는 매우 중요하고 반드시 처리해야하는 경우가 많아 체크예외로 둔다.
위 상황을 직접 실습해보자.
package hello.springtx.order;
public class NotEnoughMoneyException extends Exception {
public NotEnoughMoneyException(String message){
super(message);
}
}
이런 비즈니스 예외는 발생시 롤백하면 안된다. 오히려 커밋하되, 예외가 발생했다는 상태로 커밋을 해줘야 한다.