• 카테고리

    질문 & 답변
  • 세부 분야

    백엔드

  • 해결 여부

    미해결

컨트롤러 프록시가 어떻게 호출되는지 잘 모르겠습니다

22.07.25 02:11 작성 조회수 346

0

인터페이스에 GetMapping이 되어있고 이 인터페이스를 Impl 구현체와 프록시가 각각 구현하고 있는데 어떤 이유로 Impl이 아닌 프록시가 호출되는지 잘 모르겠습니다.

마찬가지로 구체클레스에 적용하는 V2도 OrderController가 아닌 이것을 상속받은 프록시가 호출되는 이유가 궁금합니다 

답변 3

·

답변을 작성해보세요.

2

y2gcoder님의 프로필

y2gcoder

2022.07.25

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

1. 인터페이스 기반 프록시 - 적용에서 설정 부분을 보시면 

수동 빈 등록에서 실제 impl 객체를 빈으로 등록해주는 것이 아니라 프록시를 빈으로 등록해주고 있습니다. 프록시만 스프링 빈으로 등록되어있기 때문에 스프링 컨테이너에서는 프록시를 호출해주고 있습니다. 

구체 클래스 기반 프록시 또한 마찬가지입니다. 

해당 강의 자료 40p 부터 런타임 의존관계 설정에 대한 부분을 천천히 읽어보시면 도움이 되실 것 같습니다. :)

감사합니다.

0

sgr4244님의 프로필

sgr4244

질문자

2022.07.27

말씀해주신 부분을 찾아봤는데 잘 모르겠네요. 어느 부분인지 구체적으로  말씀해주시면 감사하겠습니다.

y2gcoder님의 프로필

y2gcoder

2022.07.28

스프링 컨테이너와 스프링 빈으로 전체적인 프로세스를 보시고, 그 중에서도 스프링 빈 조회 - 상속관계 쪽이 맞지 않을까 생각합니다 :) 

아니면 밑의 링크처럼 직접 디버깅을 해보시는 것도 좋을 것 같아요!

https://csy7792.tistory.com/315


감사합니다.

0

sgr4244님의 프로필

sgr4244

질문자

2022.07.27

프록시를 빈으로 등록하면 OrderControllerInterfaceProxy에 target과 logTrace를 주입하는것으로

이해하고 있습니다. 인터페이스를 호출했을때 빈으로 등록된 객체가 호출되는 이유를 알고 싶습니다 

 

y2gcoder님의 프로필

y2gcoder

2022.07.27

빈으로 등록한 객체는 인터페이스나 그 부모 타입으로 호출이 가능합니다. 그 원리에 대해서 알고 싶으시다는 말씀이실까요?
이 부분은 영한님의 스프링 핵심원리 기본편스프링 컨테이너와 스프링 빈 부분을 학습하시는 게 제 부족한 설명보다는 도움이 될 것 같습니다!

https://www.inflearn.com/course/%EC%8A%A4%ED%94%84%EB%A7%81-%ED%95%B5%EC%8B%AC-%EC%9B%90%EB%A6%AC-%EA%B8%B0%EB%B3%B8%ED%8E%B8

그게 아니라 InterfaceProxyConfig에서 프록시를 빈으로 등록해줬는데 왜 target이 호출되는지 궁금하다는 말씀이실까요?


후자에 대한 것은 프록시에 보시면 target을 생성자에서 받고, 그 메서드를 호출하는 부분이 있습니다. 엄밀히 말하면 인터페이스를 호출했을 때 빈으로 등록된 객체가 아니라 생성자에서 넣어줬던 target 객체가 호출되는 거라고 이해하시면 될 것 같습니다. 

정민우(Jhung)님의 프로필

정민우(Jhung)

2023.12.14

프록시를 빈으로 등록하면 target 과 logTrace가 주입되는게 아니라, target과 logTrace 를 갖고있는 프록시가 빈으로 등록되는거라고 이해하시는게 더 수월 할 것 같습니다.
즉, 프록시는 target(실제 객체) 과 logTrace를 품은 상태인거고 그 상태에서 빈으로 등록되어 스프링 컨테이너의 관리를 받게 됩니다. 그래서 인터페이스가 호출될때 실제 객체가 아니라 프록시 객체가 주입 됩니다.

하지만 주요 로직(ex, 서비스 호출) 을 수행 할 때는 프록시가 해당 작업을 자신의 target(실제 객체) 에게 "위임" 하여 수행하도록 합니다.

그렇기 때문에 클라이언트 입장에서는 현재 내가 프록시를 통해 서비스를 호출 했는지, 진짜 객체를 통해 서비스를 호출 했는지 알 수 없는거죠. (알 필요가 없기도 하구요)

 

정리하자면,

빈에 등록되는 객체는? 프록시 객체

스프링 컨테이너가 관리하고 호출하는 객체는? 프록시 객체

실제 로직을 수행하게 되는 객체는? 실제 객체 (프록시의 target)

 

저도 제가 공부하면서 답변을 드리는거라 틀린 정보가 많을 수 있습니다 ㅠㅠㅜㅠㅜ