-
@Transactional의 롤백Programming/Spring 2022. 5. 18. 19:37
@Transactional 은 메서드 단위의 비즈니스 로직에서 쿼리가 실행된 뒤 예외가 발생했을 때 롤백 해주는 역할을 수행한다.
RuntimeException을 상속한 예외에 대해서 롤백을 해준다는 배경지식만 있던 터라 미션에서 사용하고 있는 JdbcTemplate 은 어떻게 롤백이 진행되는 것인지 궁금하게 되었다.
@Transactional 에서의 JdbcTemplate 쿼리 실행은 어떻게 롤백되지?
@Transactional 은 기본적으로 rollbackFor 의 옵션이 RuntimeException.class 와 Error.class 로 설정 되어있다. JdbcTemplate 에서 예외가 터지면 SQLException 이 발생하는 줄 알았지만, JdbcTemplate의 쿼리 실행 메서드를 들어가보니 DataAccessException 을 던지고 있었다.
public class JdbcTemplate extends JdbcAccessor implements JdbcOperations { @Override public void query(String sql, RowCallbackHandler rch) throws DataAccessException { query(sql, new RowCallbackHandlerResultSetExtractor(rch)); } }
DataAccessException 은 RuntimeException 을 상속한 예외이기 때문에, JdbcTemplate 의 쿼리 실행중 예외가 발생했을 때 @Transactional 의 롤백이 진행되는 것이다.
JdbcTemplate 을 사용하지 않는다면?
JdbcTemplate 을 사용하지 않아 SQLException 이 직접적으로 발생한다면, rollbackFor 옵션을 다음과 같이 바꿔주면 된다.
@Transactional(rollbackFor = SQLException.class) public void service() { }
'Programming > Spring' 카테고리의 다른 글
AOP 용어 정리 (0) 2022.09.19 @Configuration이 붙지 않은 클래스의 메서드에 @Bean을 붙이면 어떻게 될까? (1) 2022.05.18 DI(Dependency Injection)의 종류와 장단점 (2) 2022.04.26