TaBo
개척하는 기록
TaBo
전체 방문자
오늘
어제
  • 기록들 (63)
    • Programming (35)
      • Java (19)
      • Servlet&Jsp (4)
      • Spring (4)
      • SpringBoot (1)
      • 기타 (2)
      • BOJ (5)
    • CS (16)
      • 자료구조 (4)
      • 알고리즘 (4)
      • 운영체제 (5)
      • 기본 용어 (3)
    • Project (4)
      • [Spring] 게시판 (4)
    • 나에 대한 기록 (8)

블로그 메뉴

  • Github

인기 글

태그

  • 운영체제
  • 알고리즘
  • OS
  • Spring 게시판
  • 스프링 게시판
  • c++
  • spring
  • 자바
  • 백준
  • java

최근 글

티스토리

hELLO · Designed By 정상우.
TaBo

개척하는 기록

[Servlet & Jsp] MVC 패턴, Model 1, Model 2
Programming/Servlet&Jsp

[Servlet & Jsp] MVC 패턴, Model 1, Model 2

2023. 1. 12. 16:45

※ 본문은 혼자 공부한 내용을 기록한 글입니다. 오개념이 있다면 댓글로 알려주세요!

 

[ 1 ] MVC 패턴

MVC(Model - View - Controller)는 UI, 데이터 및 논리제어를 구현하는 데 사용되는 소프트웨어 디자인 패턴이다.

[ Model ]
비즈니스 영역의 상태 정보 처리, 데이터 가공 등 데이터 및 비즈니스 로직을 관리한다.

[ View ]
사용자에게 실제적으로 보여지는 부분, 즉 UI를 의미한다.

[ Controller ]
Model과 View 사이를 이어주는 브릿지 역할을 하며 사용자의 입력 및 흐름을 제어한다. 즉, Model을 통해 알맞은 비즈니스 로직을 처리한 후 사용자에게 보여줄 적절한 View를 선택한다.


[ MVC 패턴을 사용하는 이유 ]
만약 MVC를 구분하지 않고, 모든 기능이 하나의 시스템에 들어가 있다면 유지보수 작업 시 사소한 코드의 변경이 다른 비즈니스 로직에 영향을 미칠 수 있다. MVC 패턴은 비즈니스 로직을 처리하는 Model과 결과 화면을 보여주는 View를 분리하고, 사용자의 입력 및 흐름 제어는 Controller만 수행하도록 하며 위 문제를 해결할 수 있다. 즉, MVC 패턴에서 각 컴포넌트는 자신이 맡은 역할만 수행하면 되기에 '유지보수의 편리성'이 높아진다.

이러한 MVC 패턴은 JSP 웹 어플리케이션에서 많이 활용되며, Controller와 View의 물리적 분리 여부에 따라 Model1과 Model2로 나누어진다.


[ 2 ] Model 1 : Controller와 View가 물리적으로 분리되지 않은 방식

Model 1 은 클라이언트의 요청이 바로 JSP에 전달되고, 요청을 받은 JSP는 service class, JavaBeans, DAO 등을 통해 로직을 처리한 후 결과를 클라이언트에 출력한다.
즉, service class, JavaBeans, DAO가 Model이 되고, 단일 JSP가 Controller와 View 역할을 모두 하는 구조이다.

Model 1 으로 설계 시 JSP의 상단에는 코드 블록 <% %>을 활용하여 Controller를 구현하고, 하단에는 HTML로 View를 구현하며 스파게티 코드 문제를 최소화할 수 있다. 하지만, Controller와 View를 물리적으로 분리하지 않았기에 역할 구분이 명확하지 않고, 디버깅과 유지보수가 어렵다는 단점이 있다.


[ 3 ] Model 2 : Controller와 View가 물리적으로 분리된 방식

그림으로도 알 수 있듯이 MVC 패턴과 Model 2의 구조는 완벽히 일치한다.
Model 2 는 Model 1 과 달리 클라이언트의 요청을 Servlet(Controller)이 받고, Service, DAO, JavaBeans(Model)을 통해 로직을 처리한 후 그 결과 페이지는 JSP(View)로 전달한다.

Model 2 에서는 Model을 통해 얻은 요청 처리 결과를 Servlet에서 JSP로 넘겨주기 위해 '포워딩'을 활용한다. View에 해당하는 JSP는 WEB-INF 폴더에 저장하기에 클라이언트는 url로 JSP에 직접 접근할 수 없으며 Controller에 해당하는 Servlet에서 포워딩을 통해서만 접근할 수 있다.

