Spring에서의 요청 흐름 2 - MVC, JSP

Updated: Categories:

Spring에서의 MVC 패턴의 등장 (feat. JSP)

MVC 패턴

전 포스팅에서는 서블릿이 뭔지에 대해 미리 알아봤었다.
이번엔 지금까지 잘 알고 있는줄 알았던 MVC 패턴을 스프링에서 어떻게 사용하는지 알아보고자 한다.

정의

  • Model, View, Controller 세가지 구성요소로 이루어진 디자인 패턴이다.
    • Model : 표현하고자 하는 데이터
    • View : HTML과 같은 UI 요소
    • Controller : Model과 View를 연결하는 인터페이스 역할

초기의 서블릿 모습

public 서블릿 extends HttpServlet {
    public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        response.setContentType("text/html");
        printWriter out = response.getWriter();
        out.println(docType + 
            "<HTML>\n" +
            "<HEAD><TITLE>" + title + "</TITLE></HEAD>\n" +
            ...
            "</BODY></HTML>");
        )
    }
}

위 예시 코드를 보면 하나의 서블릿이 요청을 받고, 서비스로직을 처리 후 html에 데이터를 바인딩하는 것을 볼 수 있다.
모델, 뷰, 컨트롤러의 책임을 하나의 서블릿이 모두 맡아 처리하는 것이다.

누가봐도 코드가 복잡하고 유지보수가 힘들어 보인다. 그래서 MVC 패턴이 점점 발전하게 된다.

JSP

  • Java Server Pages의 약자로, HTML에 자바 코드를 넣어 동적 웹페이지를 만드는 기술

JSP? 그거 완전 오래된 기술 아니야? 라고 생각했었는데, 여기에 스프링 MVC의 역사가 담겨있었다.

우선 JSP의 초기 모델인 MVC1 부터 살펴보자

MVC1
<%
// java 코드블럭
String model = "HI";
%>

<html>

<head>
    <meta charset="UTF-8">
    <title></title>
</head>

<body>
	<span><%= model %></span>
</body>

</html>

java 코드와 html 문법이 혼재되어 있는 형태이다.
보통 java 코드 블록에서 java bean으로 등록된 model을 불러와 사용할 수 있다.

즉, jsp의 파일 하나가 컨트롤러와 뷰의 책임을 맡는 것이다.

image

이와 같이 또 결합도 높은 코드가 불편했는지 여기에 서블릿을 추가한 MVC2가 등장한다.

MVC2
// web.xml이나 @WebServlet로 매핑되는 서블릿. (컨트롤러의 역할을 함)
public 서블릿 extends HttpServlet {

    private final Service service;

    public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        // 모델 생성
        String model = service.getDummy();
        req.setAttribute("model", model);
        // view에 전달
        req.getRequestDispatcher("/어쩌구.jsp").forward(req, res);
    }
}
<html>

<head>
    <meta charset="UTF-8">
    <title></title>
</head>

<body>
	<span><%= model %></span>
</body>

</html>

우선 MVC1과 달리 서블릿이 추가되었다는 것을 알 수 있다.

  1. 코드를 보면 우선 요청은 서블릿으로 먼저 받게 된다. 즉 서블릿이 컨트롤러의 역할을 한다
  2. 선택된 서블릿은 요청 객체에 대한 서비스 로직을 수행하고, 서비스 계층에서 모델을 가져와 요청에 바인딩한다.
  3. 그리고 해당 요청을 자바코드와 분리되어 있는 jsp를 찾아서 바인딩하는데, 여기서 view가 분리되었다는 것을 알 수 있다.

결과적으로 M, V, C 계층이 모두 분리된 형태를 알 수 있고, 이것이 MVC 패턴의 기본이 되었다고 할 수 있다.

image

MVC2의 동작과정은 대충 알것 같지만, 이를 서블릿 컨테이너 시점에서 살펴보면 약간의 문제점이 보인다.

MVC2에서의 요청 흐름

(위 그림에서는 스프링 컨테이너에 컨트롤러를 따로 두지 않았다.)
요청이 들어올때마다 요청 url에 맞는 서블릿을 각자 하나씩 생성하고 매핑해주어야 하는 것을 알 수 있다.
서블릿을 직접 만들고 등록하면서는 써보지는 않았지만, 이런 방식이라면 개발이 너무 불편할 것 같다는 생각이 든다.

따라서 등장한 것이 Spring MVC 프레임워크이다.
Spring MVC는 내용이 많아서 다음 포스팅에서 알아보도록 한다…