Spring

Spring 요청의 흐름(Spring MVC 패턴)

스프링 MVC에 요청이 들어오면 어떤 순서를 통해서 응답이 이루어지는지에 대한 포스팅입니다.

 

- implemented by developers : 개발자가 구현

- provided by SpringSource : Spring Framework 제공

- provided by SpringSource sometimes implemented by developers : Spring Framwork 제공 또는 개발자가 구현

 

 

1. DispatcherServlet은 web.xml에 정의된 URL 패턴에 맞는 요청을 받고 URL 컨트롤러의 맵핑 작업을 HandlerMapping에 요청

 

2. HandlerMapping은 URL을 기준으로 어떤 컨트롤러를 사용할지 결정, 결과는 HandlerExecution Chain객체에 담아서 리턴하는데, 요청에 해당하는 Interceptor가 있을 경우 함께 줌.

 

3. HandlerAdapter는 컨트롤러의 메소드를 호출하는 역할을 하는데 실행될 Interceptor가 있을 때는 Interceptor의 preHandle() 메소드를 실행한 다음 컨트롤러의 메소드를 호출하여 요청 처리

 

4. 컨트롤러는 요청을 처리 한 뒤 처리한 결과 및 ModelAndView를 DispatcherServlet에 전달.

 

5. DispatcherServlet은 컨트롤러에서 전달받은 View 이름과 매칭되는 실제 View 파일을 찾기 위해 ViewResolver에게 요청.

 

6. ViewResolver는 컨트롤러가 처리한 결과를 보여줄 뷰를 결정, 컨트롤러에서 전달받은 View 이름의 앞뒤로 prefix, suffix 프로퍼티를 추가한 값이 실제 사용할 뷰 파일 경로가 됨. ViewResolver는 맵핑되는 View 객체를 DispatcherServlet에 전달.

 

7. DispatcherServlet은 ViewResolver에 전달받은 View Model을 넘겨서 클라이언트에게 보여줄 화면을 생성.

 

 

● DispatcherServlet


- 서버로 들어오는 모든 요청을 제일 앞에서 처리하는 Front Controller를 Spring에서 정의하였고, 이를 DispatcherServlet이라고 함.

 

- 요청을 직접 DispatcherServlet이 처리하는 것이 아니라 처리를 맡길 놈에게 일을 시켜서 결과를 도출

 

● HandlerMapping


- Handler는 컨트롤러를 의미 

 

- HandlerMapping => ControllerMapping

 

- DispatcherServlet에 클라이언트로부터 요청이 들어오면 처리를 담당할 컨트롤러를 맵핑해주는 역할

 

- servlet.xml에서 component-scan시 @Controller에 있는 URL정보를 메모리에 올려두고 요청이 들어온 URL과 비교하여 처리할 컨트롤러를 검색

 

- HandlerMapping의 종류

종류

 설명

 BeanNameUrlHandlerMapping

 Bean 정의 태그에서 name에 선언된 URL과 class에 정의된 Controller를 맵핑

 ControllerClassNameHandlerMapping

 Bean 정의된 class 이름 중 suffix(접미사)인 Controller를 제거한 나머지 이름의 소문자로 URL을 맵핑

 SimpleUrlHandlerMapping

Ant-Style 패턴 매칭을 지원하며, 하나의 Controller에 여러 URL을 맵핑 가능

Property의 Key에 URL 패턴을 지정하고 value에 Controller의 id나 이름을 지정 

 RequestMappingHandlerMapping

 컴포넌트 스캔할 패키지를 지정해주면 패티지의 @Controller 중에 @RequestMapping에 선언된 URL과 해당 @Controller 클래스의 메소드와 맵핑

 SimpleUrlAnnotationHandlerMapping

 DefaultAnnotationHandlerMapping에 인터셉터를 등록한 모든 @Controller에 인터셉터가 적용되는 문제점 때문에 @Controller 사용시 URL 단위로 인터셉터를 적용하기 위해 개발

 

