본문 바로가기

Spring

[Spring] MVC pattern & Front controller

반응형

Servlet과 JSP의 한계 

Servlet 사용 시 아래와 같이 뷰 화면을 위한 HTML을 만드는 작업이 자바 코드에 섞여 복잡했다.

 

PrintWriter w = response.getWriter(); 
w.write("<html>");
w.write("<head>");
w.write(" <meta charset=\"UTF-8\">"); 
...

 

JSP를 사용하면 뷰를 생성하는 HTML 작업은 깔끔해지며, 중간중간 동적으로 변경이 필요한 부분에만 자바 코드를 적용했다.

하지만 복잡한 화면의 경우 비즈니스 로직이 길어져 유지보수가 어렵다.

 

<table>
    <thead>
    <th>id</th>
    <th>username</th>
    <th>age</th>
    </thead>
<tbody> 
<%
    for (Member member : members) {
        out.write("<tr>");
        out.write("	<td>" + member.getId() + "</td>");
        out.write("	<td>" + member.getUsername() + "</td>"); 
        out.write("	<td>" + member.getAge() + "</td>");
        out.write("</tr>");
    } 
%>
</tbody>
</table>

 

따라서 비즈니스 로직은 Servlet 처럼 다른곳에서 처리하고, JSP는 목적에 맞게 화면을 그리는 일에 집중하는 MVC 패턴이 등장했다.

 

MVC 패턴

Model View Controller 패턴으로, 위의 Servlet과 JSP로 처리하던 것을 Controller와 View라는 영역으로 역할을 나눈 것을 말한다.

 

Model

  • 뷰에 출력할 데이터를 담는다
  • 뷰가 필요한 데이터를 모두 모델에 담아 전달하기 때문에 뷰는 비즈니스 로직이나 데이터 접근을 몰라도 된다

View

  • 모델에 담겨있는 데이터를 사용해 화면을 그린다.

Controller

  • HTTP 요청을 받아서 파라미터를 검증한다
  • 비즈니스 로직을 실행한다
  • 뷰에 전달할 결과 데이터를 조회해서 모델에 담는다

 

컨트롤러의 역할 분담을 위해 일반적으로 비즈니스 로직은 서비스(Service)라는 계층을 별도로 만들어서 처리한다.
컨트롤러는 비즈니스 로직이 있는 서비스를 호출하는 역할을 담당한다.

 

 

 

MVC 컨트롤러의 단점

포워드 중복

View로 이동하는 코드가 항상 중복 호출된다.

 

String viewPath = "/WEB-INF/views/new-form.jsp";
RequestDispatcher dispatcher = request.getRequestDispatcher(viewPath); 
dispatcher.forward(request, response);

 

ViewPath 중복

위의 코드에서 prefix 인 /WEB-INF/view/ 부분과 suffix 인 .jsp 가 중복된다.

 

사용하지 않는 request, response

아래의 파라미터를 사용하지 않을 때 제외할 수 없다.

 

HttpServletRequest request, HttpServletResponse response

 

공통처리가 어려움

기능이 복잡해질 수록 컨트롤러에서 공통으로 처리해야 하는 부분이 점점 늘어날 것이다.

단순히 공통 기능을 메서드로 추출한다고 해도, 결과적으로 해당 메서드를 항상 호출해야하니 중복이다.

 

위와 같은 단점이 있어 Front Controller를 도입해 위 문제를 해결할 수 있다.
Spring MVC의 핵심도 Front Controller에 있다.

 

 

reference

- https://inflearn.com/course/%EC%8A%A4%ED%94%84%EB%A7%81-mvc-1/dashboard

반응형