본문 바로가기
개발/Spring

[Spring] Controller에 파라미터 바인딩은 어떻게 이루어질까 ?

by 상용최 2021. 1. 26.
반응형

맞춤법 검사를 원하는 단어나 문장을 입력해 주세요. 요즘 개인적으로 Spring Controller를 모방하여 만드는 중이다.
Spring의 Controller는 라우팅도 해주지만 개인적으로 제일 편리했던 거는 파라미터 바인딩이었다.
그래서 만들 때 파라미터 바인딩을 나도 해줘야겠다는 생각이 들었다.
Method의 Parameter 타입을 검사해서 request 값이랑 대조해서 매칭하면 되겠지만 Spring은 어떤 방식으로 하고 있을까? 궁금하여 분석을 하고자 한다.

 

1. DispatcherServlet.doService

요청이 들어오면 DispatcherServlet의 doService메소드가 호출된다.

doService 메소드 안에서는 doDispatch 메소드가 실행된다.

2. DispatcherServlet.doDispatch

doDispatch메소드안에서 알맞는 Handler를 찾기위해 getHandler 메소드를 호출한다.

3. DispatcherServlet.getHandler

알맞는 handler가 있다면 넘겨주고 없다면 null을 리턴한다.

4. DispatcherServlet.getHandlerAdapter

핸들러에 알맞는 handler adapter를 가져온다.

 

5. AbstractHandlerMethodAdapter.handle

doDispatch 메소드에서 handlerAdapter의 handle메소드를 호출한다.

AbstractHandlerMethodAdapter에서는 handleInternal 메소드를 호출한다.

6. RequestMappingHandlerAdapter.handleInternal 

handleInternal 메소드에서는 invokeHandlerMethod 메소드를 호출한다.

7. RequestMappingHandlerAdapter.invokeHandlerMethod 

invokeHandlerMethod 에서는 ServletInvocableHandlerMethod의 invokeAndHandle 메소드를 호출한다.

8. ServletInvocableHandlerMethod.invokeAndHandle 

invokeAndHandle메소드에서는 invokeForRequest 메소드를 호출한다.

변수명과 메소드명을 보아하니 요청을 실행하고 결과값을 받는 메소드를 실행하는 것 같다.

9. ServletInvocableHandlerMethod.invokeForRequest 

invokeForRequest에서는 파라미터들을 얻기위해 getMethodArgumentValues 메소드를 실행한다.

10. ServletInvocableHandlerMethod.getMethodArgumentValues 

resolver를 통해 argument를 구해오기위해 resolveArgument 메소드를 실행한다.

11. HandlerMethodArgumentResolverComposite.resolveArgument

Argument에 알맞는 Resolver를 통해 resolveArgument 메소드를 실행한다.

 

12. RequestResponseBodyMethodProcessor.resolveArgument

readWithMessageConverters메소드를 실행한다.

13. RequestResponseBodyMethodProcessor.readWithMessageConverters

readWithMessageConverters를 호출한다.

 

14. AbstractMessageConverterMethodArgumentResolver.readWithMessageConverters

body가 있다면 Convert의 read메소드를 실행한다.

String일때

15. AbstractHttpMessageConverter.read

16. StringHttpMessageConverter.readInternal

StreamUtils.copyToString메소드를 활용하여 Body의 값을 변환한다.

이때 요청값을 얻게된다.

그 이외의 타입

16. AbstractJackson2HttpMessageConverter.read

readJavaType 메소드를 호출한다.

17. AbstractJackson2HttpMessageConverter.readJavaType

ObjectMapper를 이용하여 알맞은 타입으로 변환한다.

Integer, Class, List, Map 등이 여기서 변환된다.

반응형

'개발 > Spring' 카테고리의 다른 글

[Spring] controller unit test with csrf  (1) 2021.03.17
[Spring] @DataJpaTest  (0) 2021.03.14
[Spring] Bean은 어떻게 등록되는 것일까?  (1) 2021.01.17
[Spring] Junit5로 예외테스트 하기  (0) 2020.12.06
[Spring] PostgreSQL yml 설정  (0) 2020.12.06

댓글