2월 05, 2024

[Spring MVC 패턴] MVC 정의, 구성요소, 다이어그램, 장단점 총정리

 오늘은 Spring MVC 구조에 대하여 살펴보도록 하겠다. 


1) MVC 패턴이란? 


Spring MVC 패턴은 애플리케이션을 개발할 때 사용하는 디자인 패턴으로, 각 영역을 Model, View, Controller로 나누어 코드를 작성하는 개발 방식이다. 


- Model: 웹 애플리케이션이  Client의 요청을 받아 요청사항을 처리하기 위한 작업을 한다. 응답을 돌려줄 때 작업의 처리 결과 데이터를 model이라고 부른다. 

- View: web 상에서 보이는 리소스를 제공하는 역할을 한다. 우리가 흔히 아는 HTML 페이지나 JSP 등이 View에 해당된다. 

- Controller: Controller는 Model과 View 사이의 상호작용을 해주는 역할을 수행한다. 



2) Spring MVC 구조 다이어그램



MVC 디자인 패턴이 Model, View, Controller로 구성되어 있는 디자인 패턴이라는 것은 많은 사람들이 알지만 실제로 안에서 구체적으로 어떻게 동작하는지는 모르는 사람들이 있다.


위 다이어그램을 보고 각 구성요소를 하나씩 공부해보자.


- DispatcherServlet

DispatcherServlet은 Client의 요청(Request)을 받는다. https://www.programmingstory.com/2024/01/front-controller-pattern.html

위 이전 글에서 다루었듯이 Controller의 Controller로 Front Controller라고 불리기도 한다. 


- HandlerMapping

HandlerMapping은 요청으로 들어온 클라이언트의 요청 URL을 어떤 Controller에서 처리할지를 결정한다. 


- HandlerAdapter

해당 Controller를 처리할 수 있는 Adapter를 찾아서 Controller의 작업을 수행해준다. Controller에서 비즈니스 로직을 수행하면 나오는 Model은 HandlerAdapter를 통해 ModelAndView로 return된다.


- ModelAndView

Controller에서 처리한 결과 정보와 View에 필요한 정보를 담는다.


- ViewResolver 

ModelAndView로 전달을 받으면 실제 Client에게 보여질 View를 렌더링하기 위해 어떤 View를 사용할지 결정한다.


- View

ViewResolver에 의해 View가 결정되면 해당 객체에 해당되는 View가 렌더링된다. 


3) MVC 디자인 패턴의 장단점

MVC 디자인 패턴은 모델, 뷰, 컨트롤러를 나누어 개발할 수 있기에 개발이 파트별로 나뉘어 진행될 수 있다는 장점을 가진다. 테스트 및 디버그가 쉽다는 장점이 있으며, 각 구성요소별로 나누어져 있어 중복된 코드를 제거할 수 있다는 장점이 있다. 


다만 구성요소별로 나누어져 있기 때문에 많은 파일이 생성될 수 있고 유지보수가 어렵다는 단점이 있다. 


1월 31, 2024

Front Controller Pattern의 정의와 DispatcherServlet을 사용한 예제 코드

1. Front Controller Pattern (프런트 컨트롤러 패턴) 이란? 

Front Controller Pattern (프런트 컨트롤러 패턴)이란 모든 요청을 단일 Handler에서 처리하는 패턴을 의미한다. 

Spring Web MVC 프레임워크에서는 DispatherServlet이 프런트 컨트롤러 역할을 한다.  


2. Front Controller Pattern 다이어그램




Front Controller Pattern을 사용하여 클라이언트의 요청을 받아들이고, 각 요청에 대한 적절한 Controller를 찾아 호출해주는 패턴을 구축할 수 있다. 


프런트 컨트롤러 패턴을 구축한 예제 코드는 아래와 같이 작성해볼 수 있다. 


3. DispatcherServlet을 사용한 예제코드

import org.example.mvc.controller.Controller;
import javax.servlet.RequestDispatcher;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;

