작성
·
273
3
8:10초쯤 printproxy를 호출했을 때 왜 프록시로 출력되나요?
CallService 클래스에는 @Transactional 애너테이션이 붙어있지 않은데, 이러면 프록시 대신 실체 객체로 출력돼야 하지 않나요?
혹시, CallService클래스 내부의 internal 메서드에서 @Transactional 애너테이션이 붙어서 프록시로 출력되는건가요?
프록시는 트랜잭션이 시작될 때 생성되는거로 알고 있는데, internal 메서드를 호출하기 전에는 트랜잭션이 시작되지 않아서 실체 객체로 출력돼야된다고 생각했는데.. 제가 어느 부분에서 잘못 생각한지 말씀해 주실 수 있을까요?
감사합니다.
답변 2
1
y2gcoder님 답변감사합니다.
한가지 더 궁금한 점이 있는데, 클래스의 메소드에 @Transactional이 1개라도 있으면, 해당 클래스를 트랜잭션 프록시 객체가 만들어지는데, 왜 1개라도 있으면 해당 클래스를 트랜잭션 프록시 객체를 만드는 걸까요? 어떤 이점 때문인지 궁금합니다.
이 부분은 완전히 제 추측입니다.
보통 트랜잭션을 걸어주려면 해당 클래스는 빈이어야 합니다. 빈은 싱글톤 빈이고 애플리케이션 구동 시 만들어져서 스프링 컨테이너에 등록됩니다. 이 때 메서드나 클래스에 @Transactional이 걸려있으면 해당 빈은 트랜잭션 프록시 빈으로 대신 등록됩니다.
아마도 @Transactional이 붙은 메서드만을 따로 프록시로 만들어서 등록할 수가 없기 때문이지 않을까 생각합니다. 메서드만 따로 떼서 등록하지 않는다면, 빈으로 만들어진 클래스 에서 @Transactional이 붙지 않은 메서드들을 실행하기 위한 빈, @Transactional 이 붙은 메서드에 트랜잭션을 적용한 프록시 빈이 필요할 것 같습니다. 그러면 스프링 컨테이너 입장에서는 이 둘을 구별해서 들고 있어야 하고, 애플리케이션 구동할 때 분기처리해야할 것 같습니다. 그런데 이 분기처리하기가 너무 번거로울 것 같습니다.
트랜잭션 프록시 기능을 가진 빈만 등록하는게 조금 더 스프링 입장에서는 처리하기 쉽지 않았을까 생각합니다. 이 부분은 제가 스프링에 대해 잘 알지 못한 상태로 추측해본 것이니 serverstudymaster님께서 혹시 이유를 알아내신다면 꼭 저한테도 공유해주시면 감사하겠습니다!