-
spring[13] Servlet의 MVC 패턴 적용개인 공부/spring 2021. 6. 9. 22:08728x90반응형
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로 접근시
- member 리스트를 조회하여 우리가 model로 정한 request 객체에 담고
- 연결된 view인 jsp의 경로를 viewPath로 정의해준다.
- dispatcher 객체를 생성하고
- 해당 객체로 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는 다음과 같이 선언해주면 해당 내용을 확인할 수 있다. 여기서 우리가 확인할 수 있는 것들을 정리해보면
- controller 역할을 하는 servlet에서 서비스 로직까지 한번에 처리한다.
- controller에서는 dispatcher를 사용하여 view 역할을 할 자원을 찾아주고 해당 자원을 view로써 연결해주며 model에 담긴 값들을 넘겨준다.
- viewPath값을 controller에서 직접 지정해야하며 dispatcher를 생성하여 연결해주는 코드를 계속해서 반복하여 작성하여야 한다.
- 여기서 jsp는 webapp/WEB-INF 디렉토리를 생성하여 선언해주어야하는데 spring 자체에서 WEB-INF 하위의 자원은 url로 직접 연결할 수 없도록 처리해주기 때문이다.
MVC 패턴의 모델1 모델2
- model 1model1은 controller에서 비지니스 로직을 모두 처리하는 모델이다.
- model 2model2는 controller를 view와의 연결과 model을 관리하는 컨트롤러 로직과 비지니스 로직을 처리하는 service 계층으로 나누어 사용하는 모델이다.
MVC 패턴의 한계
- forward의 중복
- forward를 반복해서 호출해 사용해야한다.
- viewPath의 중복
- viewPath라는 jsp나 view 자원의 위치 값을 반복해서 선언해줘야한다.
- 공통 처리가 어렵다.
- aop와 같이 공통으로 처리하는 부분이 없기때문에 처리가 어렵다.
728x90반응형'개인 공부 > spring' 카테고리의 다른 글
spring[15] 직접 만든 MVC Framework와 Spring MVC Framework 비교 (0) 2021.06.13 spring[14] Servlet의 MVC Framework 만들기 (0) 2021.06.12 spring[12] Servlet, jsp를 사용하여 웹 페이지 구현 (0) 2021.06.07 spring[11] Servlet - response(응답) (0) 2021.06.06 spring[10] Servlet - request(요청) (0) 2021.06.06