만약 Servlet을 거치지 않고 바로 JSP를 호출한다면 아무런 로직이 처리되지 않은 빈 껍데기 View가 response될 것이다. 즉, Servlet에 구현해 놓은 특정 기능을 수행하지 못한 채 View가 호출되므로 이를 방지하기 위해 JSP를 WEB-INF 폴더에 저장하여 클라이언트가 직접 접근하지 못하도록 한다. WEB-INF 폴더는 브라우저에서 직접 접근할 수 없으며, 오직 서버에서만 접근 가능하다. 그러므로 브라우저가 WEB-INF 폴더에 있는 파일에 접근하면 서버에서 제공하지 않는 page에 접근할 때 나타나는 404에러가 발생한다.


[ Model 2 의 핵심 ]

  1. 사용자의 요청이나 웹 어플리케이션의 흐름 제어는 Controller인 Servlet이 한다.
  2. 비즈니스 로직을 처리하는 Model(Service, DAO, JavaBeans)과 UI인 View(JSP)를 철저히 분리한다.
  3. 로직 코드와 뷰 코드를 분리하여 유지보수가 쉽고 분업에 용이하다.


[ 예제 ]
Servlet은 클라이언트의 요청에 따라 View에서 출력할 문자열을 생성하여 JSP에 전달(포워딩)하고, JSP는 전달받은 문자열을 화면에 출력한다.

Controller에 해당하는 Servlet

@WebServlet("/Example")
public class Example extends HttpServlet {
       
	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		
		String type = request.getParameter("type");
		
		Object result = null;
		
		if(type == null) {
			result = "first request!";
		}
		else if(type.equals("greeting")) {
			result = "Hello!";
		}
		else if(type.equals("Date")) {
			result = new java.util.Date();;
		}
		
		request.setAttribute("result", result);
		
		RequestDispatcher dispatcher = request.getRequestDispatcher("/WEB-INF/example.jsp");
		dispatcher.forward(request, response);
		
	}

}


① request.setAttribute(); 를 통해 result를 request에 담는다.
② RequestDispatcher 객체를 통해 JSP를 포워딩한다.


View에 해당하는 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>
	<form method="get">
		<select name="type">
			<option ${(param.type == "greeting")?"selected":""} value="greeting">인사</option>
			<option ${(param.type == "Date")?"selected":""} value="Date">날짜</option>			
		</select>
		<input type="submit" value="요청" />
		<div>
		${result}
		</div>
	</form>
</body>
</html>


① 첫 요청 시 type==null 이기에 result에는 "first request!"가 담겨 JSP로 전달된다.
② 두 번째 요청부터는 select 태그를 통해 request type을 클라이언트가 정할 수 있도록 한다.
③-1 '인사'를 선택하여 submit하면 Servlet으로 전달되어 result에 "Hello!"가 담겨 다시 JSP로 전달된다.
③-2 '날짜'를 선택하여 submit하면 Servlet으로 전달되어 result에 Date객체가 담겨 다시 JSP로 전달된다.

(추가) <option>태그 내에 ${(param.type == "") ? "selected" : ""} EL을 통해 선택된 value에 따라 selected가 활성화되도록 구현했다.

더보기

[참고자료]

https://scshim.tistory.com/272

 

[JSP] Model 1 아키텍처와 Model 2 아키텍처,  MVC 패턴

학습 목표 · Model 1 아키텍처 · Model 2 아키텍처 · MVC 패턴 - MVC 패턴과 모델 2 구조의 매핑 - MVC의 컨트롤러: 서블릿 - MVC의 뷰: JSP - MVC의 모델 - 커맨드(Command) 패턴 기반의 코드 - 설정 파일에 커맨

scshim.tistory.com

https://junhyunny.github.io/information/design-pattern/mvc-pattern/

 

MVC(Model, View, Controller) Pattern

<br /><br />

junhyunny.github.io

https://developer.mozilla.org/ko/docs/Glossary/MVC

 

MVC - MDN Web Docs 용어 사전: 웹 용어 정의 | MDN

MVC (모델-뷰-컨트롤러) 는 사용자 인터페이스, 데이터 및 논리 제어를 구현하는데 널리 사용되는 소프트웨어 디자인 패턴입니다. 소프트웨어의 비즈니스 로직과 화면을 구분하는데 중점을 두고

developer.mozilla.org

저작자표시 비영리 변경금지 (새창열림)

'Programming > Servlet&Jsp' 카테고리의 다른 글

[Servlet & Jsp] Jsp 구조, 코드블록  (1) 2023.01.09
[Servlet & Jsp] Servlet 생명주기, service, doGet, doPost  (1) 2023.01.04
[Servlet & Jsp] Application, Session, Cookie  (1) 2022.11.26
    'Programming/Servlet&Jsp' 카테고리의 다른 글
    • [Servlet & Jsp] Jsp 구조, 코드블록
    • [Servlet & Jsp] Servlet 생명주기, service, doGet, doPost
    • [Servlet & Jsp] Application, Session, Cookie
    TaBo
    TaBo

    티스토리툴바