본문 바로가기
Dev/Java

MVC 패턴 정의

by vellahw 2022. 10. 4.

 

 

0. 모델 1 구조

모델 1 구조는 JSP를 이용한 단순한 모델이다. (기존에 했던 모든 것들..)

모델 1 구조의 요청/응답 처리 방식

JSP에서 요청 처리 및 뷰 생성을 처리해서 구현이 쉽지만 요청 처리 및 뷰 생성 코드가 뒤섞여 코드가 복잡하다.

 

💡. 모델 2 구조

모든 요청을 서블릿이 처리하고 JSP가 뷰를 생성한다.

모델 2 구조의 요청/응답 처리 방식

웹 브라우저의 모든 요청을 단일 서블릿에서 처리하고 요청 처리 후 결과를 보여줄 JSP로 포워딩한다.

포워딩을 통해서 요청 으름을 받은 JSP는 결과 화면을 클라이언트에게 전송한다. 즉, 서블릿이 로직 부분을 처리하게 되는 것이다.

모델 2의 이러한 특징 때문에 MVC 패턴에 기반을 두어 웹 어플리케이션을 구현할 때는 모델 2 구조를 주로 사용하게 된다.

 

 

💡✨. MVC 패턴

MVC는 Model-View-Controller(모델-뷰-컨트롤러)의 약자이다.

MVC 패턴의 구조

  • 모델: 비즈니스 영역의 상태 정보를 처리
  • : 비즈니스 영역에 사용자가 보게 될 결과 화면을 담당 (JSP의 역할)
  • 컨트롤러: 사용자의 입력 및 흐름 제어를 담당

 

사용자는 원하는 기능을 처리하기 위한 모든 요청을 단일 컨트롤러에 보내고 모델은 비즈니스와 관련된 상태 정보 및 관련 기능을 제공한다. 컨트롤러는 이 모델을 통해 사용자의 요청을 처리하게 된다.

모델을 사용하여 알맞은 로직을 수행한 후 컨트롤러는 사용자에게 보여줄 뷰를 선택하며,

선택한 는 사용자에게 알맞은 결과 화면을 보여준다.  

뷰가 사용자에게 결과 화면을 보내줄 때는 결과 정보가 필요한데 컨트롤러가 이 정보를 뷰에게 전달해준다.

 

👀. MVC 패턴의 핵심

로직을 처리하는 모델과 결과 화면을 보여주는 뷰가 분리되어 있고 흐름제어나 사용자의 처리 요청은 컨트롤러에 집중된다는 것이다.

웹 어플리케이션의 흐름 제어나 보안 설정의 변경 등과 같은 유지 보수 작업이 필요할 경우 컨트롤러만 변경하면 되고, 새로운 타입의 사용자(새로운 모바일 기기의 추가 같은 경우)가 새롭게 추가될 때에는 새로운 뷰를 추가해주면 된다. 

즉, MVC 패턴은 유지 보수 작업이 간단해지고 어플리케이션을 쉽게 확장 할 수 있다는 장점이 있다.

 

1. MVC의 컨트롤러 : 서블릿

모델 2 구조에서 서블릿은 MVC 패턴의 컨트롤러 역할을 한다. 서블릿은 웹 브라우저의 요청과 웹 어플리케이션의 전체적인 흐름을 제어하게 된다.

 

컨트롤러 서블릿의 내부 동작 방식

  1. 웹 브라우저가 전송한 http 요청을 받고 서블릿의 doGet() 메소드나 doPost() 메소드가 호출됨
  2. 웹 브라우저가 어떤 요청을 했는지 분석 (ex.게시판 목록 요청, 글 쓰기 요청 등)
  3. 모델을 사용하여 요청한 기능 수행
  4. 모델로부터 전달 받은 결과물을 알맞게 가공한 후 request나 session의 setAttribute() 메소드를 사용하여 결과를 속성에 저장. 저장된 결과값을 뷰(=JSP)에서 사용
  5. 웹 브라우저에 보여줄 JSP를 선택, 해당 JSP로 포워딩 (경우에 따라 리다이렉트를 하기도 함) 

로직의 처리는 모델에서 이루어지며 서블릿은 모델이 내부적으로 어떻게 로직을 처리하는지 알 필요 없이 웹 브라우저의 요청에 알맞게 모델을 사용하여 요청한 기능을 수행하고 그 결과를 뷰인 JSP에게 전달 해주기만 하면 된다.

 

2. MVC의 뷰 : JSP

뷰 역할을 하는 JSP는 컨트롤러 부분에서 request 기본 객체나 session 기본 객체에 저장한 데이터를 사용하여 웹 브라우저에 알맞은 결과를 출력해준다.

