작성
·
209
0
안녕하세요.
강의를 듣다가 문득 궁금한 점이 생겨 여쭤봅니다.
프록시를 이용하여 로그 추적기 적용 시
실제 Controller가 아닌 프록시 객체가 스프링 빈에 등록되는데
WAS에서 어떻게 실제 Controller에 명시된 @RequestMapping 을 인식하여
호출이 이루어지는지 궁금합니다.
dispatcher servlet에서 RequestMappingHandlerMapping을 통하여
스프링 빈이 아닌 직접 @RequestMapping를 가진 실제 Controller를 얻어낸 후에
스프링 빈에서 호출되어서 작동하는 것이 맞을까요?
좋은 강의 항상 감사드립니다.
답변 1
1
저도 궁금해서 조금 찾아봤었는데 찾아본 내용 공유해드릴께요!
아시다시피 RequestMappingHandlerMapping은 초기화될 때 HttpMethod, URI 등의 조건들과 함께 처리할 대상 정보(HandlerMethod)을 찾아서 관리를 해둡니다. 그리고 컨트롤러의 메소드는 리플렉션을 통해 호출되므로 당연히 HandlerMethod에는 Method 객체도 존재합니다.
마찬가지로 프록시 클래스도 핸들러 메소드로 등록될 후보군이므로 위와 같이 mappingReistry에 등록되는 작업이 진행됩니다.
(여기서 mappingRegistry는 API 요청이 왔을 때 HttpMethod, URI 등을 조합하여 요청을 처리할 대상 정보를 관리하는 객체라고 이해하시면 됩니다.)
위의 mappingReistry에 등록하는 작업은 컨트롤러에 존재하는 Method들을 분석하여 처리되는데, 이때 스프링이 자체적으로 만든 AnnotationScaners라는 클래스가 사용됩니다. 그리고 이 클래스를 통해서 상위 메소드의 어노테이션 정보(@RequestMapping)까지 얻어오게 됩니다.
그러므로 오버라이딩된 프록시 클래스의 메소드는 상위 메소드의 @RequestMapping에 의해 스프링의 mappingRegistry에 등록이 되어 요청이 왔을 때 디스패처 서블릿에 의해 응답이 가능해집니다.
그래서 결국 질문 주신 내용의 답변을 정리하면 프록시 컨트롤러가 스프링 빈으로 등록되는 것이며, 프록시 컨트롤러의 오버라이딩 된 메소드는 부모 메소드 어노테이션까지 파싱하므로 이러한 동작이 가능하다라고 이해하시면 될 것 같습니다.
최대한 짧고 간단하게 설명드리려고 했는데 간단한 내용이 아니라서 잘 전달되었는지 모르겠습니다.
혹시 잘못된 내용이 있으면 영한님께서 교정해주시면 좋을 것 같네요!
감사합니다:)
답변 너무 감사드립니다!
어려운 내용이라 100프로 이해하는데는 시간이 쫌 걸리겠네요 ㅎㅎ