[spring] Spring MVC, Dispatcher Servlet

2021. 10. 18. 01:31[ 백엔드 개발 ]/[ Spring ]

Dispatcher Servlet 등장 배경

요청 메시지를 파싱하고 분석하고 이에 대한 응답 메시지 또는 파일 등을 만드는 작업 등을 매번 웹 개발자가 컨트롤 하는 것이 매번 서블릿을 만들때마다 중복해서 할 수밖에 없었다. 그래서 이런 작업을 통합적으로 해주는 것이 필요했고 필요할 때 마다 템플릿화 시켜서 변경이 필요한 부분에만 변경을 해주고 어떤 서비스를 호출하고 어떻게 처리할 지를 정하는 것을 '분리'해야 한다는 필요성에 의해 등장했다.

 

 

Front Controller Pattern

중앙 집중형 컨트롤러를 가장 앞단에 두는 방식이다. 스프링은 Dispatcher Servlet을 제공하는데, 이는 Front Controller Pattern이 적용된 결과이다. 여러개의 서블릿을 둘 수도 있지만 스프링에서는 Dispatcher Servlet이라는 하나의 서블릿을 앞단에 두고 이 프론트 컨트롤러가 요청을 모두 받아서 특정 요청에 맞는 컨트롤러에게 요청을 전달하는 방식이다. 이때 요청의 URI, HTTP Method, parameter 등을 분석해 어떤 컨트롤러에게 요청을 위임할 지 결정한다. 또한 프론트 컨트롤러(Dispatcher Servlet)는 각 컨트롤러에서 발생한 예외처리 역할도 수행한다.

 

 

Spring MVC의 기본은 ‘front controller pattern’이 적용된 것이라고 볼 수 있다.

 

https://velog.io/@seculoper235/2.-DispatcherServlet-%EC%9D%B4%EB%9E%80

 

 

 

Front Controller의 주요 역할

1. 핸들러 매핑: Front Controller에서 특정 컨트롤러(핸들러)를 결정한다.

2. 핸들러 어댑터: 컨트롤러의 메소드 매개변수 정보에 맞게 변환한다. 사실 디스패처 서블릿이 HandlerAdapter를 호출하면 HandlerAdapter에서 컨트롤러의 매개변수 타입에 맞게 변환 후 컨트롤러를 호출시킨다.

3. 뷰 리졸버에게 전달: 컨트롤러가 반환한 ModelAndView를 가지고 어떠한 뷰를 만들지 결정한다. 뷰 리졸버는 디스패처 서블릿에 등록되어 있다. 컨트롤러는 논리적인 이름의 view name을 반환해야 한다. 뷰 리졸버는 chain 형식으로 구성되는데 첫 번째 뷰 리졸버부터 검색해 해당 view name을 가지고 있는지 순차적으로 탐색한다. 그리고 찾아낸 뷰 템플릿에 data를 입혀 랜더링할 뷰를 만든다.

4. 응답 메시지 작성: 만들어진 온전한 뷰를 HTTP Resposne Body에 실어 보낸다.

 

cf. View Resolver: 받은 데이터를 가지고 동적 컨텐츠를 만든다.

 

 

 

Spring MVC 흐름

https://velog.io/@hanblueblue/%EB%B2%88%EC%97%AD-Spring2-Spring-Web-MVC

 

1) 요청이 오면 dispatcher servlet이 받고 'handler mapping'전략에 의해서 컨트롤러(핸들러)를 선택한다.

2) dispatcher servlet이 'handler adapter'를 가지고 선택된 컨트롤러의 메소드에 맞는 파라메터로 변환한다.

3) service, repository, database등 '비즈니스 로직'이 처리된다.

4) 컨트롤러는 반환받은 데이터로 view name과 model(data)을 만든다.

5) view name을 dispatcher servlet이 받으면 view name과 model을 view resolver에게 전달한다.

6) view resolver는 특정한 뷰로 찾아주고 뷰는 다양한 형태로 가능하다.(동적 컨텐츠) 예를들어 JSP이면 JSP 뷰가 만들어지고, response body 어노테이션이 들어가서 response body로 전달될 모델이면 컨텐츠에 따라서 JSON view 또는 XML view가 만들어 진다. 제이슨 뷰를 렌더링하면 제이슨 포멧이 만들어지고 XML 뷰를 랜더하면 XML이 만들어진다. JSP 뷰를 랜더하면 HTML이 만들어진다. 타임리프를 쓰면 타임리프 템플릿 엔진이 우리가 전달한 템플릿과 뷰를 합쳐서 HTML 컨텐츠를 만들어 준다.

7) 만들어진 뷰는 HTTP Response Body에 실어서 클라이언트에게 응답으로 보내진다.

 

 

최근 백엔드 동향은 뷰에 관여하지 않고 JSON 형태의 데이터만 프론트 엔드쪽에 반환하는 경향이다.