Servlet의 MVC 패턴 적용

최준호·2021년 7월 6일
0

Spring

목록 보기
13/47

MVC 패턴이 등장한 이유

하나의 서블릿이나 JSP만으로 비지니스 로직과 뷰 렌더링까지 모두 처리하게 되면 유지보수가 어려워진다. 또한 뷰와 서비스 로직은 변경 사이클이 다르다. 예를 들어 화면이 변경됨에 따라 기능이 변경되지 않을 수 있고 기능이 변경됨에 따라 화면이 변경되지 않을 경우가 있기 때문이다.

MVC란

  • Model : view에 출력할 데이터를 담아둔다. model 덕분에 view는 비지니스 로직이나 데이터 접근에 대해 몰라도 되고 화면 렌더링에 집중할 수 있다.
  • View : 모델에 담겨있는 데이터를 사용하여 화면을 렌더링하는 일에 집중한다.
  • Controller : HTTP 요청을 받아 파라미터를 검증하고 비지니스 로직을 실행한다. 그리고 View에 전달할 결과 데이터를 model에 담는다.

Servlet과 jsp를 사용하여 mvc 패턴1을 적용

우리가 지금까지 공부한 내용을 활용하여 MVC 패턴을 구현해보려고 한다.

  • Model : HttpServletReqeust
  • View : jsp
  • Controller : Servlet

다음과 같이 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로 접근시

  1. member 리스트를 조회하여 우리가 model로 정한 request 객체에 담고
  2. 연결된 view인 jsp의 경로를 viewPath로 정의해준다.
  3. dispatcher 객체를 생성하고
  4. 해당 객체로 foward해준다.
  • 여기서 forword는 redirect와 다르게 url을 변경하여 연결되어 client에서 재요청이 일어나는 것이 아닌 server 내부에서 해당 자원을 찾아주는 행동이므로 client에서는 확인할 수 없은 행동이다.
<%@ 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는 다음과 같이 선언해주면 해당 내용을 확인할 수 있다. 여기서 우리가 확인할 수 있는 것들을 정리해보면

  1. controller 역할을 하는 servlet에서 서비스 로직까지 한번에 처리한다.
  2. controller에서는 dispatcher를 사용하여 view 역할을 할 자원을 찾아주고 해당 자원을 view로써 연결해주며 model에 담긴 값들을 넘겨준다.
  3. viewPath값을 controller에서 직접 지정해야하며 dispatcher를 생성하여 연결해주는 코드를 계속해서 반복하여 작성하여야 한다.
  • 여기서 jsp는 webapp/WEB-INF 디렉토리를 생성하여 선언해주어야하는데 spring 자체에서 WEB-INF 하위의 자원은 url로 직접 연결할 수 없도록 처리해주기 때문이다.

MVC 패턴의 모델1 모델2

  • model 1model1은 controller에서 비지니스 로직을 모두 처리하는 모델이다.
  • model 2model2는 controller를 view와의 연결과 model을 관리하는 컨트롤러 로직과 비지니스 로직을 처리하는 service 계층으로 나누어 사용하는 모델이다.

MVC 패턴의 한계

  1. forward의 중복
  2. forward를 반복해서 호출해 사용해야한다.
  3. viewPath의 중복
  4. viewPath라는 jsp나 view 자원의 위치 값을 반복해서 선언해줘야한다.
  5. 공통 처리가 어렵다.
  6. aop와 같이 공통으로 처리하는 부분이 없기때문에 처리가 어렵다.

출처 https://www.inflearn.com/course/%EC%8A%A4%ED%94%84%EB%A7%81-%ED%95%B5%EC%8B%AC-%EC%9B%90%EB%A6%AC-%EA%B8%B0%EB%B3%B8%ED%8E%B8

profile
코딩을 깔끔하게 하고 싶어하는 초보 개발자 (편하게 글을 쓰기위해 반말체를 사용하고 있습니다! 양해 부탁드려요!) 현재 KakaoVX 근무중입니다!

0개의 댓글