[Spring] Spring에서 말하는 Spring MVC 이란?
in Spring on Spring 포스팅
넘어가기 위해 정리하고 가자. 스프링에서 말하는 Spring MVC란?
1. Spring MVC란?
Model-View-Controller의 약자이다.
- Model: 어플리케이션 계층의 정보, 데이터 의미
- View: 화면 출력 로직을 담당
- Controller: Model과 View의 연결하는 제어 로직을 담당
2. Spring MVC 처리 순서
- Spring MVC 구성 주요 컴포넌트
DispatcherServlet
Spring Framework가 제공하는 Servlet 클래스
- Spring MVC의 핵심 구성 요소
- 사용자의 Request 을 관리
Dispatcher가 받은 Request 을 HandlerMapping에게 위임
- Spring에서는 front controller는 DispatcherServlet 이라고 하고 controller는 handler라고 말함
HandlerMapping
requestURL과 Controller 클래스의 맵핑을 관리
( @RequestMapping )- HandlerMapping 인스턴스의 정보로 맵핑된 Controller에게 위임
Controller
요청에 맵핑 된 Controller 위임됨
( @Controller )- @RequestMapping 을 통하여 요청을 처리할 메서드에 호출
- 필요한 비즈니스 로직을 호출
- 해당 요청을 처리할
Service를 주입(DI)받아 Service에게 위임
( @Service ) - Service에서는 비즈니스 로직을 구현
- connection pool를 담당하는
DAO가 주입(DI)받아 대신 DB에 접근
한다. ( @Repository ) - 결과 데이터를 다시 Controller에 전달
- 해당 요청을 처리할
- View에 전달 할 결과 데이터(
Model
)와 이동할 화면(View
) 정보를스프링 MVC가 제공하는 ModelAndView 인스턴스에
담아DispatherServlet에 반환
된다. - DispatherServlet는 ViewResolver에게 뷰 논리정보(View Name)를 전달
ModelAndView
- Controller에서 처리 결과를
View에 전달 할 결과 데이터(Model)와 이동할 화면(View) 정보를 담는 클래스
- Controller 메서드에서 리턴타입이 String이여도 핸들러에서 ModelAndView 인스턴스에 View정보를 넣는다.
ViewResolver
ViewResolver는 View Name를 이용해 알 맞는 view객체를 찾는다.
- View에 model을 rendering하여 View 인스턴스를 다시 DispatherServlet에 보냄
- DispatcherServlet은 최종 결과를 클라이언트에 응답
View
- 결과데이터인 Model 객체를 보여한다.
3. Spring MVC 부연 설명
component-scan
은 @Controller, @Repository, @Service, @Component 선언된 클래스를 스캔하여 빈으로 등록
<context:component-scan base-package="example">
<context:include-filter type="annotation" expression="org.springframework.stereotype.Controller"/>
<context:exclude-filter type="annotation" expression="org.springframework.stereotype.Service"/>
<context:exclude-filter type="annotation" expression="org.springframework.stereotype.Repository"/>
</context:component-scan>
- Spring MVC가
@Controller
에 요청을 보내기 위해 필요한 HandlerMapping과 HandlerAdapter를 bean으로 등록 - Spring4 에서는 HandlerMethodArgumentResolver 설정 가능
<mvc:annotation-driven>
- 정적 파일이 있는 경로는 DispatcherServlet 예외 처리
<mvc:resources mapping="/resources/**" location="/resources/" >
- 스프링에서
@Autowired
를 처리하기 위해 선언
<context:annotation-config/>
ViewResolver
에는 여러가지가 있는데 기본적으로 UrlBasedViewResolver는 논리적인 뷰와 View객체 이름과 같을 때 사용하는 Resolver이다.- Controller에서 String으로
<bean class="org.springframework.web.servlet.view.UrlBasedViewResolver" p:order="0"
p:prefix="/WEB-INF/views/" p:suffix=".jsp"/>
ModelAndView
인스턴스에 Model과 View정보를 담는다.- Controller 메서드에서 리턴타입이 String이여도 핸들러에서 ModelAndView 인스턴스에 View정보를 넣는다.
// ModelAndView(Obejct) or View Name(String)
Object returnValue = invokeForRequest(webRequest, mavContainer, providedArgs);
try {
// mavContainer에 View 정보 담음
this.returnValueHandlers.handleReturnValue(
returnValue, getReturnValueType(returnValue), mavContainer, webRequest);
}
// ModelAndView 인스턴스에 Model과 View 정보 담음
ModelMap model = mavContainer.getModel();
ModelAndView mav = new ModelAndView(mavContainer.getViewName(), model);
if (!mavContainer.isViewReference()) {
mav.setView((View) mavContainer.getView());
}
우리나라(?) 스프링 또는 자바 웹 프로젝트에서 또는 SI에서 많이 사용되는 스프링MVC이다. 스프링에서 확장성하고 유연성을 생각하여 @MVC 애너테이션을 활용했기 접근했기 때문에.
만약 Spring MVC 프로젝트라면 회사가 다를지어도 전체적인 구조와 흐름은 비슷하여 개발자가 파악하기에는 편할 수 있다.
전자정부 표준 프레임워크도 한 몫하는 것 같다.
참고
- https://docs.spring.io/spring/docs/current/spring-framework-reference/web.html#mvc
- http://egloos.zum.com/springmvc/v/504151
- https://jeong-pro.tistory.com/96
- https://devbox.tistory.com/entry/Spring-스프링-MVC-패턴-개요
- 토비의 스프링 3.1 책