프로그래밍/java, spring

mvc구조의 servlet, jsp와 비mvc구조의 jsp 비교

브래드 킴 2022. 12. 27. 10:20
728x90

jsp는 렌더링 속도적인 측면에서 우위가 있는 것은 맞으나 현재는 많이 사용하지 않는 레거시가 되었다. 그럼에도 아직도 공공기관, 금융권에서 jsp는 여전히 많이 사용된다.

오늘은 컨트롤러와 비지니스처리 역할을 담당하는 자바코드 + jsp로 이루어진 mvc구조의 형식과 jsp안에 모든 java코드가 들어가 있는 2개의 구조를 비교해 보고자 한다.

방법1

jsp에 java코드를 최대한 배제하고, java파일인 서블릿에서 비지니스 로직을 수행후 request와 response에 데이터를 담아 jsp로 넘겨주면, jsp에서 req와 res에서 값을 꺼내어 화면을 렌더링 하는 방식을 먼저 살펴보자.

HelloJsp.java

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(name = "helloJsp", urlPatterns = "/hello-jsp")
public class HelloJsp extends HttpServlet {
    @Override
    protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        Hello hello = new Hello();
        hello.setName("kim");
        hello.setAge(30);
        req.setAttribute("hello", hello);
        String path = "/WEB-INF/views/hello_mvc.jsp";
        RequestDispatcher rd = req.getRequestDispatcher(path);
        rd.forward(req, resp);
    }
}

localhost:8080/hello-jsp를 호출하면 지정한 경로의 화면으로 디스패칭 된다. 이때 jsp의 경로는 WEB-INF로 약속이 돼 있으므로, 반드시 WEB-INF하위에 jsp파일을 위치시켜야 한다.

hello_mvc.jsp

<%@ page contentType="text/html; charset=UTF-8" language="java" %>
<html>
<head>
    <title>Getting Started: Serving Web Content</title>
    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
</head>
<body>
<p>${hello.name}</p>
<p>${hello.age}</p>
</body>
</html>

hello.name과 hello.age는 사실 request.getName을 통해 꺼낸다음 hello객체로 cascading을 해야 하나, jsp에서 위와 같이 간편하게 data를 가져올 수 있는 것을 지원한다.

controller와 화면을 구분시킨 형태로서, jsp를 사용하는 레거시 중에서도 그래도 깔끔한 형태라고 볼 수 있을 것이다.

방법2

방법2는 jsp안에 모든 java코드가 들어가는 형태이다. 별도의 controller역할을 해주는 서블릿을 두지 않고, jsp에서 모든 로직을 처리하는 형태이다.

아래의 예제로 올린 코드는 짧은 형태여서 별 문제를 못 느낄 것이나, 현실에서는 엄청나게 긴 java코드가 들어가 있어서, 화면과 java코드가 분리되지 않아 유지보수의 큰 어려움을 유발하는 형태이다.

old_hello.jsp

<%@ page import="com.example.servlet.api.Hello" %>
<%@ page contentType="text/html; charset=UTF-8" language="java" %>
<%
    Hello hello = new Hello();
    hello.setName("kim");
    hello.setAge(30);
%>
<html>
<head>
    <title>Getting Started: Serving Web Content</title>
    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
</head>
<body>
<p><%=hello.getName()%></p>
<p><%=hello.getAge()%></p>
</body>
</html>


jsp코드에서 직접 객체를 생성하거나, 데이터베이스에서 값을 조회해와서 그것을 가지고, 화면에서 렌더링을 하는 방법이다. 위 파일을 호출할때는 full경로.jsp 이런식으로 jsp를 호출해야 한다. 별도의 컨트롤러가 없기 때문에, 해당 jsp파일을 직접 호출해줘야 하는 것이다.

이러한 코드의 경우, 코드가 극단적으로 길어질수 있어 가독성의 어려움이 있고, 화면의 작은 수정이 발생하더라도 java코드가 섞여 있으므로 컴파일 과정이 필요하여 속도가 오래 걸리고, 위의 코드로 jsp를 만들어 보면 알겠지만 디버깅도 엄청 어려워진다.

728x90