Spring

Spring - DispatcherServlet

jaewoo 2023. 2. 24. 23:55

스프링의 정석을 학습하고 정리한 내용입니다

 

DispatcherServlet 

 

각 서블릿들은 입력을 받아야 하는데 이 공통 부분을 FrontContrller로 묶어서 정리할 수 있다.

결국 공통처리 부분을 따로 빼서 처리하는 것이 DispatcherServlet의 역할이다. DispatcherServlet이 앞에서 전처리를 해준다. 각 Servlet들이 공통적으로 처리해야 할 일을 앞부분에서 처리해준다.

 

HandlerMapping

Map으로 데이터를 관리한다. Key로는 URL(/login.do)을 관리하고 value로 메서드 정보를 저장하고 있다가 요청이 들어오면 해당 요청을 어던 메소드가 처리하면 되는지 DispatcherServlet이 HandlerMapping에게 알려달라고 요청한다.

HandlerMapping은 map을 뒤져서 해당 url하고 일치하는 key를 찾는다. 일치하는 값을 찾아 메소드(value)를 리턴해준다. DispatcherSerlvet이 해당 메소드를 호출하게 된다.

 

DispatcherServlet이 다 처리하기 보다는 HandlerMapping으로 별도의 기능을 분리해놓고 거기에 요청해서 메소드에 대한 정보를 받는 식으로 관심사의 분리를 해놓은 것이다. 

 

HandlerAdapter 

DispatcherServlet이 직접 Controller를 호출하는 것이 아니라 HandlerAdapter를 거쳐서 호출하게 되어있다. 여기서 HandlerAdapter는 여러 종류일 수 있다. 그래서 다른 종류 객체들도 호출할 수 있게 되어있다.

 

두개가 어떻게 요청을 처리는지 보면

HandlerMapping이 알려준 메소드를 어떤 HandlerAdapter가 호출할 수 있는지 보고 찾으면 해당 HandlerAdapter한테 넘겨준다. 그럼 HandlerAdapter가 어떤 Controller가 처리할 수 있는지 보고 해당 Controller한테 요청을 전송한다. 그리고 결과를 다시 받아서 다시 DispatcherServlet한테 준다(뷰이름을 받음). 

여기서 DispatcherServlet이 직접 Controller를 호출하는 것보다 중간에 HandlerAdapter를 넣음으로써 관계가 느슨해졌다. 결국 느슨한 결합을 유지가 가능하도록 되어있다.

 

느슨한 결합을 하게 된다면 변경에 유리해진다. 만약 직접 호출하게 되어있으면 Controller가 아닌 다른 종류의 객체를 호출하게 된다면 DispatcherServlet의 내용을 수정해야 하는 일이 생길 수 있다. 여기서는 DispatcherServlet이 HandlerAdapter를 통해서 Controller 호출할 수 있게 해놓으면 이 대상이 다른 것으로 변경되어도 DispatcherServlet은 변경하지 않아도 되고 다른 HandlerAdapter를 통해서 호출할 수 있게 만들면 된다. 그렇기 때문에 DispatcherServlet이 Controller만 호출할 수 있는 것이 아니라 Serlvet도 호출할 수 있다. Controller뿐만 아니라 Servlet과 같은 다양한 대상들도 호출할 수 있게 하려고 HandlerAdapter를 중간에 넣은 것이다. 

 

ViewResolver

ViewResolver는 컨트롤러를 통해 받은 뷰이름을 DispatcherSerlvet이 주면 빈으로 등록되어 있는 접두사랑 접미사를 이용해 실제 뷰이릅을 알려준다. Controller는 login만 리턴한다면 ViewResolver는 /WEB-INF/views/login.jsp 로 만들어준다. 기본적으로 InternalResourceViewResolver를 사용한다.

 

Controller에서 View이름을 리턴하면 HandlerAdapter를 거쳐서 DispatcherServlet한테 가고 DispatcherServlet은 그 이름을 ViewResolver한테 다시 보내 제대로된 접두사와 접미사가 붙여 돌려받는다.

ViewResolver에게 값을 돌려받으면 DispatcherServlet이 해당 View를 호출하고 해당 View에 model을 전달해준다.

그러면 해당 jsp 파일이 model을 이용하여 응답 결과를 만들고 결과를 클라이언트한테 응답하게 된다.

 

 

 

 

'Spring' 카테고리의 다른 글

Spring - MockMvc  (0) 2023.04.03
Spring - Filter  (0) 2023.03.30
Spring - 작성자 체크하기  (0) 2023.02.09
Spring - AOP,@Transactional  (0) 2023.01.27
Spring - Session  (0) 2022.12.26