서블릿(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부분은 아직 필요없는 코드나 중복되는 코드가 많다.

  1. forward 반복사용
  2. viewPath 반복
  3. request, response 불필요한 경우 존재

-> 공통적이고 중복되는 부분을 대신 처리해주는 로직이 있다면…?

다음 포스팅에서 계속. (스프링 MVC의 핵심)

Categories:

Updated:

Leave a comment