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

wangjh789·2022년 8월 21일
0

[Spring] 스프링-DB-2

목록 보기
16/21

예외 발생시 스프링 트랜잭션 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("대기");
    }

테스트 코드는 클라이언트 코드로써의 예시를 보여준다.

profile
기록

0개의 댓글