서블릿(2) - 순수 서블릿의 한계와 MVC패턴의 등장
순수 서블릿으로만 개발하면 어떤 일이?
간단한 회원 가입 (이름, 나이)만 입력하는 회원가입 페이지를 만든다고 가정해보자
@WebServlet(name = "memberFormServlet", urlPatterns = "/servlet/members/newform")
public class MemberFormServlet extends HttpServlet {
@Override
protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
response.setContentType("text/html");
response.setCharacterEncoding("utf-8");
PrintWriter w = response.getWriter();
w.write("<!DOCTYPE html>\n" +
"<html>\n" +
"<head>\n" +
" <meta charset=\"UTF-8\">\n" +
" <title>Title</title>\n" +
"</head>\n" +
"<body>\n" +
"<form action=\"/servlet/members/save\" method=\"post\">\n" +
" username: <input type=\"text\" name=\"username\" />\n" +
" age: <input type=\"text\" name=\"age\" />\n" +
" <button type=\"submit\">전송</button>\n" +
"</form>\n" +
"</body>\n" +
"</html>\n");
}
}
벌써부터 개발자가된것을 후회할것 같다…
html을 생성하는 것을 자바코드 안에서 하는것은 둘째 치더라도 servlet을 호출하는것, view를 보여주는 것, http 헤더를 생성하는 것 모두 포함하고 있기에 코드가 너무 지저분해진다.
템플릿 엔진을 쓰면 낫지않나?
자바 코드 안에서 보여줘야하는 Html문서를 작성하는 것보다 관계를 바꿔서 보여주어야 하는 파일을 만들어 그 안에서 필요한 부분만 java코드를 짜는게 나을 것같다는 생각이다.
이번에는 회원 저장하는 JSP파일이다.
// JSP - 회원 저장
<%@ page import="hello.servlet.domain.member.MemberRepository" %>
<%@ page import="hello.servlet.domain.member.Member" %>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%
MemberRepository memberRepository = MemberRepository.getInstance();
String username = request.getParameter("username");
int age = Integer.parseInt(request.getParameter("age"));
Member member = new Member(username, age);
memberRepository.save(member);
%>
<html>
<head>
<meta charset="UTF-8">
</head>
<body>
성공
<ul>
<li>id=<%=member.getId()%></li>
<li>username=<%=member.getUsername()%></li>
<li>age=<%=member.getAge()%></li>
</ul>
<a href="/index.html">메인</a>
</body>
</html>
html태그들을 java코드안에서 짜는 수고로움은 덜어졌지만 아직도 코드가 지저분하고 애초에 관심사의 분리가 안된것을 느낄수 있다.
위에서는 회원을 저장하는 로직을 수행하고 있고, 아래에서는 화면을 보여주기 위한 View를 수행하고 있다.
기존 방식의 한계
- JSP의 너무 많은 역할.
- 변경의 라이프 사이클.
그럼.. 어떻게 해결할 수 있을까??
MVC패턴의 등장
관심사의 분리를 하기위한 최적의 방법은 역할을 구분지어 분리 해놓는 것이다. Model, View, Controller로 각자의 역할을 구분지어서 관심사의 분리가 될 수 있는 패턴이다.
Model: 뷰에 출력할 데이터를 담아두는 역할
View: 모델의 데이터를 활용하여 화면을 그리는 역할
Controller: HTTP요청을 받고, 모델에 데이터를 담는 역할
위처럼 MVC패턴을 적용할때 Controller가 되는 서블릿 클래스내부에서
RequestDispatcher의 forward()
메소드를 활용하여 view파일로 이동할 수 있다.
RequestDispatcher dispatcher = request.getRequestDispatcher(viewPath);
dispatcher.forward(request, response);
cf) redirect -> 클라이언트가 인지,
forward -> 서버내부에서 호출이므로 클라이언트 인지 x
현재 방식의 모델은 request/response에 담긴 객체가 된다. 따라서 jsp파일에서는 request와 response에 담긴 객체에 접근가능하다.
MVC패턴을 통해 View 부분의 코드는 정말 깔끔해 졌다. 하지만 Controller부분은 아직 필요없는 코드나 중복되는 코드가 많다.
- forward 반복사용
- viewPath 반복
- request, response 불필요한 경우 존재
-> 공통적이고 중복되는 부분을 대신 처리해주는 로직이 있다면…?
다음 포스팅에서 계속. (스프링 MVC의 핵심)
Leave a comment