본문 바로가기
BackEnd/Spring

DispatcherServlet과 Spring MVC 아키텍처

by 규난 2022. 12. 18.
728x90

이번 포스트에서는 DispatcherServlet과 Spring MVC 아키텍처에 대해서 알아보도록 하겠습니다.

 

Spring MVC

스프링 웹 기술은 MVC 아키텍처를 근간으로 하고 있습니다.

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

 

MVC 아키텍처는 보통 front controller 패턴과 함꼐 사용됩니다.

front controller는 클라이언트가 보낸 요청을 가장 먼저 받아서 공통적인 작업을 수행한 후에 적절한 세부 컨트롤러로 작업을 위임해주고, 클라이언트에게 보낼 뷰를 선택해서 최종 결과를 생성하는 작업을 수행합니다.

 

Spring의 front controller DispatcherServlet

스프링이 제공하는 스프링 서블릿/MVC의 핵심은 DispatcherServlet이라는 front  controller이고 이는 MVC 아키텍처로 구성된 프레젠테이션 계층을 만들 수 있도록 설계되어 있습니다.

 

밑의 사진은 DispatcherServlet이 MVC 컴포넌트들과 동작하는 기본적인 구조를 보여줍니다.

(1) DispatcherServlet의 HTTP 요청 접수

서블릿-매핑에 정의된 url pattern에 포함된 요청을 front controller인 DispatcherServlet에게 할당해줍니다.

 

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

DispatcherServlet은 핸들러 매핑 전략을 이용해  URL이나 파라미터 정보, HTTP 명령 등을 참고해 어떤 컨트롤러에게 작업을 위임할지 결정합니다. 핸들러 매핑 전략이란 사용자 요청을 기준으로 어떤 핸들러(컨트롤러)에게 작업을 위임할지를 결정하는 것을 말합니다.

 

어떤 컨트롤러에게 요청을 처리할지 결정했다면 다음은 해당 컨트롤러 오브젝트의 메소드를 호출해서 실제 웹 요청을 처리하는 작업을 위임 할 차례입니다.  밑의 사진은 DispatcherServlet과 컨트롤러 사이의 호출 방법을 자세히 보여줍니다.

사진을 보면 DispatcherServlet은 컨트롤러가 어떤 메소드를 가졌고 어떤 인터페이스를 구현했는지 전혀 알지 못 합니다.

대신 컨트롤러 종류에 따라 적절한 어댑터를 사용하여 어댑터가 담당하는 컨트롤러에 맞는 호출 방법을 이용해서 컨트롤러에게 작업 요청을 보내고 결과를 돌려 받아서 DispatcherServlet에게 다시 전달해주는 방식을 사용하고 있습니다.

 

이러한 방식을 사용하게 되면 하나의 DispatcherServlet이 동시에 여러 가지 타입의 컨트롤러를 사용할 수 있습니다. 

어떤 어댑터를 사용할지는 DispatcherServlet 전략의 하나인 핸들러 어댑터 전략을 통해 결정하고 DI를 통해 자유롭게 확장이 가능합니다.

 

DispatcherServlet이 핸들러 어댑터에 웹 요청을 전달할 때는 모든 웹 요청 정보가 담긴 HttpServletRequest 타입의 오브젝트를 전달하고 이를 어댑터가 적절히 변환해서 컨트롤러 메소드가 받을 수 있는 파라미터로 변환해서 전달해줍니다. 또한 드물긴 하지만 컨트롤러에서 결과를 리턴 값으로 돌려주는 대신 HttpServletResponse 오브젝트 안에 직접 넣을 수도 있어서 HttpServletResponse도 함께 전달해줍니다.

 

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

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

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

 

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

스프링에는 ModelAndView라는 이름의 오브젝트가 있는데 이 오브젝트를 DispatcherServlet이 최종적으로 어댑터를 통해 컨트롤러로부터 돌려받는 오브젝트이며 모델과 뷰를 넘기는 것으로 컨트롤러의 책임은 끝이 납니다.

 

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

컨트롤러에게 모델과 뷰를 받은 뒤 뷰 오브젝트에게 모델을 전달해주고 클라이언트에게 돌려줄 최종 결과물을 생성하는 단계입니다.

JSP, Execl, PDF, JSON등으로 어떤 뷰가 선택되느냐에 따라 다른 형태의 결과물이 만들어질 수 있습니다. 뷰 작업을 통한 최종 결과물은 HttpServletResponse 오브젝트 안에 담기게 됩니다.

 

(7) HTTP 응답 돌려주기

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

728x90

'BackEnd > Spring' 카테고리의 다른 글

Spring - 오브젝트와 의존관계(관심사의 분리)  (0) 2023.03.19
@ControllerAdvice와 @ExceptionHandler  (0) 2023.01.08
빈 스코프  (0) 2022.12.18
빈 생명주기 콜백  (0) 2022.12.18
의존 관계 자동 주입  (0) 2022.12.18