Servlet / JSP ) 13. JSP MVC

60jong·2022년 6월 28일
0

Servlet / JSP

목록 보기
13/17

Server 공부 흐름

Servlet --HTML코드 출력 문제--> JSP --스파게티 코드 문제--> [JSP MVC] -> Spring MVC -> SpringBoot


JSP MVC

MVC란

M : model / 출력 데이터
V : view / 출력 담당 (HTML 코드)
C : controller / 입력 담당 (자바 코드)

뒤의 설명을 들으면 감이 올 것이다.

JSP를 이용해 웹 프로그래밍을 할 때 발생했던 스파게티 코드 문제를 해결하기 위해 등장한
JSP MVC는 크게 JSP MVC model1 , JSP MVC model2 로 나눌 수 있다.


먼저 JSP model1,


JSP MVC model1

JSP MVC model1 의 핵심은

"입력 코드와 출력 코드를 구분해서 모아놓자"

num.jsp의 경우에는 입력 코드 출력 코드 구분 없이 코드가 입력되어 있다.

num.jsp

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%
  String _num = request.getParameter("num");
  int num = Integer.parseInt(_num);
%>
<html>
  <head>
    <title>Hello</title>
  </head>
  <body>
  <%if (num % 2 == 0) {%>
  짝수입니다.
  <%} else {%>
  홀수입니다.
  <%}%>
  </body>
</html>

이를 JSP MVC model1 방식으로 바꾸면


<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%--입력 코드--%>
<%
  String _num = request.getParameter("num");
  int num = Integer.parseInt(_num);

  String model = "";
  if (num % 2 == 0) {
    model = "짝수";
  } else {
    model = "홀수";
  }
%>
<%--입력 코드--%>
<html>
  <head>
    <title>Hello</title>
  </head>
  <body>
  <%--출력 코드--%>
    <%=model%>입니다.
  <%--출력 코드--%>
  </body>
</html>
  • 홀수인지 짝수인지 판별하는 로직은 입력 코드에 모으고, 이를 model이라는 변수에 담았다.
  • 출력 코드에서 model에 담긴 변수를 출력하게 된다.

이처럼

Controller : 입력 코드에는 로직을 담고서 변수들에 값을 할당하는 등 입력과 제어를 담당 (자바 코드)

Model : 할당된 변수를 출력 코드에서 출력하는 데에 사용, 출력 데이터를 담당

View : 출력을 담당 (HTML 코드)


JSP MVC model2

JSP MVC model2 의 핵심은

"Controller와 View가 물리적으로 분리된다."

JSP MVC model1의 경우에는 M,V,C가 모두 모여 있기에 JSP를 출력할 때 컴파일을 동반해야하지만,

입력과 제어를 담당해 컴파일이 필요한 Controller와 컴파일이 필요없는 View를 분리해 따로 관리한다면

  • 사용자 요청이 있을 때 View를 만들고, Controller는 미리 컴파일이 되어있기에 실행 속도 개선
  • 자바 코드 - HTML 코드 가 분리 되어있기에 유지 보수도 원활

이런 장점들을 취할 수 있다.


  • Controller - View 분리된 모습

    • 그림을 보아 Controller와 View가 분리되어 있고, Controller단에는 Dispatcher가 존재하는 것이 보인다.

    • Dispatcher는 Servlet끼리 연결(forward)해주는 장치라 생각하면 된다.

      Controller Servlet과 View Servlet을 분리하고 두 Servlet간의 데이터 교환은 Dispatcher를 통해 관리하는 방식


  • Distpatcher와 Controller가 분리된 모습

    • 이전의 방식에서, 모든 Controller Servlet에는 Dispatcher가 존재하게 된다.

    • 결국 비슷한 기능을 하는 장치끼리 분리하고 있는 상황이기에 (MVC) Dispatcher만을 남기로 Controller는 일반 자바 클래스로 관리한다.

    • POJO란, Plain Old Java Object 순수한 자바 객체라고 생각하면 된다.

      Controller와 Dispatcher를 구분해

      • 사용자 요청이 들어오면 Dispatcher Servlet이 먼저 요청을 만난 뒤,
      • 요청에 맞는 Controller 객체를 선택해 로직을 처리하고 반환 받은 값(model, view)을
      • JSP Servlet에게 forwarding해 요청에 응답하게 된다.

JSP MVC model2 구현

num.java

@WebServlet("/num")
public class Num extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response) 
    throws ServletException, IOException {
        String _num = request.getParameter("num");
        int num = Integer.parseInt(_num);

        String result = "";
        if (num % 2 == 0) {
            result = "짝수";
        } else {
            result = "홀수";
        }

        request.setAttribute("result", result);
        RequestDispatcher dispatcher = request.getRequestDispatcher("hello.jsp");
        dispatcher.forward(request,response);
    }
}

num.jsp

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
  <head>
    <title>Hello</title>
  </head>
  <body>
    <%=request.getAttribute("result")%>입니다.
  </body>
</html>

확실히 입력-제어 담당 / 출력 담당이 분리된 것을 확인할 수 있다.

JSP MVC model2 방식에서 Controller를 자바 객체로 관리하는 방식이 진정한 자바를 이용한 웹 프로그래밍의 핵심이라 생각이 든다.

자바라는 언어는 객체 지향 언어인 만큼, Controller를 일반 자바 클래스, 객체로 관리함으로써 유지 보수의 효율성을 취할 수 있기에, 자바의 취지에 부합하는 것 같다는 생각을 했다.

profile
울릉도에 별장 짓고 싶다

0개의 댓글