패리어드
444
2019-12-04 15:22:33 작성 2019-12-04 15:24:19 수정됨
18
4182

Spring MVC 초기화 및 처리 과정 정리 공유


최근 사내에서 Spring MVC 스터디를 진행하며 정리한 내용을 공유합니다.

github 를 통해 자료를 정리하고 Spring MVC 를 잘 쓰기 위한

Controller, Interceptor, ArgumentHandler 예제 등을 모아놓았습니다.


Spring MVC 자료 (스터디 내용 포함)  

Spring MVC 가이드 번역 자료


Spring MVC 가 동작하는 원리를 알기 위해 초기화 과정에서 어떤 일들이 일어나는지 알아야 합니다.

중요한 핵심 부분만 정리합니다.


DispatcherServlet 의 초기화 과정

1. HandlerMapping(RequestMappingHandlerMapping) 생성

- @Controller 와 @RequestMapping을 식별하여 MappingRegistry에 보관하고 요청을 연결해주는 역할


AbstractHandlerMethodMapping 클래스의 detectHandlerMethod() 를 이용해 정의된 BeanDefinition 에서

해당 애노테이션을 찾고 registerHandlerMethod() 를 이용해 등록합니다.


2. HandlerAdapter(RequestMappingHandlerAdapter) 생성

- 요청이 들어올 때 선택된 컨트롤러를 실행하고 결과값을 처리하는 역할


기본적인 MessageConverter, ArgumentResolver, ReturnValueHandler 를 등록합니다.


요약도

DispatcherServlet Initialization


실제 요청이 들어왔을 때 처리되는 과정은 다음과 같습니다.


DispatcherServlet 처리 과정


1. HandlerMapping 

요청을 분석해 MappingRegistry 에서 요청을 처리할 컨트롤러 메서드를 찾습니다.


2. HandlerAdapter

메서드를 실행할 adapter 를 검색합니다.


3. Interceptor

컨트롤러 실행 전 전/후처리 작업을 실행합니다.


4. ArgumentResolver 

요청 파라미터를 가공합니다.


5. Controller

비즈니스로직을 이용해 요청을 처리합니다.


6. ReturnValueHandler

컨트롤러에서 반환받은 결과값을 처리합니다.


7. ViewResolver

결과값을 이용해 클라이언트에게 렌더링할  View 를 선택합니다.


8. View

View 의 render 메서드를 통해 클라이언트에게 결과값을 전달합니다.


요약도

dispatcher-servlet-processing





34
39
  • 댓글 18

  • 의미부여가필요한가
    51
    2019-12-05 10:01:43

    어휴 사실상 핵심만 잘 집어서 정리해주셨네요

    너무감사합니다

    0
  • 마사키군
    899
    2019-12-05 12:30:58

    앗. 제가 알고 싶었던 내용이... 고맙습니다 +_+

    0
  • LimeDoo
    742
    2019-12-05 15:08:17

    와 감사히 볼께요

    0
  • LimeDoo
    742
    2019-12-05 15:38:41 작성 2019-12-05 15:50:18 수정됨

    혹시 저 처리과정에서 스프링이 context를 만드는 시점을 혹시 아신다면 답변 부탁요. 스프링이 동작하는 시점이 언제인지 궁금한데 dispatcher서블릿이 web.xml을 읽어들일때라면 그때 메모리에 java  class가 생성된다라고 할 때 그때 스프링 동작하는게  맞겠지요? 그렇다면 톰캣 구동이 되면서 디스패쳐서블릿이 생성되고 스프링의 빈들이 메모리에 올려지는 것인지 ..아니면 다른 순서가 있는지 제가 아직 그 부분에서 명확하게 구분을 못지어서요.

    0
  • 패리어드
    444
    2019-12-05 16:46:50 작성 2019-12-05 16:47:40 수정됨

    LimeDoo

    Spring Context 를 만드는 시점은 

    DispatcherServlet 은 Servlet 을 구현하기 때문에 그에 해당하는 라이프사이클에 적용되고 

    그 중 init 메서드를 실행하는 시점에 Context 를 만들어주어요

     

    조금 더 정확히 말하면 Servlet 구현체 중 HttpServletBean 에서 initServletBean() 메서드를 실행하는데

    FrameworkServlet 클래스에서 override 하고 있어요


    이쪽 로직을 보다보면 initWebApplicationContext() 메서드를 실행시키는데

    여기서 실제로 Context 를 만들고 초기화를 진행해요

    4
  • LimeDoo
    742
    2019-12-05 17:30:20

    // 패리어드

    아 정말 감사합니다.

    혼자 독학하느라 헤메면서 공부중이었는데

    제대로 이해가 가네요.

    init() 의 의미가 그 의미였군요. 이걸 알려고 토비스프링 핸들러쪽 수십장 읽다가 갑질상사가 테클걸어서 그뒤로 모른채 셋팅하는데 영 궁금해서요.

    친절한 설명 감사드립니다.

    즐거운 하루되세요.

    1
  • peopleWare
    587
    2019-12-05 18:02:26
    감사합니다 잘 볼게요^^
    0
  • ignoreOrange
    1k
    2019-12-06 14:06:27

    스터디 제대루 하셨네요

    o( o_o)o

    0
  • 스트라
    430
    2019-12-06 16:50:28

    좋은 정보 공유 감사합니다

    0
  • 똘똘이박사
    995
    2019-12-06 19:43:59
    좋은 정보 감사합니다~
    0
  • 리아누스
    14
    2019-12-06 22:11:06

    좋은 정보 공유 감사드립니다.

    0
  • 한량개발자
    770
    2019-12-06 23:40:59

    이런 지식공유 좋아요 

    0
  • Java개발자입니다
    826
    2019-12-07 01:37:51

    좋은내용 감사합니다.

    정말 좋은회사이네요. ㅎㅎ

    0
  • Java개발자입니다
    826
    2019-12-07 02:22:22

    작성자님께 질문한가지 여쭙고싶은데 스프링 MVC의 처리과정을 깊게 공부하셨을때 

    스프링프로젝트를 디컴파일해가면서 공부하셨나요? 아니면 공식문서를 참조하면서 하셨나요?

    0
  • 패리어드
    444
    2019-12-07 10:33:13

    Java개발자입니다

    Intellij 에서 Spring Web MVC 관련 모듈과 Servlet 모듈을 다운로드 받아서 디버깅하면서 공부했어요

    스터디때는 특정 기능에 대해 디버깅 포인트를 잡고 동작을 같이 따라가면서 훑어봤어요


    처음 공부할 때는  DispatcherServlet 클래스의 생성자와 doDispatch() 디버깅 포인트를 걸고 쭉 따라갔던거 

    같아요

    공식문서도 보긴했지만 제 생각에는 공부하는데 공식문서는 단편적인 정보를 알려주지만 스토리있는(연결되는) 내용은 디버깅이 더 효율적인거 같아요

    1
  • 아델
    335
    2019-12-08 23:45:30

    감사합니다 

    0
  • EastGlow
    1k
    2019-12-08 23:46:33

    좋은 자료 공유 감사합니다.

    0
  • Gs낭천
    205
    2019-12-09 08:25:40

    지금은 스프링 안쓰지만 북마크 했다가 나중에 봐야겠네요.

    한국은 스프링 정말 많이쓰던데 일본에서 귀국전에 잠깐 다뤄봤는데 기능이 많은만큼 너무 복잡하구 어렵더라구요...

    0
  • 로그인을 하시면 댓글을 등록할 수 있습니다.