웹 개발을 하다보면 MVC 패턴을 쉽게 접한다. 특히 스프링으로 개발을 하면 스프링 MVC 모델도 존재한다. 하지만 이전 JSP를 사용할 때부터 어떻게 스프링 MVC 패턴까지 하나씩 살펴보자.
모델 1은 클라이언트의 요청을 하나의 JSP 페이지에서 뷰와 로직을 모두 처리한다.
위 구조를 보면 알 수 있듯이 모델 1은 크게 JSP 페이지 와 자바빈 혹은 서비스 클래스 로 이루어져있다. 먼저 JSP 페이지에서는 로직을 처리하는 코드와 출력을 위한 코드가 함께 있다는 것을 예상할 수 있다. 예를 들어 아래의 코드를 보면 유저의 리스트를 보여주는 로직과 출력을 담당하는 JSP 페이지를 볼 수 있다. html 페이지에 자바 코드를 직접 삽입하는 형식이다.
<table>
<tr align="center">
<td id=title>아이디</td>
<td id=title>비밀번호</td>
<td id=title>이름</td>
<td id=title>성별</td>
<td id=title>생년월일</td>
<td id=title>이메일</td>
<td id=title>전화</td>
<td id=title>주소</td>
<td id=title>가입일</td>
</tr>
<%
for( MemberBean member : memberList){
%>
<tr>
<td><%=member.getId() %></td>
<td><%=member.getPassword() %></td>
<td><%=member.getName() %></td>
<td><%=member.getGender() %></td>
<td><%=member.getBirth() %></td>
<td><%=member.getMail() %></td>
<td><%=member.getPhone() %></td>
<td><%=member.getAddress() %></td>
<td><%=member.getReg() %></td>
</tr>
<%} %>
</table>
위 처럼 모델 1에서는 브라우저(클라이언트)에서 요청이 오면 JSP 페이지는 자신이 직접 자바빈이나 서비스 클래스를 사용하여 작업을 처리하고, 그 결과를 클라이언트에게 출력한다. 이 모델은 과거에 많이 사용했으며, 지금도 간단한 페이지를 구성할 때 사용할 수 있다.
모델 2는 MVC 패턴을 적용한 모델이다. 아래 그림을 보자.
MVC 패턴을 적용한 만큼 JSP 모델 2는 크게 세 가지로 나뉜다.
그러면 여기서 잠깐 MVC에 대해 살펴보자.
MVC 패턴은 Model View Controller의 약자로 에플리케이션을 세가지의 역할로 구분한 개발 방법론이다. 각각의 역할은 다음과 같다.
모델 2는 MVC 패턴과 같이 브라우저에서 요청이 들어오면 서블릿(Controller)이 전체 흐름을 담당하며, 해당 요청을 처리할 자바빈 혹은 서비스 클래스(Model)를 선택한다. 로직을 모두 처리하면 이를 클라이언트에 출력해주기 위해 JSP 페이지를 응답한다.
스프링 MVC 프레임워크는 구조는 위에서 살펴본 JSP 모델 2와 Front Controller 패턴을 사용한 모습이라고 볼 수 있다. 스프링 MVC를 이용함으로써 웹 어플리케이션의 Model, View, Controller 사이의 의존 관계를 DI 컨테이너에서 관리하면서 유연한 웹 어플리케이션을 구축할 수 있다.
프론트 컨트롤 패턴은 모든 리소스 요청을 처리해주는 하나의 컨트롤러를 두는 패턴이다. 이는 주로 웹 애플리케이션에서 사용하는 MVC 패턴과 같이 사용된다. 이를 사용하는 장점은 다음과 같다.
구성 요소 | 설명 |
---|---|
DispatcherServlet | 클라이언트의 요청을 전달받아 요청에 맞는 컨트롤러가 리턴한 결과값을 View에 전달하여 알맞은 응답을 생성 |
HandlerMapping | 클라이언트의 요청 URL을 어떤 Controller가 처리할지 결정 |
Controller | 클라이언트의 요청을 처리한 뒤, 결과를 DispatcherServlet에게 리턴 |
ModelAndView | Controller가 처리한 결과 정보 및 View 선택에 필요한 정보를 담음 |
ViewResolver | Controller의 처리 결과를 생성할 View를 결정 |
View | Controller의 처리 결과 화면을 생성 |