inflearn logo
강의

강의

N
챌린지

챌린지

멘토링

멘토링

N
클립

클립

로드맵

로드맵

지식공유

스프링 핵심 원리 - 고급편

프록시 적용 시 Controller 동작 원리

338

손경민

작성한 질문수 2

0

안녕하세요.

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

 

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

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

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

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

 

dispatcher servlet에서 RequestMappingHandlerMapping을 통하여

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

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

 

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

 

 

디자인-패턴 spring

답변 1

1

MangKyu

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

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

 

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

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

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

 

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

 

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

0

손경민

답변 너무 감사드립니다!

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

0

MangKyu

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

https://mangkyu.tistory.com/219

0

손경민

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

감사합니다! :)

SpringBoot 4.0.6 버전에서 PackageLogTracePostProcessor exception

0

91

3

어드바이스 순서 디폴트 기준이 궁금합니다.

0

75

1

AspectV1 예제를 @Configuration 수동 등록으로도 가능한가요?

0

104

2

구체 클래스를 상속받아 확장한 형태도 클래스패턴/데코레이터 패턴이라고 칭하나요?

0

74

1

TraceTemplate 을 미리 빈으로 등록해서 사용할때 이렇게 설정하는게 맞는건가요?

0

72

1

Decorator 에서 추상메서드로 뺄때 질문 있습니다.

0

64

1

대상 클래스에 기본 생성자가 없을 때

0

86

1

스프링 부트 버전 4.0 aop 의존성 명칭 변경

1

429

2

final 키워드 사용 관련 질문

0

85

1

안녕하세요

0

78

1

ThradLocal 실무 사례

0

109

2

실무에서의 동시성 문제

0

73

1

로그 등 부가 기능에 대한 테스트코드

0

64

1

ProceedingJoinPoint와 MethodInvocation에 대하여

0

81

1

실무 멀티스레딩에 대한 궁금증

0

86

1

안녕하세요 질문있습니다

0

49

1

AspectV3 aop 실행 순서 문의 드립니다

0

47

1

MDC vs AOP 중에 고민중입니다.

0

87

1

순환참조

0

175

2

this를 단독으로 사용할때랑 파라미터 바인딩 할때 차이

0

84

1

빈 후처리에 등록 질문 있습니다.

0

85

1

AppConfig 설정하는 설명중에 이해가 안되는게 있습니다.

0

102

1

ThreadLocal을 지역변수로 선언하면 remove가 필요할까요?

0

122

2

@Aspect 어노테이션으로 생성된 Advisor의 Bean 저장 여부

0

78

1