웹 브라우저가 요청한 결과를 보여주는 프레젠테이션의 역할을 할 뿐만 아니라 웹 브라우저의 요청을 컨트롤러에 전달해주는 매개체가 되기도 한다.

 

3. MVC의 모델

컨트롤러는 서블릿을 통해서 구현 되고, 뷰는 JSP를 통해서 구현되는 반면 모델은 명확하게 어떤 것을 통해서 구현 된다는 규칙은 없다.

로직을 처리해주면 모델이 될 수 있으며, 모델은 웹 브라우저의 요청을 처리하는데 필요한 기능을 제공해야한다.

예를 들어 계좌 이체 기능을 요청 했다면 모델은 계좌 이체를 시켜주는 기능을 제공 해야 하며, 컨트롤러는 웹 브라우저의 요청이 들어올 경우 모델의 계좌 이체 기능을 사용할 수 있도록 해준다.

컨트롤러 역할을 하는 서블릿과 모델 간의 통신

👀 모델은 수행한 결과를 컨트롤러에 리턴 시켜준다.

 

 

🎈. 간단한 MVC 패턴 연습 예제

  1. 서블릿: 화면에 출력할 메시지를 생성해 JSP에 전달
  2. JSP: 서블릿으로부터 전달 받은 메시지를 화면에 출력

 

1. 서블릿 클래스 작성

package mvc.controller;

import java.io.IOException;
import java.util.Date;

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 SimpleController extends HttpServlet {
	//1. 요청을 받음
	//HttpServlet 메소드 오버라이드1
	public void doGet(HttpServletRequest request, HttpServletResponse response) 
			throws ServletException, IOException {
		processRequest(request, response);
	}
	//HttpServlet 메소드 오버라이드2
	public void doPost(HttpServletRequest request, HttpServletResponse response)
		throws ServletException, IOException {
		processRequest(request, response);
	}
	
	private void processRequest(HttpServletRequest request, HttpServletResponse response)
		throws ServletException, IOException {
		
		//2. 요청을 파악
		//request 객체로부터 사용자의 'type'입력 요청을 파악한다
		String type = request.getParameter("type");
		
		//3. 요청한 기능을 수행 (모델 작성 하지 않았기 때문에 직접 요청 수행 하는 코드)
		Object resultObject = null; //최상위 Object 클래스
		//사용자 요청에 따른 코드
		if(type == null || type.equals("greeting")) {
			resultObject = "안녕하세용";
		} else if(type.equals("date")) {
			resultObject = new Date();
		} else {
			resultObject = "Invalid Type";
		}
		
		//4. request나 session에 처리 결과 저장
		//request 영역 "result" 속성으로 resultObject 저장
		request.setAttribute("result", resultObject);
		
		//5. RequestDispatcher를 사용하여 알맞은 뷰로 포워딩
		//파라미터 정보 유지를 위한 RequestDispatcher
		RequestDispatcher dispatcher = request.getRequestDispatcher("/simpleView.jsp");
		dispatcher.forward(request, response);
	}
}

웹 브라우저가 GET 방식으로 보내든 POST 방식으로 보내든 컨트롤러는 1단계에서 일단 processRequest() 메소드로 웹 브라우저의 요청을 전달한다.

 

2. 서블릿 클래스 실행을 위한 web.xml 파일에 servlet 설정 추가

<servlet>
	<!-- 등록 하고자 하는 서블릿 이름(닉네임 개념)  -->
	<servlet-name>SimpleController</servlet-name> 
	<!-- 구현 하고자 하는 서블릿 클래스  -->
	<servlet-class>mvc.controller.SimpleController</servlet-class>
</servlet>
	<!-- 등록한 서블릿을 매핑 시킴 -->
<servlet-mapping>
	<servlet-name>SimpleController</servlet-name>
	<!-- uri 패턴 지정  -->
	<url-pattern>/simple</url-pattern>
</servlet-mapping>

 

3. jsp 파일 작성

<%@ page language="java" contentType="text/html; charset=EUC-KR" %>
<html>
<head>
<title>뷰</title>
</head>
<body>
결과: <%= request.getAttribute("result") %>
</body>
</html>

 

4. SimpleController를 실행한 결과

url에 > /simple <
type 값 입력
type 값 입력2

 

🎈 위 예제에서 알 수 있듯 MVC 패턴을 사용하면 JSP에는 로직을 처리하는 코드가 포함 되어 있지 않기 때문에 만약 UI 형태가 변경 되어야 할 때 로직 코드를 전혀 손댈 필요 없이 UI 코드만 변경 하면 된다. 즉, JSP 코드만 변경 하면 되기 때문에 작업이 보다 간단해질 수 있다.

댓글