작성
·
439
답변 3
0
0
프록시를 빈으로 등록하면 OrderControllerInterfaceProxy에 target과 logTrace를 주입하는것으로
이해하고 있습니다. 인터페이스를 호출했을때 빈으로 등록된 객체가 호출되는 이유를 알고 싶습니다
빈으로 등록한 객체는 인터페이스나 그 부모 타입으로 호출이 가능합니다. 그 원리에 대해서 알고 싶으시다는 말씀이실까요?
이 부분은 영한님의 스프링 핵심원리 기본편 중 스프링 컨테이너와 스프링 빈 부분을 학습하시는 게 제 부족한 설명보다는 도움이 될 것 같습니다!
그게 아니라 InterfaceProxyConfig에서 프록시를 빈으로 등록해줬는데 왜 target이 호출되는지 궁금하다는 말씀이실까요?
후자에 대한 것은 프록시에 보시면 target을 생성자에서 받고, 그 메서드를 호출하는 부분이 있습니다. 엄밀히 말하면 인터페이스를 호출했을 때 빈으로 등록된 객체가 아니라 생성자에서 넣어줬던 target 객체가 호출되는 거라고 이해하시면 될 것 같습니다.
프록시를 빈으로 등록하면 target 과 logTrace가 주입되는게 아니라, target과 logTrace 를 갖고있는 프록시가 빈으로 등록되는거라고 이해하시는게 더 수월 할 것 같습니다.
즉, 프록시는 target(실제 객체) 과 logTrace를 품은 상태인거고 그 상태에서 빈으로 등록되어 스프링 컨테이너의 관리를 받게 됩니다. 그래서 인터페이스가 호출될때 실제 객체가 아니라 프록시 객체가 주입 됩니다.
하지만 주요 로직(ex, 서비스 호출) 을 수행 할 때는 프록시가 해당 작업을 자신의 target(실제 객체) 에게 "위임" 하여 수행하도록 합니다.
그렇기 때문에 클라이언트 입장에서는 현재 내가 프록시를 통해 서비스를 호출 했는지, 진짜 객체를 통해 서비스를 호출 했는지 알 수 없는거죠. (알 필요가 없기도 하구요)
정리하자면,
빈에 등록되는 객체는? 프록시 객체
스프링 컨테이너가 관리하고 호출하는 객체는? 프록시 객체
실제 로직을 수행하게 되는 객체는? 실제 객체 (프록시의 target)
저도 제가 공부하면서 답변을 드리는거라 틀린 정보가 많을 수 있습니다 ㅠㅠㅜㅠㅜ
스프링 컨테이너와 스프링 빈으로 전체적인 프로세스를 보시고, 그 중에서도 스프링 빈 조회 - 상속관계 쪽이 맞지 않을까 생각합니다 :)
아니면 밑의 링크처럼 직접 디버깅을 해보시는 것도 좋을 것 같아요!
https://csy7792.tistory.com/315
감사합니다.