@WebServlet("/")
public class DispatcherServlet extends HttpServlet {
    private RequestMapping requestMapping;

@Override
public void init() throws ServletException {
requestMapping = new RequestMapping();
requestMapping.init();
}

@Override
protected void service(HttpServletRequest request, HttpServletResponse response)
    throws ServletException, IOException {

try {
            // requestMapping을 통해 URI에 해당하는 Controller를 찾아줌
Controller handler = requestMapping.findHandler(request.getRequestURI());
String viewName= handler.handleRequest(request, response);
  RequestDispatcher requestDispatcher = request.getRequestDispatcher(viewName);
requestDispatcher.forward(request, response);
} catch (Exception e) {
throw new ServletException(e);
}
}
}


즉 DispatcherServlet은 HttpServlet을 extend 하고 있는 class이며 

특정 URI가 들어왔을 경우 그것에 맞는 Controller를 찾아주는 RequestMapping이라는 별도의 class가 있다고 가정했을 때 그것에 맞는 Controller가 return된다. 


해당 Controller를 통해서 들어온 요청을 처리하고 Controller에서는 view 를 return해준다. 


이렇게 DispatcherServlet을 프런트 컨트롤러로 삼아서 단일 handler에서 처리되는 패턴을 프런트 컨트롤러 패턴이라고 부른다. 


8월 30, 2023

Spring Web MVC 아키텍쳐 알아보기

[Spring] - 모델-뷰-컨트롤러(MVC) 패턴이란?

 

이전 포스팅에서 모델-뷰-컨트롤러라는 전체적인 MVC 패턴에 대하여 알아보았다. 오늘은 더 범위를 좁혀서 Spring Web MVC 아키텍쳐에 대하여 알아보도록 하겠다.

 

Spring Web MVC 아키텍쳐는 아래의 그림 하나로 요약이 가능하다. 



  

위 다이어그램에서 볼 수 있듯이 Srping Web MVC에서 핵심이 되는 것은 "DispatcherServlet"이다. 이는 등록된 요청 핸들러라고 할 수 있으며 요청을 전달하는 프론트 컨트롤러이다. 프론트 컨트롤러는 다른 컨트롤러들을 관리하는 최상위 컨트롤러라고 할 수 있다. 

 

각 핸들러는 서비스의 역할을 수행하며 DispatcherServlet이 요청을 전달할 뷰를 지정하게 된다. 


위 다이어그램을 통해서 Spring Web MVC에서 어떠한 과정으로 플로우가 흘러가는지 간단히 설명하도록 하겠다.

 

1. HTTP 요청 : 요청이 DispatcherServlet에 연결된다. 

 

2. 요청에 따른 컨트롤러 확인: DIspatcherServlet은 요청 경로에 따라 등록된 핸들러 중 어떤 핸들러가 호출되어야 할 지 결정하여 요청을 다시 전달하게 된다.

 

3. HTTP 요청: HTTP 요청을 핸들러가 처리하게 된다. 1번은 HTTP 요청이 DIspatcherServlet 즉 최상위 컨트롤러에 전달되어 어떤 컨트롤러에게 전달되어야 되는지 확인했던 과정이라면, 3번에서는 직접 연결되는 컨트롤러에 HTTP 요청이 전달된 것이라고 보면 된다. 

 

4. 모델 쿼리 업데이트: 핸들러는 모델에 대한 쿼리나 업데이트를 수행한다.

 

5. 모델 데이터 반환: 모델에서 필요한 작업을 수행한 뒤 모델 데이터가 반한된다. 

 

6. 모델 및 뷰 반환: 핸들러는 데이터와 논리 뷰 이름을 최상위 컨트롤러인 DIspatcherServlet으로 반환한다.

 

7. 뷰 이름으로 뷰 찾기: 논리 뷰 이름을 전달받은 DispatcherServlet은 뷰 이름을 확인하여 뷰 이름으로 뷰를 찾는다.

 

8. 모델 데이터 전달: 실제 뷰에 모델 데이터를 전달한다. 

 

9. 페이지 렌더링: 뷰에서는 모델 데이터를 전달받아 응답을 생성하고 DispatcherServlet은 응답을 클라이언트로 내보낸다. 

 


전반적인 개념 설정은 위와 같고, 실제 구체적인 예시를 통해 Spring Web MVC 응용프로그램을 만드는 것은 다음 포스팅에서 다루어보도록 하겠다.