예외 발생시 스프링 트랜잭션 AOP는 예외의 종류에 따라 트랜잭션을 커밋하거나 롤백한다.
기존의 트랜잭션 인터셉터는 롤백하거나 커밋해서 트랜잭션이 끝나면 Completion을 출력해준다.
그렇기 때문에 롤백과 커밋을 구분해주는 로그가 필요하다.
logging.level.org.springframework.orm.jpa.JpaTransactionManager=DEBUG
지금 JpaTransactionManager를 사용하고 있으므로 위 코드로 등록해야 한다.
스프링은 왜 체크는 커밋하고 언체크는 롤백할까?
스프링은 예외를 다음과 같은 정의로 지정한다.
비즈니스 요구사항
1. 정상 : 주문시 결제에 성공하면 주문 데이터를 저장하고 결제 상태를 완료로 처리
2. 시스템 예외 : 주문 시 내부에 복구 불가능한 예외가 발생하면 전체 데이터를 롤백
3. 비즈니스 예외 : 주문시 결제 잔고가 부족하면 주문데이터를 저장하고 결제상태를 대기로 처리한다. 이경우 고객에게 잔고 부족을 알리고 별도의 계좌로 입금하도록 안내한다.
@Test
void complete() throws NotEnoughMoneyException {
//given
Order order = new Order();
order.setUsername("정상");
//when
orderService.order(order);
//then
Order findOrder = orderRepository.findById(order.getId()).get();
assertThat(findOrder.getPayStatus()).isEqualTo("완료");
}
@Test
void runtimeException() throws NotEnoughMoneyException {
//given
Order order = new Order();
order.setUsername("예외");
//when
assertThatThrownBy(() -> orderService.order(order))
.isInstanceOf(RuntimeException.class);
//then
Optional<Order> orderOptional = orderRepository.findById(order.getId());
assertThat(orderOptional).isEmpty();
}
@Test
void bizException(){
//given
Order order = new Order();
order.setUsername("잔고부족");
//when
try {
orderService.order(order);
} catch (NotEnoughMoneyException e) {
log.info("고객에게 잔고 부족을 알리고 별도의 계좌로 입금하도록 안내");
}
//then
Order findOrder = orderRepository.findById(order.getId()).get();
assertThat(findOrder.getPayStatus()).isEqualTo("대기");
}
테스트 코드는 클라이언트 코드로써의 예시를 보여준다.