MVC 패턴 개요
MVC 패턴은 Servlet이나 JSP 만으로 비즈니스 로직과 View Rendering 까지 모두 처리하면 너무 많은 역할을 하게 되고 유지보수가 굉장히 어려워져서(책임이 너무 많음) 고안된 패턴이다.
Web Application은 일반적으로 MVC(Model View Controller) 패턴을 사용한다.
MVC패턴을 적용하지 않은 Servlet 예시
@WebServlet("/hello-world")
public class HelloWorldServlet extends HttpServlet {
// User 저장소
private UserRepository repository = new UserRepository();
public HelloWorldServlet() {
super();
}
protected void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
response.setContentType("text/html;charset=utf-8");
PrintWriter out = response.getWriter();
try {
// 비지니스 로직을 처리하는 코드
// 파라미터 조회
String userIdParam = request.getParameter("userId");
Long userId = null;
if (userIdParam != null) {
userId = Long.parseLong(userIdParam);
}
// 회원 조회
String userInfo = repository.findById(userId);
// 화면을 그리는 코드 START
out.println("<h1>Hello World!</h1>");
out.println("<div>조회한 회원의 정보: " + userInfo + "</div>");
// 화면을 그리는 코드 END
} catch (NumberFormatException e) {
// parsing 에러가 발생한 경우
out.println("<div>Invalid user ID format</div>");
} finally {
out.close();
}
}
protected void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
doGet(request, response);
}
}
위 Servlet 코드의 문제점
화면을 그리는 View 영역과 비즈니스 로직이 Servlet 하나에 모두 섞여있다. 책임을 너무 많이 가지고 있다.
그럼 JSP를 사용해 View 영역을 분리해보자.
JSP 예시
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title></title>
</head>
<body>
<!-- HTML 코드... -->
<!-- <%...%> 영역에는 Java 코드를 사용할 수 있다. -->
<%
// 게시글 저장소 싱글톤으로 인스턴스 생성
BoardRepository boardRepository = BoardRepository.getInstance();
// 게시글 제목, 내용
String title = request.getParameter("title");
String content = request.getParameter("content");
// 게시글 객체 생성
Board board = new Baord(title, content);
// 게시글 객체 저장
repository.save(board);
%>
<div>
ID : <input type ="text" name = "id" value="<%=id %>">
</div>
<!-- JSP 코드... -->
<!-- HTML 코드... -->
<jsp:forward page="<%=url %>" />
</body>
</html>
Servlet 코드에서 HTML을 만드는 부분인 View가 분리되었다.
Servlet, JSP 결합 방식의 문제점
JSP를 사용하여 Servlet에서 View를 분리하였지만 비즈니스 로직의 일부가 JSP 파일안에 존재한다. 여전히 책임이 많아 유지보수가 어렵다.
MVC 패턴
MVC 패턴은 하나의 Servlet이나 JSP로 처리하던 것들을 Model, View, Controller 영역으로 나눈 것이다.
핵심 내용
View가 분리된 이유의 핵심은 변경이다.
기획이 변하지 않는 이상 비지니스 로직과 View의 수정 원인은 별개로 발생한다.
- 화면 구성에 수정이 발생하면 View만 변경
- 요구사항에 수정이 발생하는 경우 비즈니스 로직 변경
즉, 서로 연관이 없는 코드끼리 함께 존재할 필요가 없기에 완전히 분리하자.
MVC 패턴 구조
Controller
예시 코드에서 Servlet에 해당하는 영역이다.
Controller의 동작 과정은 다음과 같다.
- HTTP Request를 전달받아 파라미터를 검증한다.
- 비즈니스 로직을 실행한다.
- 비즈니스 로직에서 역할을 분산하기 위해 Service와 Repository Layer를 추가해 역할을 나누고 동작을 위임한다.
- View에 전달할 결과를 조회하여 Model 객체에 임시로 저장한다.
Model
View에 출력할 Data를 저장하는 객체이다.
Model 덕분에 View는 비즈니스 로직이나 Data 접근을 몰라도 되고 View Rendering에만 집중하면 된다.
View
예시 코드에서 JSP에 해당하는 영역이다.
Model 객체에 담겨져 있는 Data를 사용하여 화면을 Rendering 한다.
'스프링 프레임워크' 카테고리의 다른 글
HttpMessageConverter (0) | 2024.11.27 |
---|---|
Spring의 MVC의 구조 (0) | 2024.11.27 |
프론트 컨트롤러 패턴와 어댑터 패턴 (0) | 2024.11.27 |
Template Engine이란 (0) | 2024.11.27 |
스프링 프레임워크와 스프링 부트 (0) | 2024.11.27 |