- HandlerMapping에 대한 정의가 없다면 기본 HandlerMapping(BeanNameUrlHandlerMapping)을 사용

- jdk1.5 이상 실행환경일 때, Spirng 3.1 이후 버전이면 RequestMappingHandlerMapping가 기본 HandlerMapping

 

● HandlerAdapter


- Apapter : 다른 전기나 기계 장치를 서로 연결해서 작동할 수 있도록 만들어 주는 결합 도구 

 

- 즉, HandlerAdapter => ControllerAdapter

 

- DispatcherServlet을 HandlerMapping으로 찾은 Controller와 연결시켜주는 역할을 하며 DispatcherServlet이 Controller를 호출할 때 사용

 

- HandlerAdapter의 종류

 컨트롤러

종류 

설명 

Servlet 

SimpleServletHandlerAdapter 

Servlet 클래스를 Spring MVC의 Controller로 사용 

HttpRequestHandler 

HttpRequestHandlerAdapter 

Servlet처럼 동작하는 Controller를 만들기 위해 사용하며 Model, View를 사용하지 않는 low level 서버시를 개발할 때 사용 

Controller 

SimpleControllerHandlerAdapter 

디폴트 핸들러 어댑터 이며 가장 대표적인 Spring MVC Controller 

컨트롤러 타입 제한 없음 

AnnotationMethodHandlerAdapter 

클래스와 메소드에 붙은 어노테이션 정보와 메소드 이름, 파라미터, 리턴 타입에 대한 규칙 등을 종합적으로 분석해서 컨트롤러를 호출 

 

- 디폴트로 설정되어 있는 HandlerAdapter는 여러 Adapter를 도입하면서 URL 맵핑을 컨트롤러 단위가 아닌 메서드 단위로 처리하며, 한 컨트롤러가 하나 이상의 URL에 맵핑될 수 있음.

 

● ViewResolver


- Resolver : 해결자

 

- Controller에서 받은 View 이름으로 실제 사용할 View를 찾아 주는 역할

 

- ViewResolver의 종류

종류 

설명 

BeanNameViewResolver 

 논리적 뷰 이름과 동일한 ID를 갖는 view의 구현체를 찾음

ContentNegotiaingViewResolver 

요청되는 콘텐츠 형식에 기반을 두어 선택한 하나 이상의 다른 ViewResolver에 위임. 

FreeMarkerViewResolver 

FreeMarker 기반 템플릿을 찾음 

InternalResourceViewResolver 

웹어플리케이션의 WAR 파일 내에 포함된 뷰 템플릿을 찾음 

JasperReportsViewResolver 

JasperReports 리포트 파일로 정의된 뷰를 찾음 

TilesViewResolver 

Tiles 템플릿으로 정의된 뷰를 찾음 

UrlbasedViewResolver 

ViewResolver의 구현체로 특별한 맵핑정보 없이 view 이름을 URL로 사용 

ResourceBundleViewResolver 

ViewResolver의 구현체로 리소스 파일을 사용하여 views.properties를 기본 리소스 파일로 사용 

 VelocityLayoutViewResolver

VelocityViewResolver의 서브클래스로, 스프링의 VelocityLayoutView를 통해 페이지 구성

VelocityViewResolver 

Velocity 기반의 뷰를 찾음 

 XmlViewResolver

ViewResolver의 구현체로 XML 파일을 사용하며 /WEB-INF/views.xml을 기본 설정파일로 사용 

XsltViewResolver 

XSLT 기반의 뷰를 찾음

 

이게 끝이라면 좋겠지만 

위의 설명에는 filter, interceptor, aop에 대한 내용이 없습니다.

이 3개는 따로 빼서 비교하는 포스팅을 진행할려고합니다. 내용이 많아서 말이죠. ㅎ

'Spring' 카테고리의 다른 글

Spring Interceptor  (0) 2021.04.12
Spring Filter  (0) 2021.04.10
Spring AOP  (0) 2021.04.09
Spring Filter, Interceptor, AOP 비교  (0) 2021.04.09
IOC & DI  (0) 2021.04.06