인프런 커뮤니티 질문&답변

13months님의 프로필 이미지
13months

작성한 질문수

스프링 DB 2편 - 데이터 접근 활용 기술

트랜잭션 AOP 주의 사항 - 프록시 내부 호출1

printproxy의 값

작성

·

276

3

8:10초쯤 printproxy를 호출했을 때 왜 프록시로 출력되나요?

 

CallService 클래스에는 @Transactional 애너테이션이 붙어있지 않은데, 이러면 프록시 대신 실체 객체로 출력돼야 하지 않나요?

 

혹시, CallService클래스 내부의 internal 메서드에서 @Transactional 애너테이션이 붙어서 프록시로 출력되는건가요?

 

프록시는 트랜잭션이 시작될 때 생성되는거로 알고 있는데, internal 메서드를 호출하기 전에는 트랜잭션이 시작되지 않아서 실체 객체로 출력돼야된다고 생각했는데.. 제가 어느 부분에서 잘못 생각한지 말씀해 주실 수 있을까요?

 

감사합니다.

답변 2

1

y2gcoder님 답변감사합니다.

한가지 더 궁금한 점이 있는데, 클래스의 메소드에 @Transactional이 1개라도 있으면, 해당 클래스를 트랜잭션 프록시 객체가 만들어지는데, 왜 1개라도 있으면 해당 클래스를 트랜잭션 프록시 객체를 만드는 걸까요? 어떤 이점 때문인지 궁금합니다.

이 부분은 완전히 제 추측입니다.

보통 트랜잭션을 걸어주려면 해당 클래스는 빈이어야 합니다. 빈은 싱글톤 빈이고 애플리케이션 구동 시 만들어져서 스프링 컨테이너에 등록됩니다. 이 때 메서드나 클래스에 @Transactional이 걸려있으면 해당 빈은 트랜잭션 프록시 빈으로 대신 등록됩니다.

아마도 @Transactional이 붙은 메서드만을 따로 프록시로 만들어서 등록할 수가 없기 때문이지 않을까 생각합니다. 메서드만 따로 떼서 등록하지 않는다면, 빈으로 만들어진 클래스 에서 @Transactional이 붙지 않은 메서드들을 실행하기 위한 빈, @Transactional 이 붙은 메서드에 트랜잭션을 적용한 프록시 빈이 필요할 것 같습니다. 그러면 스프링 컨테이너 입장에서는 이 둘을 구별해서 들고 있어야 하고, 애플리케이션 구동할 때 분기처리해야할 것 같습니다. 그런데 이 분기처리하기가 너무 번거로울 것 같습니다.

트랜잭션 프록시 기능을 가진 빈만 등록하는게 조금 더 스프링 입장에서는 처리하기 쉽지 않았을까 생각합니다. 이 부분은 제가 스프링에 대해 잘 알지 못한 상태로 추측해본 것이니 serverstudymaster님께서 혹시 이유를 알아내신다면 꼭 저한테도 공유해주시면 감사하겠습니다!

1

안녕하세요. waysoleward01님, 공식 서포터즈 y2gcoder입니다.

@Transactional 과 같은 aop 를 이용하는 프록시는 @Transactional이 메서드에라도 있을 경우 해당 객체를 프록시 객체로 만듭니다.
image

어째서 이렇게 되는가에 대해서는 영한님의 스프링 핵심 원리 - 고급편에서 정말 잘 정리되어 있기 때문에 해당 강의를 참고해주세요 :)


감사합니다.

13months님의 프로필 이미지
13months
질문자

답변 정말 감사합니다~~!

파이팅입니다 . :)

13months님의 프로필 이미지
13months

작성한 질문수

질문하기