MVC 패턴
- 애플리케이션을 Model-View-Controller 로 구분하여 설계하는 디자인 패턴
- 역할에 맞게 모듈을 분리함으로서 유지보수 및 확장이 용이하다.
MVC 패턴 사용 이전과 이후의 비교
MVC 패턴 사용 이전
@WebServlet(name = "memberSaveServlet", urlPatterns = "/servlet/members/save")
public class MemberSaveServlet extends HttpServlet {
private MemberRepository memberRepository = MemberRepository.getInstance();
@Override
protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
String username = req.getParameter("username");
int age = Integer.parseInt(req.getParameter("age"));
Member member = new Member(username, age);
memberRepository.save(member);
resp.setContentType("text/html");
resp.setCharacterEncoding("utf-8");
PrintWriter writer = resp.getWriter();
writer.write("<html>\n" +
"<head>\n" +
" <meta charset=\"UTF-8\">\n" +
"</head>\n" +
"<body>\n" +
"성공\n" +
"<ul>\n" +
" <li>id="+member.getId()+"</li>\n" +
" <li>username="+member.getUsername()+"</li>\n" +
" <li>age="+member.getAge()+"</li>\n" +
"</ul>\n" +
"<a href=\"/index.html\">메인</a>\n" +
"</body>\n" +
"</html>");
}
}
- 컨트롤러에서 조회한 데이터를 통해 View 를 만드를 로직까지 포함하고 있다. 하나의 모듈에서 여러 역할을 수행하게되면 그만큼 코드가 많아지고 코드를 변경해야할 때 변경 부분을 찾기가 힘들어지는 등 유지보수 및 관리가 힘들어진다.
MVC 패턴 사용 이후
/*
비즈니스 로직을 실행하는 컨트롤러의 역할을 담당하는 서블릿
*/
@WebServlet(name = "mvcMemberSaveServlet", urlPatterns = "/servlet-mvc/members/save")
public class MvcMemberSaveServlet extends HttpServlet {
private MemberRepository memberRepository = MemberRepository.getInstance();
@Override
protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
String username = req.getParameter("username");
int age = Integer.parseInt(req.getParameter("age"));
Member member = new Member(username, age);
memberRepository.save(member);
// Model에 데이터를 보관
req.setAttribute("member", member);
String viewPath = "/WEB-INF/view/save-result.jsp";
RequestDispatcher dispatcher = req.getRequestDispatcher(viewPath);
dispatcher.forward(req, resp);
}
}
/*
View 의 역할을 담당하는 JSP
*/
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>Title</title>
</head>
<body>
성공
<ul>
<li>id=${member.id}</li>
<li>username=${member.username}</li>
<li>age=${member.age}</li>
</ul>
<a href="/index.html">메인</a>
</body>
</html>
- MVC 패턴을 통해 컨트롤러와 View 의 로직을 분리하면 코드 변경시 변경 사항을 담당하는 모듈의 코드만 변경하면 된다. 즉, 변경 포인트가 명확해진다.