Servlet / JSP #12 JSP MVC model

underlier12·2020년 1월 25일
0

SERVLET&JSP

목록 보기
12/16

12. JSP MVC model

MVC model 1

스파게티 코드를 지양하고 코드 블럭의 분산으로 인해 가독성이 떨어지지 않도록 하기 위해 MVC 모델 1을 구축하게 되었다. 좌측의 경우 코드 블럭으로 인해 가독성이 매우 떨어지지만 우측의 경우 아주 깔끔하게 정리되어 보기 편한 것을 알 수 있다.

image.png

image.png

이 때 입력과 제어를 담당하는 부분을 Controller[자바 코드], 출력을 담당하는 부분을 View[HTML 코드], 출력할 데이터를 Model이라고 하여 MVC pattern이 된다.

image.png

MVC model 1 구현

<%@ 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>

MVC model 2

MVC model 1 vs model 2

Model설명
Model 1컨트롤러와 뷰가 물리적으로 분리되지 않은 방식
Model 2컨트롤러와 뷰가 물리적으로 분리된 방식

image.png

Dispatcher 집중화 전/후

Model 2에서는 Controller와 View가 분리되며 Dispatcher를 통해 Forwarding을 해주게 되는데 파일들이 많아지면 공통 Dispatcher 기능을 분리하여 집중화하게 된다.

image.png

집중화 이후에는 Controller들은 더 이상 서블릿 클래스가 아닌 일반 POJO라 불리는 클래스가 되며 이에 url-mapping 정보만 넘겨주어 디스패처가 해당되는 로직을 찾아갈 수 있게 한다.

image.png

MVC model 2의 구현

  • Redirect : 작업이 완료 된 후 새로운 다음 작업을 요청
  • Forward : 작업을 이어서 할 수 있도록 요청

Spag.java

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);
	}
}

spag.jsp

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>
profile
logos and alogos

0개의 댓글