@Transactional에 대해 알아보고자 한다.
모의면접에서 @Transactional에 관련한 질문을 받았고, 꼬리 질문으로 받은 질문을 답을 못했다.
class A {
@Transactional
public void A(){};
public void B(){
A();
}
}
B메서드를 호출했을 때, Transactional이 작동하느냐에 대한 문제였고, 나는 틀렸다.
무엇이 정답인지 @Transactional에 대해 알아보자
Spring에서 AOP로 트랜잭션을 처리하는 선언적 방법
어노테이션 선언을 통해 해당 메서드나 클래스의 작업을 트랜잭션으로 묶을 수 있음
클래스, 메소드, 인터페이스에 선언할 수 있음
class A {
@Transactional
public void A(){};
public void B(){
A();
}
즉 서론에 나왔던 이 코드는 실행되지 않는다.
뭔가 깊이가 모자란 거 같은데 간단하게 @Transactional을 알아봤다. 나중에 추가할 것이 있으면 추가할 예정
그래서 서론의 해당 코드로 넘어가자면,
class A {
@Transactional
public void A(){};
public void B(){
A();
}
}
가 안 되는 이유는 사실 AOP의 프록시 객체 생성과 연관이 있다.
메서드 A를 self-invocation하고 있는데 프록시 객체를 통하지 않고, 메서드를 직접 호출하기 때문에 트랜잭션이 실행되지 않는 것. 그러므로 외부 호출받는 메서드에 선언해줘야 한다.
참고한 글 / 블로그
https://imiyoungman.tistory.com/9
https://medium.com/gdgsongdo/transactional-%EB%B0%94%EB%A5%B4%EA%B2%8C-%EC%95%8C%EA%B3%A0-%EC%82%AC%EC%9A%A9%ED%95%98%EA%B8%B0-7b0105eb5ed6