※ 본문은 혼자 공부한 내용을 기록한 글입니다. 오개념이 있다면 댓글로 알려주세요!
[ 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 의 핵심 ]
- 사용자의 요청이나 웹 어플리케이션의 흐름 제어는 Controller인 Servlet이 한다.
- 비즈니스 로직을 처리하는 Model(Service, DAO, JavaBeans)과 UI인 View(JSP)를 철저히 분리한다.
- 로직 코드와 뷰 코드를 분리하여 유지보수가 쉽고 분업에 용이하다.
[ 예제 ]
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 |