[Java Spring] 오류발생시 트랜잭션(@Transactional) 롤백이 안될 때 코드 확인 방법
AOP에서 다뤄지는 큰 이슈 하나
AOP기반으로 동작하는 트랜잭션 어노테이션은 내부함수 호출에서 트랜잭션 보장이 안된다.
그럼 어떻게 해야할까?
정답은 Proxy로 자기자신 객체를 생성하여 사용한다.
다음 예제를 보자.
public class SaveTest() {
public void callTest() {
// todo
this.saveMethod();
}
@Transactional
public void saveMethod(){
Entity ent1 = Entity();
repository.aave(ent1);
throw new Exception(“TEST”);
}
}
위 예제코드처럼 this로 내부함수 this.saveMethod(); 를 호출하면 Transactional 안먹힌다
해결책은 아래 예제코드와 같이 자기자신을 호출해서 사용해야 rollback이 먹힌다.
public class SaveTest() {
@Autowired
private SaveTest st;
public void callTest() {
//todo
st.saveMethod();
}
@Transactional
public void saveMethod(){
// 위코드와 동일
}
}