[Spring] @Transacational과 프록시
스프링은 @Transactional 애노테이션을 이용해서 트랜잭션을 처리하기 위해 내부적으로 AOP를 사용합니다. 실제로 @Transactional 애노테이션을 적용하기 위해 @EnableTransaction Management 태그를 사용하면 스
muscleking3426.tistory.com
이전 포스팅에 이어 작성하겠습니다.
@Transactional 적용 메서드의 롤백 처리
커밋을 수행하는 주체가 프록시 객체였던 것처럼 롤백을 처리하는 주체 또한 프록시 객체입니다.
try {
cps.changePassword("madvirus@madvirus.net", "3333", "1111");
System.out.println("암호 변경");
} catch (MemberNotFoundException e) {
System.out.println("회원 데이터 미존재");
} catch (WrongIdPasswordException e) {
System.out.println("암호가 올바르지 않음.");
}
해당 코드에서 WrongIdPasswordException이 발생했을 때 트랜잭션이 롤백된 것을 알 수 있습니다. 실제로 @Transactional을 처리하기 위한 프록시 객체는 원본객체의 메서드를 실행하는 과정에서 RuntimeException이 발생하면 트랜잭션을 롤백합니다.
별도 설정을 추가하지 않으면 발생한 익셉션이 RuntimeException일 때 트랜잭션을 롤백합니다. WrongIdPasswordException 클래스를 구현할 때 RuntimeException을 상속한 이유는 바로 트랜잭션 롤백을 염두에 두었기 때문입니다.
JdbcTemplate은 DB 연동 과정에서 문제가 있으면 DataAccessException을 발생한다고 했는데, DataAccessException 역시, RuntimeException을 상속받고 있습니다. 따라서 JdbcTemplate의 기능을 실행하는 동중 익셉션이 발생해도 프록시는 트랜잭션을 롤백합니다.
SQLExcepion은 RuntimeException을 상속하고 있지 않으므로 SQLExcpeion이 발생하면 트랜잭션을 롤백하지 않습니다. RuntimeException 뿐만 아니라 SQLExcpeion이 발생하는 경우에도 트랜잭션을 롤백하고 싶다면 @Transactional의 rollbackFor 속성을 사용해야 합니다.
@Transactional(rollbackFor = SQLException.class)
public void someMethod(){
...
}
이렇게 한다면 RuntimeException 뿐만 아니라 SQLException이 발생하는 경우에도 트랜잭션을 롤백합니다. 여러 익셉션 타입을 지정하고 싶다면 {SQLExcepion.class, IOException.class}와 같이 배열로 지정하면됩니다.
rollbackFord와 반대 설정을 제공하는 것이 noRollbackFor 속성입니다. 익셉션이 발생해도 롤백시키지 않고 커밋할 익셉션 타입을 지정할 때 사용합니다.
'Spring' 카테고리의 다른 글
[Spring] @EnableTransactionManagement 주요속성과 트랜잭션 전파 (0) | 2024.03.06 |
---|---|
[Spring] @Transactional 속성 (0) | 2024.03.04 |
[Spring] @Transacational과 프록시 (1) | 2024.03.01 |
[Spring] Spring DB 트랜잭션 처리 (1) | 2024.02.28 |
[Spring] Spring DB - 익셉션 변환처리 (0) | 2024.02.27 |