Spring Framework

DispatcherServlet과 MVC 아키텍쳐

똥태 2022. 1. 12. 13:15

MVC는 프레젠테이션 계층의 구성요소 정보를 담은 모델M, 화면 출력 로직을 담은 뷰V, 그리고 제어 로직을 담당하는 컨트롤러C로 분리하고 이 세가지 요소가 협력하여 하나의 웹 요청을 처리하고 응답을 만들어내는 구조이다.

MVC 아키텍처는 보통 프론트컨트롤러 패턴과 함께 사용된다.

프론트컨트롤러는 요청request를 받아 공통적인 작업을 먼저 수행한 후 세부 컨트롤러로 작업을 위임해주고 client에게 보낼 뷰를 선택해 최종 결과를 생성하고 만약 예외가 발생했을때 일관된 방식으로 처리하는등의 작업을 수행한다.

스프링 서블릿/MVC의 핵심은 DispatcherServlet이라는 프론트 컨트롤러다. DispatcherServlet은 MVC 아키텍처로 구성된 프레젠테이션 계층을 만들 수 있도록 설계되어 있다.

 

 

스프링의 DispatcherServlet과 MVC 아키텍처

 

 

 


1)DispatcherServlet의 HTTP 요청 접수

 

자바 서버의 서블릿컨테이너는 HTTP 프로토콜을 통해 들어오는 request가 스프링의 DispatcherServlet에 할당된 것이라면 HTTP 요청정보를 DispatcherServlet에 전달해준다.
(web.xml에 DispatcherServlet이 전달받을 url패턴을 지정)

 

 



2)DispatcherServlet에서 컨트롤러로 HTTP 요청 위임

 

DispatcherServlet은 URL이나 파라미터 정보, HTTP 명령 등을 참고하여 어떤 컨트롤러에게 작업을 위임할지 결정한다.

스프링에서는 컨트롤러를 핸들러라고도 부르는데, 사용자 요청을 기준으로 어떤 핸들러에게 작업을 위임할지를 결정하는 것을 핸들러 매핑 전략이라고한다. (여기서 전략이라고 하는 이유는 di의 전략 패턴이 적용되었기 때문)

DispatcherServlet이 제각각 다른 포맷의 오브젝트의 메소드를 호출 할 수 있는 방법은 DispatcherServlet과 컨트롤러 사이에 어댑터를 두는것이다. 그러면 DispatcherServlet은 항상 일정한 방식으로 컨트롤러를 호출하고 결과를 받을 수 있다.

 



3)컨트롤러의 모델 생성과 정보 등록

 

MVC 패턴의 장점은 정보를 담고 있는 모델과 그 정보를 어떻게 보여줄지를 알고있는 뷰가 분리된다는 점이다.

컨트롤러의 작업은 4가지로 분류할 수 있다.
먼저 사용자의 요청을 해석하는것, 그에 따라 실제 비즈니스 로직을 수행하도록 서비스 계층 오브젝트에게 작업을 위임하는것, 그리고 결과를 받아서 모델을 생성하는것, 마지막으로 어떤 뷰를 사용할지 결정하는것

컨트롤러가 해야할 중요한 2가지 작업이있다.
모델을 생성하는것, 그리고 모델에 정보를 넣어주는것

컨트롤로가 다시 DispatcherServlet에 돌려줘야하는 2가지 정보가있다.
모델과 뷰이다.

모델은 보통 맵에 담긴 정보라고 생각하면 된다. 중요한 것은 모델은 이름과 오브젝트 값 즉 이름과 값의 쌍으로 만들어진다는 사실이다.

 

 


4)컨트롤러의 결과 리턴: 모델과 뷰

 

모델이 준비됐으면 다음은 뷰를 결정할 차례이다. 뷰도 하나의 오브젝트다. 컨트롤러가 뷰의 논리적인 이름을 리턴해주면 DispatcherServlet의 전략인 뷰 리졸버가 이를 이용해 뷰 오브젝트를 생성해준다. 대표적으로 사용되는 뷰는 JSP/JSTL 뷰다. JSP 파일로 만들어진 뷰 템플릿과 JSTLVIEW 클래스로 만들어진 뷰 오브젝트가 결합해 최종적으로 사용자가 보게 될 HTML을 생성한다.

컨트롤러가 리턴해주는 정보는 결국 모델과 뷰 2가지라고 앞서 말했다.
스프링에는 ModelAndView라는 이름의 오브젝트가 있다. 이 ModelAndView가 DispatcherServlet이 최종적으로 어댑터를 통해 전달받는 오브젝트다. 
 모델과 뷰를 넘기는 것으로 컨트롤러의 책임은 끝이다. 다시 작업은 DispatcherServlet으로 넘어간다.
 
 

 

 

5)DispatcherServlet의 뷰 호출과 6)모델 참조

 

DispatcherServlet이 모델과 뷰를 전달받으면 뷰 오브젝트에게 모델을 전달해주고 client에게돌려줄 최종 결과물을 생성해달라고 요청하는 것이다. 보통은 브라우저를 통해 사용자가 결과를 볼 테니 브라우저에서 나타날 html을 생성하는 일이 가장 흔한 뷰의 작업이다. JSTLVIEW는 JSP를 이용해 결과물을 만들어주는데, 컨트롤러가 돌려준 JSP 뷰 템플릿의 이름을 가져다 HTML을 생성한다. 그 중 동적으로 생성되도록 표시된 부분은 모델의 내용을 참고로해서 내용을 채워준다.

뷰는 JSP, 엑셀, PDF와 같은 파일형태 또 최근에는 모델의 정보를 RSS, Atom이나 JSON으로 생성해주는 뷰도있다. 
모델은 같을지라도 어떤 뷰가 선택되느냐에따라 다른 형태의 결과물이 만들어진다.

뷰 작업을 통한 최종 결과물은 HttpServletResponse 오브젝트안에 담긴다.


 

 

7)http 응답 돌려주기

 

뷰 생성까지의 모든 작업을 마쳤으면 DispatcherServlet은 등록된 후처리기가 있는지 확인하고, 있다면 후처리기에서 후속작업을 진행한 뒤에 뷰가 만들어준 HttpServletResponse에 담긴 최종 결과를 서블릿 컨테이너에게 돌려준다. 
서블릿 컨테이너는 HttpServletResponse에 담긴 정보를 HTTP 응답으로 만들어 사용자의 브라우저나 클라이언트에게 전송하고 작업을 종료한다.






'Spring Framework' 카테고리의 다른 글

클라이언트 요청 처리 순서  (0) 2022.01.28
핸들러 인터셉터(Interceptor)  (0) 2022.01.28
Properties 값 져올때 오류  (0) 2022.01.14
스프링 IoC/DI 컨테이너  (0) 2021.12.24