ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [Servlet] 004. MVC 패턴 (Model2) 개요
    SsY/Class 2023. 6. 7. 18:00
    728x90
    MVC 패턴
    ■■■ 모델2 기반의 MVC 패턴 ■■■
    ○ 개요
      MVC 패턴에서 MVC 는 각각 Model, View, Controller 를 의미하는 것으로
      Model 은 데이터 또는 기본 기능(업무 로직)을 말하며, 
      View 는 유저 인터페이스를 말한다.
      이 두 가지는 시스템 개발에 있어서 반드시 필요한 부분이다.
      
      MVC 패턴은 C 패턴이라고도 불러도 괜찮을 만큼
      한 마디로 말해 Controller 라는 레이어 계층을 두는 것이 가장 중요하다.
      즉, Graphical User Interface 를 활용하는 과정에서
      Model 과 View 계층 사이에
      Controller 계층을 만들어 사용할 수 있도록 하는 것이다.
      
      이렇게 필수적인 두 계층 사이에
      필수적이지 않은 다른 계층을 두는 이유는
      두 계층(Model 과 View)이 직접적으로 결합되는 것을 막는 것으로
      Controller 계층은 Model 계층과 View 계층 사이에서 결합을 막아준다.
      Model 과 View 의 직접적인 결합은 이 둘을 함께 바뀌도록 만들어버린다.
      이것을 Controller 계층이 막아준다는 것이다.
      따라서... Controller 계층의 로직은 간단하게 설계해야 한다.
      //-- 컨트롤러는 예를 들어 업무에 따른 인원을 배분하는 역할을 하는데
      //-- 많게는 나가는 인원의 장비를 챙겨주고 하는 것들을 다 할 수 있는데
      //-- 해당 업무는 나가는 인원이 직접 하게 하는것이 합당하다.
      //-- 업무로직을 분리하고 합칠 때 해당 인원이 스스로 일을 할 수 있도록 하는것(?)
    ---------------------------------------------------------------------------------------------
    ○ WebApplication 에서의 MVC 구조//-- 여러 Application 에서 사용될 수 있음
    
      JSP 는 로직과 프리젠테이션을 알맞게 구분하기 위해
      Model2 구조를 지원하고 있으며,
      Model2 구조의 개념과 구현 방법, 장단점 등을 이해하고
      적용시키는 것이 중요하다.
    
     - Model1 구조
       모델1 구조는 일반적으로 JSP 만으로 구성되어있는 구조를 말한다.
       즉, JSP 페이지에서 동적인 부분(로직 부분)은 스크립릿으로 처리하고
       그 외 나머지 부분은 템플릿으로 처리하는 구조인 것이다. 
       모델1 과 모델2의 가장 큰 차이점은
       ★클라이언트의 요청이 진입하는 지점이 다르다는 것이다.★
       
       ·장점
          개발시간이 단축된다.
          단순한 페이지의 흐름을 바탕으로 MVC 구조에 대한 추가적인 이해가 필요하지 않다.
    
       ·단점
          HTML, Javascript, JSP 로직이 한 페이지에 작성되어
          어플리케이션이 복잡해질수록 유지보수가 힘들어진다.(거의 불가능)
          디자이너와 개발자 사이에 밀접하고 원활한 소통이 요구된다.
    
     - Model2 구조
       모델2 구조는 JSP 와 Servlet 그리고 JavaBean 컴포넌트를 함께 사용하며, 
       모델2의 클라이언트의 요청이 **진입하는 지점은 컨트롤러**이며,
       대부분의 웹 어플리케이션의 컨트롤러는 Servlet 이 담당한다.
    
       ·장점
          로직과 프리젠테이션의 분리로 인해 어플리케이션이 명료해지고 유지보수나 확장이 용이하다.
          디자이너와의 작업이 분리되어 있기 때문에 업무진행이 원활하고 책임의 소재가 명확해진다.
    
       ·단점
          개발 초기에 아키텍쳐 디자인을 위한 분석... 구성... 등의
          시간 소요로 개발 기간이 전체적으로 늘어난다.
          MVC 구조에 대한 개발자들의 이해를 필요로하며,
          이에 대한 이유로 사전 교육 기간 등이 소요될 수 있다.
    ---------------------------------------------------------------------------------------------
    ※ MVC(Model2) 구조
       - 모델(Model)
          비즈니스 로직과 관련된 부분만 처리
          데이터베이스 관련 로직 구현
          JavaBeans
    
       - 뷰(View)
          사용자에게 알맞은 화면을 보여주는 역할을 수행
          JSP
    
       - 컨트롤러(Controller)
          어플리케이션의 흐름제어나 사용자의 요청 구현
          사용자 인증, 보안 설정, 전체 어플리케이션에 공통으로 영향을 주는 요소 구현
          사용자의 요청에 알맞은 모델 사용
          사용자에게 보여줄 뷰 선택
          Servlet
    ---------------------------------------------------------------------------------------------
    ※ MVC(Model2) 구현
       - JSP 기반의 웹 어플리케이션에서 Controller 에 포함 되어야 할 작업
         ·웹 브라우저(클라이언트)의 요청을 받는다
         ·웹 브라우저(클라이언트)가 요구하는 작업을 분석한다.
         ·요청한 작업을 처리하는 비즈니스 로직을 수행하는 모델(Model:Java Beans)를 사용한다.
         ·처리결과를 reuqest 또는 session 에 저장한다.
         ·적절한 뷰(View:JSP)를 선택하여 해당 뷰로 포워딩(forwarding)한다.
    
       - JSP 기반의 웹 어플리케이션에서 View 에 포함되어야할 작업
         ·서블릿에서 dispatcher.forward(request, response) 로
           해당 JSP 페이지와 request, response 를 공유한 경우
           해당 JSP 페이지에서 request.getAttribute("result")와 같이
           바인딩한 데이터를 활용하여 결과를 화면에 표현한다.
    
       - JSP 기반의 웹 어플리케이션에서 Model 에 포함되어야 할 작업
         ·컨트롤러(Controller)의 요청을 받는다
         ·비즈니스 로직을 처리한다.
         ·처리한 비즈니스 로직의 결과를 컨트롤러(Controller)로 반환한다.


    MVC 관련 실습 1
    - WebApp24
    =====================================================================================================
    
    ○ MVC 관련 실습 1
    
      - prj : WebApp24 
    
      - 물리적 파일 구성 
       ·MVCBegin.jsp     → View 역할 (JSP 페이지)
       ·MVCBegin.java    → Controller 역할 (서블릿 클래스)
       ·web.xml          → URL 매핑
    
      - 사용자 최초 요청 주소
        http://localhost:8090/WebApp24/mvcbegin
    
    =====================================================================================================
    <%@ page contentType="text/html; charset=UTF-8"%>
    <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
    <%
    	request.setCharacterEncoding("UTF-8");
    	String cp = request.getContextPath();
    %>
    <!DOCTYPE html>
    <html>
    <head>
    <meta charset="UTF-8">
    <title>MVCBegin.jsp</title>
    <link rel="stylesheet" type="text/css" href="css/main.css">
    </head>
    <body>
    
    <div>
    	<h1>MVC 실습</h1>
    	<hr />
    </div>
    
    <div>
    	<!-- <h2>안녕하세요, MVC 패턴입니다.</h2> -->
    	<h2>${message }</h2>
    </div>
    
    </body>
    </html>

    /* =======================
     	MVCBegin.java
    ======================== */
    package com.svt;
    
    import java.io.IOException;
    
    import javax.servlet.RequestDispatcher;
    import javax.servlet.ServletException;
    import javax.servlet.http.HttpServlet;
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;
    
    public class MVCBegin extends HttpServlet
    {			//------- 클래스 -> 서블릿
    	private static final long serialVersionUID = 1L;
    
    	@Override
    	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException
    	{
    		doGetPost(request, response);
    	}
    
    	@Override
    	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException
    	{
    		doGetPost(request, response);
    	}
    	
    	protected void doGetPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException
    	{
    		// 서블릿 관련 코딩
    		//-- get 과 post 방식으로 별도로 코딩 가능하나 이러한 경우가 별로 없기 때문에 하나로 구성
    		//-- 필요하면 위 두 코드에 따로 작성도 가능
    		
    		// 필요한 경우 Model 구성하여 로직 수행
    		//-- 즉, connection, dao, dto 구성하여 처리
    		
    		String message = "안녕하세요, MVC 패턴입니다.";
    		
    		// View 역할을 수행하는 JSP 페이지에 데이터를 전달해야 한다.
    		request.setAttribute("message", message);
    		
    		// check!!
    		// 제어권(제어 흐름)도 JSP 페이지(View)에 전달해야 한다.
    		//-- 네가 클라이언트를 만나라~
    		RequestDispatcher dispatcher = request.getRequestDispatcher("WEB-INF/view/MVCBegin.jsp");
    		dispatcher.forward(request, response);
    		//-- 『javax.servlet.RequestDispatcher』 클래스는
    		//   현재 클라이언트의 요청을 다른 서블릿/ JSP  페이지로 전달하거나
    		//   다른 서블릿/JSP 페이지의 결과를 현재 위치에 포함시키고자 할 때 사용된다.
    		
    		// ※ RequestDispatcher 객체는
    		//    이러한 기능을 제공하기 위해
    		//    forward() 메소드와 include() 메소드를 제공하고 있으며
    		//    이 두 메소드는 JSP 의 <jsp:forward> 액션 태그
    		//    <jsp:include> 액션 태그와 동일한 기능을 제공한다.
    		//   위의 경우는 현재 요청을 『MVCBegin.jsp』로
    		//   보내고자 하는 경우이다.
    		
    		//==> 웹 기반 모델2(MVC) 구조는
    		//    바로 이 『RequestDispatcher』의 『forward()』
    		//    메소드를 통해 구현된다.
    	}
    	
    }

    <?xml version="1.0" encoding="UTF-8"?>
    <web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    	xmlns="http://xmlns.jcp.org/xml/ns/javaee"
    	xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd"
    	id="WebApp_ID" version="3.1">
    	<display-name>WebApp00</display-name>
    	<welcome-file-list>
    		<welcome-file>index.html</welcome-file>
    		<welcome-file>index.htm</welcome-file>
    		<welcome-file>index.jsp</welcome-file>
    		<welcome-file>default.html</welcome-file>
    		<welcome-file>default.htm</welcome-file>
    		<welcome-file>default.jsp</welcome-file>
    	</welcome-file-list>
    <!-- 	
    	<servlet>
    		<servlet-name></servlet-name>
    		<servlet-class></servlet-class>
    	</servlet>
    
    	<servlet-mapping>
    		<servlet-name></servlet-name>
    		<url-pattern></url-pattern>	
    	</servlet-mapping>
    -->
    
    	<servlet>
    		<servlet-name>MVCBegin</servlet-name>
    		<servlet-class>com.svt.MVCBegin</servlet-class>
    	</servlet>
    
    	<servlet-mapping>
    		<servlet-name>MVCBegin</servlet-name>
    		<url-pattern>/mvcbegin</url-pattern>	
    	</servlet-mapping>
    
    </web-app>

     

    728x90
Designed by planet-si