• 카테고리

    질문 & 답변
  • 세부 분야

    백엔드

  • 해결 여부

    미해결

프록시 적용 시 Controller 동작 원리

22.03.13 21:11 작성 조회수 136

0

안녕하세요.

강의를 듣다가 문득 궁금한 점이 생겨 여쭤봅니다.

 

프록시를 이용하여 로그 추적기 적용 시 

실제 Controller가 아닌 프록시 객체가 스프링 빈에 등록되는데

WAS에서 어떻게 실제 Controller에 명시된 @RequestMapping 을 인식하여

호출이 이루어지는지 궁금합니다.

 

dispatcher servlet에서 RequestMappingHandlerMapping을 통하여

스프링 빈이 아닌 직접 @RequestMapping를 가진 실제 Controller를 얻어낸 후에

스프링 빈에서 호출되어서 작동하는 것이 맞을까요?

 

좋은 강의 항상 감사드립니다.

 

 

답변 1

답변을 작성해보세요.

1

MangKyu님의 프로필

MangKyu

2022.03.15

저도 궁금해서 조금 찾아봤었는데 찾아본 내용 공유해드릴께요!

아시다시피 RequestMappingHandlerMapping은 초기화될 때 HttpMethod, URI 등의 조건들과 함께 처리할 대상 정보(HandlerMethod)을 찾아서 관리를 해둡니다. 그리고 컨트롤러의 메소드는 리플렉션을 통해 호출되므로 당연히 HandlerMethod에는 Method 객체도 존재합니다.

 

마찬가지로 프록시 클래스도 핸들러 메소드로 등록될 후보군이므로 위와 같이 mappingReistry에 등록되는 작업이 진행됩니다.
(여기서 mappingRegistry는 API 요청이 왔을 때 HttpMethod, URI 등을 조합하여 요청을 처리할 대상 정보를 관리하는 객체라고 이해하시면 됩니다.)

위의 mappingReistry에 등록하는 작업은 컨트롤러에 존재하는 Method들을 분석하여 처리되는데, 이때 스프링이 자체적으로 만든 AnnotationScaners라는 클래스가 사용됩니다. 그리고 이 클래스를 통해서 상위 메소드의 어노테이션 정보(@RequestMapping)까지 얻어오게 됩니다.

그러므로 오버라이딩된 프록시 클래스의 메소드는 상위 메소드의 @RequestMapping에 의해 스프링의 mappingRegistry에 등록이 되어 요청이 왔을 때 디스패처 서블릿에 의해 응답이 가능해집니다.

 

그래서 결국 질문 주신 내용의 답변을 정리하면 프록시 컨트롤러가 스프링 빈으로 등록되는 것이며, 프록시 컨트롤러의 오버라이딩 된 메소드는 부모 메소드 어노테이션까지 파싱하므로 이러한 동작이 가능하다라고 이해하시면 될 것 같습니다.

 

최대한 짧고 간단하게 설명드리려고 했는데 간단한 내용이 아니라서 잘 전달되었는지 모르겠습니다.
혹시 잘못된 내용이 있으면 영한님께서 교정해주시면 좋을 것 같네요!
감사합니다:)

손경민님의 프로필

손경민

질문자

2022.03.15

답변 너무 감사드립니다!

어려운 내용이라 100프로 이해하는데는 시간이 쫌 걸리겠네요 ㅎㅎ

MangKyu님의 프로필

MangKyu

2022.03.15

혹시 이해 안가는 내용 있으면 또 댓글 남겨주세요! 아는대로 추가 답글드리겠습니다!
혹시 MappingRegistry나 HandlerMethod 같은 내용들 추가 학습 필요하시면 참고하세요!
아직 정리중이였지만 급하게 발행했는데, 혹시 이해 되시는데 도움이 되시면 좋겠네요ㅎㅎ

https://mangkyu.tistory.com/219

손경민님의 프로필

손경민

질문자

2022.03.15

자주 방문해서 배워가겠습니다.

감사합니다! :)