동적인 웹 페이지를 생성하기 위해 사용되는 도구
이며 템플릿을 기반으로 정적인 부분과 동적인 데이터를 결합하여 HTML, XML 등의 문서를 생성하는 역할을 수행함
(우리가 흔히 말하는 UI를 만들며 SSR에 사용됨)
Servlet
이나 JSP
만으로 비즈니스 로직과 View Redering
까지 모두 처리하면 너무 많은 역할을 하게 되고 책임이 너무 많기 때문에 유지보수가 굉장히 어려워져서 고안된 패턴
Web Appliction
은 일반적으로 MVC(Model View Controller)
패턴을 사용함
@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);
}
}
HttpServletRequest
, HttpServletResponse
객체를 생성한다.doGet()
혹은doPost()
등의 메서드를 호출한다.HttpServletResponse
객체에 응답을 담아 Client(브라우저)에 반환한다.HttpServletRequest
, HttpServletResponse
객체를 소멸한다.Servlet
코드에서 HTML
을 만드는 부분인 View
가 분리되었음
<%@ 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, JSP 방식의 문제점
Servlet
만을 사용한 경우 View를 위한 코드와 비지니스 로직을 처리하는 코드가Servlet
에 모두 존재하여 유지보수가 어려워진다.JSP
를 사용하여View
를 분리하였지만 비지니스 로직의 일부가JSP
파일안에 존재한다. 여전히 책임이 많아 유지보수가 어렵다.
하나의 Servlet이나 JSP로 처리하던 것들을 Model, View, Controller 영역으로 나눈것
MVC패턴의 핵심
- View가 분리된 이유의 핵심은 변경이다.
- 기획이 변하지 않는 이상 비지니스 로직과 View의 수정 원인은 별개로 발생한다.
- 화면 구성에 수정이 발생하면 View만 변경
- 요구사항에 수정이 발생하는 경우 비지니스 로직 변경
- 즉, 서로 연관이 없는 코드끼리 함께 존재할 필요가 없다. 완전히 분리하자