트랜잭션 - 예외

박찬우·2024년 2월 8일

스프링 DB

목록 보기
43/53

예외

  • 예외 발생시 스프링 트랜잭션 AOP는 예외의 종류에 따라 트랜잭션을 커밋하거나 롤백한다.
    • 언체크 예외인 RuntimeException , Error 와 그 하위 예외가 발생하면 트랜잭션을 롤백한다.
    • 체크 예외인 Exception 과 그 하위 예외가 발생하면 트랜잭션을 커밋한다.
    • 물론 정상 응답(리턴)하면 트랜잭션을 커밋한다.

예)

  • 롤백 or 커밋 여부 로그 설정
    • application.properties
logging.level.org.springframework.transaction.interceptor=TRACE
logging.level.org.springframework.jdbc.datasource.DataSourceTransactionManager=DEBUG
#JPA log
logging.level.org.springframework.orm.jpa.JpaTransactionManager=DEBUG
logging.level.org.hibernate.resource.transaction=DEBUG
@SpringBootTest
public class RollbackTest {

    @Autowired
    RollbackService service;

    @Test
    void runtimeException() {
        // 언체크 예외 = 롤백
        Assertions.assertThatThrownBy(() -> service.runtimeException())
                        .isInstanceOf(RuntimeException.class);
    }

    @Test
    void checkedException() {
        // 체크 예외 = 커밋
        Assertions.assertThatThrownBy(() -> service.checkedException())
                .isInstanceOf(MyException.class);
    }

    @Test
    void rollbackFor() {
        // 체크 예외이지만 롤백 설정 = 롤백
        Assertions.assertThatThrownBy(() -> service.rollbackFor())
                .isInstanceOf(MyException.class);
    }

    @TestConfiguration
    static class RollbackTestConfig {
        @Bean
        RollbackService rollbackService() {
            return new RollbackService();
        }
    }

    @Slf4j
    static class RollbackService {
        @Transactional
        public void runtimeException() {
            log.info("RuntimeException");
            throw new RuntimeException();
        }

        @Transactional
        public void checkedException() throws MyException {
            log.info("checkedException");
            throw new MyException();
        }

        @Transactional(rollbackFor = MyException.class)
        public void rollbackFor() throws MyException {
            log.info("checkedException");
            throw new MyException();
        }
    }

    static class MyException extends Exception {

    }
}
profile
진짜 개발자가 되어보자

0개의 댓글