HTTP request에 데이터 저장은 쿼리 파라미터, HTML Form, HTTP API 가 있다.
HTTP response 형식은 HTML 과 JSON이 있다.
그런데 서블릿은 자바코드에서 HTML을 작성해야 하기에 매우 불편하다. 편리한 동적 HTML 작성법은 없을까?
<%@ page import="hello.servlet.domain.member.MemberRepository" %>
<%@ page import="hello.servlet.domain.member.Member" %>
<%@ page import="java.util.List" %>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%
MemberRepository memberRepository = MemberRepository.getInstance();
List<Member> members = memberRepository.findAll();
%>
<html>
<head>
<title>Title</title>
</head>
<body>
<a href="/index.html">메인</a>
<table>
<thead>
<th>id</th>
<th>username</th>
<th>age</th>
</thead>
<tbody>
<%
for (Member member : members) {
out.write(" <tr>"); //request, response, out은 자동 사용 가능.
out.write(" <td>" + member.getId() + "</td>");
out.write(" <td>" + member.getUsername() + "</td>");
out.write(" <td>" + member.getAge() + "</td>");
out.write(" </tr>");
}
%>
</tbody>
</table>
</body>
</html>
<% %> 안에는 자바 코드가 들어가는 동적 HTML을 생성할 수 있다.
서블릿은 자바코드로 구성되어 비즈니스 로직 처리에.
JSP는 HTML을 베이스로 구성되어 응답 HTML 생성에 유리하다.
이를 조합하여 비즈니스 로직 - 서블릿. 응답 뷰 생성 - JSP 가 담당하면 어떨까
그렇게 탄생한 것이 MVC 패턴이다.
1. 클라이언트가 url로 서블릿을 호출한다.
2. 서블릿은 서비스/리포지토리 클래스로 DB 접근과 비즈니스 로직을 수행하고 결과를 모델에 담아 뷰(JSP)로 forward한다.
3. 뷰는 모델을 참조하여 동적 HTML을 생성해 클라이언트 브라우저에 출력한다.
서블릿은 컨트롤러로 비즈니스 로직 호출만, JSP는 뷰로 결과 화면 출력만 담당한다.
비즈니스 로직을 컨트롤러가 수행해도 되지만, 기능 분화를 위해 서비스로 별도로 만들고 컨트롤러는 호출만 수행한다.
컨트롤러 결과를 Model에 담아 전송하기에 View는 컨트롤러에 의존하지 않고 Model 만 참고하여 화면을 출력할 수 있다.
MVC 패턴으로 컨트롤러의 역할과 뷰를 렌더링하는 역할을 명확하게 나눌 수 있었다.
하지만 컨트롤러에서 상당히 많은 중복이 발생한다.
가입 폼으로 이동하는 FormController
회원 저장 수행하는 SaveController
전체 회원 조회하는 ListController
Form, Save, List 컨트롤러에서 각각의 뷰로 포워드 하기 위한 코드가 중복된다.
RequestDispatcher dispatcher = request.getRequestDispathcer(viewPath);
dispatcher.forward(request, response);
컨트롤러는 응답에 사용하는 HTTPResponse 객체를 아예 사용하지 않는다.
각 url에 따라 Form, Save, List 컨트롤러로 가게되므로 컨트롤러의 입구가 세개이다.
따라서 로그를 찍는다거나 하는 공통처리를 하려면 세 컨트롤러 클래스에 모두 추가해줘야한다.
MVC 패턴은 각 컨트롤러로 가는 입구가 다양하여 공통 처리가 어려운 한계가 있다. 공통 처리를 위한 추가 사전 컨트롤러의 도입이 필요하다.
본 글은 김영한님의 "스프링 MVC 1편 - 백엔드 웹 개발 핵심 기술" 강의내용 및 이해한 내용을 정리한 것입니다.
https://www.inflearn.com/course/%EC%8A%A4%ED%94%84%EB%A7%81-mvc-1/dashboard