[jsp] MVC 패턴

seulki·2022년 10월 13일
0

jsp

목록 보기
27/51
post-custom-banner

🎈 MVC 패턴

  • M : Model
    - 사용자가 원하는 데이터나 정보를 제공
    • 애플리케이션의 정보, 데이터를 나타낸다.
    • 이러한 data, 정보들의 가공을 책임지는 영역을 말한다.
  • V : View
    - 보여지는 화면
    • input 텍스트, 체크박스 항목 등과 같은 사용자의 인터페이스 요소(UI)
    • 데이터 및 객체의 입력, 그리고 보여주는 출력을 담당한다.
    • 데이터를 기반으로 사용자들이 볼 수 있는 화면이다.
  • C : Controller
    - 사용자의 요청을 처리하고, 그 요청에 따른 전체적인 흐름 제어
    • 데이터와 사용자 인터페이스 요소를 잇는 다리 역할을 한다.
    • 모든 요청은 Controller에서 가장 먼저 받는다.
      사용자의 요청정적 페이지라면 컨트롤러에서 View 단 반환,
      요청이 동적 페이지라면 Model(DB)단으로 요청을 넘긴다.
  1. 사용자가 요청을 보낸다.
  2. 컨트롤러에서 먼저 요청을 받아서 DB 데이터가 필요한지 판단한다.
  3. 만약 요청이 정적페이지라면, Model 갈 필요 없이 View 단에서 사용자에게 바로 응답을 보낸다.
    요청이 동적페이지라면, 컨트롤러가 요청을 받아서 Model에 요청을 한다.
    DB connection 이 일어나고 data를 받아온다.
  4. data 값view 단을 통해 사용자에게 응답한다.

!간단하게 용어설명!

  • Controller는 사용자의 요청을 가장 먼저 받으며, 컨트롤러의 역할을 하는 자바파일을 의미한다.
  • Model 은 DB 커넥션을 맺고, Query문을 날리는 자바파일을 의미한다.


🎈 MVC model1 (MVC1)

  • MVC1 패턴의 경우 ViewController를 모두 JSP가 담당하는 형태를 가진다.
  • 즉, JSP 하나유저의 요청을 받고, 응답을 처리하므로 구현의 난이도는 쉽다.
  • 단순한 프로젝트에는 괜찮겠지만, 내용이 복잡하고 거대해 질수록 이 패턴은
    힘을 잃는다. 즉, 유지보수에 있어서 문제가 발생한다.

  • 예시 코드를 MVC1 model로 변경해보기
    - 예시코드
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
   
<%
	int num = 0;
	String num_ = request.getParameter("num");
	
	if(num_ != null && !num_.equals("")){
		num = Integer.parseInt(num_);
	}
%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
	<%if(num % 2 != 0){ %>
		홀수입니다.
	<%}else {%>
		짝수입니다.
	<%} %>
	
</body>
</html>
  • html 태그 아래부분이 View단이다. view단에서 판단을 하는 로직을 포함하고 있는데, 이러한 경우가 유지보수가 힘든 경우이다.


  • MVC1 model로 변경하기
  <%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<%
	int num = 0;
	String num_ = request.getParameter("num");
	
	if(num_ != null && !num_.equals("")){
		num = Integer.parseInt(num_);
	}
	
	String result = "";
	if(num %2 != 0){
		result = "홀수";
	}else{
		result = "짝수"; 
	}
%>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
	<%=result %>입니다.
</body>
</html>

  • html 윗 부분이 요청을 가장 먼저 받는 부분인 Controller 이고



  • html 부분이 View 단으로 jsp파일에서 Controller와 View단을 같이 처리한다.


  • 결과값, 데이터를 나타내는 Model 영역이다.

  • 예시코드보다 직관성이 높고, 가독성이 높아졌다.



🎈 MVC model2 (MVC2)

  • MVC2 패턴은 널리 표준으로 사용되는 패턴이다.
  • 요청을 하나의 컨트롤러(Servlet을 상속받은 .java)가 먼저 받는다.
  • 즉 MVC1과는 다르게 Controller와 View 단이 분리되어 있다.
  • 따라서 역할이 분리되어 MVC1 패턴에서의 단점을 보완할 수 있다.
  • 그러므로 개발자는 M, V, C 중에서 수정해야 할 부분이 있다면,
    그것만 꺼내어 수정하면 된다.
  1. 클라이언트가 요청을 보낸다.
  2. Controller 부분이 Servlet영역 .java 파일로 분리된다.
  3. DB단 갈 필요가 없는 요청이라면 Controller에서 바로 View단으로 응답한다.
  4. DB단과의 커넥션이 필요하다고 컨트롤러가 판단하면 Model 영역으로 요청한다.


  • 예시 코드를 MVC1 model로 변경해보기
  • 예시코드
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
   
<%
	int num = 0;
	String num_ = request.getParameter("num");
	
	if(num_ != null && !num_.equals("")){
		num = Integer.parseInt(num_);
	}
%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
	<%if(num % 2 != 0){ %>
		홀수입니다.
	<%}else {%>
		짝수입니다.
	<%} %>
	
</body>
</html>
  • html 태그 아래부분이 View단이다. view단에서 판단을 하는 로직을 포함하고 있는데, 이러한 경우가 유지보수가 힘든 경우이다.


  • MVC2 model로 변경하기
  • Caos.java
package com.koit.web.servlet;

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("/caos")
public class Caos  extends HttpServlet{

	@Override
	protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {

		int num = 0;
		String num_ = req.getParameter("num");
		
		if(num_ != null && !num_.equals("")){
			num = Integer.parseInt(num_);
		}
		
		String result = "";
		if(num %2 != 0){
			result = "홀수";
		}else{
			result = "짝수"; 
		}
		
		req.setAttribute("result", result);
		RequestDispatcher dispatcher = req.getRequestDispatcher("mvc/mvc2.jsp");
		dispatcher.forward(req, resp);
	}
}
  • 사용자로부터 "/caos" 요청이 오면 Controller 자바파일에서 먼저 받는다.
  • 컨트롤러의 역할을 하는 파일이 자바파일이면 MVC2 패턴이다.
  • 자바단에서 forward 방식으로 페이지 이동하려면 RequestDispatcher 객체가 필요하다.
    (jsp에서는 request 내장객체가 있어서 간단하게 forward 방식을 사용했지만, Servlet에서는 객체 필요하다.)
  • "mvc/mvc2.jsp" 경로로 data값인 result를 넘김


  • "mvc/mvc2.jsp"에서 출력하기
      <%@ page language="java" contentType="text/html; charset=UTF-8"
        pageEncoding="UTF-8"%>
    <!DOCTYPE html>
    <html>
    <head>
    <meta charset="UTF-8">
    <title>Insert title here</title>
    </head>
    <body>
    	<%=request.getAttribute("result") %> 입니다.
    </body>
    </html>


profile
웹 개발자 공부 중
post-custom-banner

0개의 댓글