MVC (Model- View - Controller) 패턴의 개념
모델 - 뷰 - 컨트롤러(Model - View - Controller, MVC)는 소프트웨어공학에서 사용되는 아키텍쳐 패턴으로 MVC 패턴의 주 목적은 Business logic과 Presentation logic을 분리하기 위함이다.
- MVC패턴을 사용하면, 사용자 인터페이스로부터 비지니스 로직을 분리하여 애플리케이션의 시각적 요소나 그 이면에서 실행되는 비지니스 로직을 서로 영향 없이 쉽게 고칠 수 있는 애플리케이션을 만들 수 있음
모델 (Model) 컴포넌트 | - 데이터 저장소(ex: 데이터베이스 등)와 연동하여 사용자가 입력한 데이터나 사용자에게 출력할 데이터를 다루는 일은 함 - 여러 개의 데이터 변경 작업(추가, 변경, 삭제)을 하나의 작업으로 묶는 트랜잭션을 다루는 일도 함 - DAO클래스 Service 클래스에 해당 |
뷰(View) 컴포넌트 | - 모델이 처리한 데이터나 그 작업 결과를 가지고 사용자에게 출력할 화면을 만드는 일을 함 - 생성된 화면은 웹 브라우저가 출력하고, 뷰 컴포넌트는 HTML/CSS/JS를 사용하여 웹 브라우저가 출력할 UI를 만듦 - HTML과 JSP를 사용하여 작성할 수 있음 |
컨트롤러(Controller) 컴포넌트 | - 클라이언트의 요청을 받았을 때 그 요청에 대해 실제 업무를 수행하는 모델 컴포넌트를 호출하는 일을 함 - 클라이언트가 보낸 데이터가 있다면, 모델을 호출할 때 전달하기 쉽게 데이터를 적절히 가공하는 일을 함 - 모델이 업무 수행을 완료하면, 그 결과를 가지고 화면을 생성하도록 뷰에게 전달(클라이언트 요청에 대해 모델과 뷰를 결정하여 전달) - Servlet 과 JSP를 사용하여 작성할 수 있음 |
Controller 역할을 Servlet 담당하는 Spring 아키텍쳐
호출 순서
- 웹 브라우저가 웹 애플리케이션 실행을 요청하면, 웹 서버가 그 요청을 받아서 서블릿 컨테이너( ex : 툼캣서버) 에 넘겨준다.
서블릿 컨테이너는 URL을 확인하여 그 요청을 처리할 서블릿을 찾아서 실행한다. - 서블릿은 실제 업무를 처리하는 모델 자바 객체의 메서드를 호출한다.
만약 웹 브라우저가 보낸 데이터를 저장하거나 변경해야 한다면 그 데이터를 가공하여 VO객체(Value Object)를 생성하고, 모델 객체의 메서드를 호출할 때 인자 값으로 넘긴다.
모델 객체는 엔터프라이즈 자바빈(EJB: Enterprise JavaBeans)일 수도 있고, 일반 자바 객체(POJO로 된 Service, DAO Objcet)일 수 도 있다. - 모델 객체는 JDBC를 사용하여 매개변수로 너어온 값 객체를 DB에 저장하거나, DB로부터 질의 결과를 가져와서 VO객체로 만들어 변환한다.
- 서블릿은 모델 객체로부터 반환 받은 값을 JSP에 전달한다.
- JSP는 서블릿으로 부터 전달받는 값 객체를 참조하여 웹 브라우저가 출력할 결과 화면을 만들고, 웹 브라우저에 출력함으로써 요청 처리를 완료한다.
- 웹 브라우저는 서버로부터 받는 응답 내용을 화면에 출력한다.
Front Controller 패턴 아키텍쳐
- Front Controller는 클라이언트가 보낸 요청을 받아서 공통적인 작업을 먼저 수행
- Front Controller는 적절한 세부 Controller에게 작업을 위임
- 각각의 애플리케이션 Controller는 클아이언트에게 보낼 뷰를 선택해서 최종 결과를 생성하는 작업
- Front Controller 패턴은 인증이나 권한 체크처럼 모든 요청에 대하여 공통적으로 처리해야 하는 로직이 있을 경우 전체적으로 클라이언트의 요청을 중앙 집중적으로 관리하고자 할 경우에 사용
DispatcherServlet 클래스
- Front Controller 패턴 적용
- Web.xml에 설정
- 클라이언트로부터의 모든 요청을 전달 받음
- Controller나 View와 같은 Spring MVC의 구성요소를 이용하여 클라이언트에게 서비스를 제공
Spring MVC의 주요 구성 요소
구성요소 | 설명 |
DispatcherServelt | 클라이언트의 요청을 ㅂ다아서 Controller에게 클라이언트의 요청을 전달하고, 리턴한 결과값을 View에게 전달하여 알맞은 응답을 생성 |
Handler Mapping | URL과 요청 정보를 기준으로 어떤 핸들러 객체를 사용할지 결정하는 객체이며, DispacherServlet은 하나 이상의 핸들러 매핑을 가질 수 있음 |
Controller | 클라이언트의 요청을 처리한 뒤, Model를 호출하고 그 결과를 DispatcherServlet에게 알려줌 |
Model And View | Controller가 처리한 데이터 및 화면에 대한 정보를 보유한 객체 |
View | Controller의 처리 결과 화면에 대한 정보를 보유한 객체 |
ViewResolver | Controller가 리턴한 뷰 이름을 기반으로 Controller 처리 결과를 생성할 뷰를 결정 |
※ 빨간색 -> 주로 개발자가 사용하는 클래스
Spring MVC의 주요 구성 요소의 요청 처리 과정
- 클라이언트의 요청이 Dispatcher Servlet에게 전달된다.
- DIspatcheServlet은 HandlerMapping을 사용하여 클라이언트의 요청을 처리할 Controller를 획득한다.
- DispatcherServlet은 Controller 객체를 이용하여 클라이언트의 요청을 처리한다.
- Controller는 클라이언트 요청 처리 결과와 View페이지 정보를 담은 ModelAndView 객체를 반환한다.
- DispatcherServlet은 ViewResolver로부터 응답 결과를 생성할 View 객체를 구한다.
- View는 클라이언트에게 전송할 응당을 생성산다.
Spring MVC기반 웹 어플리케이션 작성 절차
- 클라이언트의 요청을 받는 DispatcherServlet을 web.xml에 설정
<Servlet>
<servlet-name>springDispatcherServlet</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:/config/beans*.xml</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
- 클라이언트의 요청을 처리할 Controller 작성
package user.controller;
import java.util.ArrayList;
@Controller
public class UserController {
@AutoWired
private UserService userService;
@RequestMapping("/getUser.do")
public ModelAndView getUser(@RequestParam String id) { //처리할 메서드
UserVO user = userService.getUser(id);
return new ModelAndView("userinfo.jsp","user",user);
}
...
}
- Spring Bean으로 Controller 등록
- JSP를 이용한 View 영역의 코드를 작성
- Browser 상에서 JSP 실행
Reference
T- Academy