스파게티 코드를 지양하고 코드 블럭의 분산으로 인해 가독성이 떨어지지 않도록 하기 위해 MVC 모델 1을 구축하게 되었다. 좌측의 경우 코드 블럭으로 인해 가독성이 매우 떨어지지만 우측의 경우 아주 깔끔하게 정리되어 보기 편한 것을 알 수 있다.
이 때 입력과 제어를 담당하는 부분을 Controller[자바 코드], 출력을 담당하는 부분을 View[HTML 코드], 출력할 데이터를 Model이라고 하여 MVC pattern이 된다.
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%
int num = 0;
String num_ = request.getParameter("n");
if(num_ != null && !num_.equals("")){
num = Integer.parseInt(num_);
}
String result;
if(num % 2 != 0)
result = "홀수";
else
result = "짝수";
%>
<!-- --------------------------- -->
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>
<%=result %>입니다.
</body>
</html>
Model | 설명 |
---|---|
Model 1 | 컨트롤러와 뷰가 물리적으로 분리되지 않은 방식 |
Model 2 | 컨트롤러와 뷰가 물리적으로 분리된 방식 |
Model 2에서는 Controller와 View가 분리되며 Dispatcher를 통해 Forwarding을 해주게 되는데 파일들이 많아지면 공통 Dispatcher 기능을 분리하여 집중화하게 된다.
집중화 이후에는 Controller들은 더 이상 서블릿 클래스가 아닌 일반 POJO라 불리는 클래스가 되며 이에 url-mapping 정보만 넘겨주어 디스패처가 해당되는 로직을 찾아갈 수 있게 한다.
Controller의 역할을 수행하며 Request 저장소를 통해 spag.jsp로 Model을 전달
package com.newlecture.web;
import java.io.IOException;
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;
@WebServlet("/spag")
public class Spag extends HttpServlet{
@Override
protected void doGet(HttpServletRequest request
, HttpServletResponse response)
throws ServletException, IOException {
int num = 0;
String num_ = request.getParameter("n");
if(num_ != null && !num_.equals("")){
num = Integer.parseInt(num_);
}
String result;
if(num % 2 != 0)
result = "홀수";
else
result = "짝수";
// request 저장소를 통해 전달
request.setAttribute("result", result);
// Forward - 동일한 디렉토리 내 있기에 경로 지정 안함
RequestDispatcher dispatcher
= request.getRequestDispatcher("spag.jsp");
dispatcher.forward(request, response);
}
}
View 역할을 수행하며 전달받은 Model을 출력
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>
<%=request.getAttribute("result") %>입니다.
</body>
</html>