하나의 서블릿이나 JSP만으로 비지니스 로직과 뷰 렌더링까지 모두 처리하게 되면 유지보수가 어려워진다. 또한 뷰와 서비스 로직은 변경 사이클이 다르다. 예를 들어 화면이 변경됨에 따라 기능이 변경되지 않을 수 있고 기능이 변경됨에 따라 화면이 변경되지 않을 경우가 있기 때문이다.
우리가 지금까지 공부한 내용을 활용하여 MVC 패턴을 구현해보려고 한다.
다음과 같이 mvc를 나누고 실제 코드로 확인해보자.
@WebServlet(name = "mvcMemberListServlet", urlPatterns = "/servlet-mvc/members")
public class MvcMemberListServlet extends HttpServlet {
private MemberRepository memberRepository = MemberRepository.getInstance();
@Override
protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
System.out.println("MvcMemberListServlet.service");
List<Member> members = memberRepository.findAll();
request.setAttribute("members", members);
String viewPath = "/WEB-INF/views/members.jsp";
RequestDispatcher dispatcher = request.getRequestDispatcher(viewPath);
dispatcher.forward(request, response);
}
}
다음과 같이 member 리스트를 조회하는 페이지로 이동하기 위한 Servlet이 있다고 할때 우리는 url을 "/servlet-mvc/members"로 요청하면 된다. 해당 url로 접근시
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
<html>
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<a href="/index.html">메인</a>
<table>
<thead>
<th>id</th>
<th>username</th>
<th>age</th>
</thead>
<tbody>
<c:forEach var="item" items="${members}">
<tr> <td>${item.id}</td>
<td>${item.username}</td>
<td>${item.age}</td>
</tr>
</c:forEach>
</tbody>
</table>
</body>
</html>
jsp는 다음과 같이 선언해주면 해당 내용을 확인할 수 있다. 여기서 우리가 확인할 수 있는 것들을 정리해보면