[SPRING] 10. 스프링 MVC 프레임워크 동작 방식

Yuri Lee·2022년 6월 30일
0

스프링

목록 보기
7/13
post-thumbnail

1. 스프링 mvc 핵심 구성요소

DispatcherServlet이 모든 연결을 담당.

2. DispatcherServlet과 스프링 컨테이너

  • web.xml 설정
	<servlet>
		<servlet-name>dispatcher</servlet-name>
		<servlet-class>
			org.springframework.web.servlet.DispatcherServlet 
            //전달받은 설정 파일을 이용해서 스프링 컨테이너를 생성
            //이때 사용하는 설정파일에 이들 빈에 대한 정의가 포함되어 있어야함
		</servlet-class>
		<init-param>
			<param-name>contextClass</param-name>
			<param-value>
				org.springframework.web.context.support.AnnotationConfigWebApplicationContext
			</param-value>
		</init-param>
		<init-param>
			<param-name>contextConfigLocation</param-name>
			<param-value>
				config.MemberConfig
				config.MvcConfig
				config.ControllerConfig
			</param-value>
		</init-param>
		<load-on-startup>1</load-on-startup>
	</servlet>

	<servlet-mapping>
		<servlet-name>dispatcher</servlet-name>
		<url-pattern>/</url-pattern>
	</servlet-mapping>

	<filter>
		<filter-name>encodingFilter</filter-name>
		<filter-class>
			org.springframework.web.filter.CharacterEncodingFilter
		</filter-class>
		<init-param>
			<param-name>encoding</param-name>
			<param-value>UTF-8</param-value>
		</init-param>
	</filter>
	<filter-mapping>
		<filter-name>encodingFilter</filter-name>
		<url-pattern>/*</url-pattern>
	</filter-mapping>

3. @Controller를 위한 HandlerMapping과 HandlerAdapter

DispatcherServlet은 스프링 컨테이너에서 HandlerMapping과 HandlerAdapter 타입의 빈을 사용하므로 핸들러에 알맞은 빈이 스프링 설정에 등록되어 있어야함
-> @EnableWebMvc 애노테이션 추가로 가능!

@Configuration
@EnableWebMvc
public class MvcConfig implements WebMvcConfigurer{

@EnableWebMvc 애노테이션으로 추가되는 빈 객체 클래스 중에는 다음 두 클래스가 포함되어 있다.

  • RequestMappingHandlerMapping : @Controller 애노테이션이 적용된 객체의 요청 매핑 애노테이션(@GetMapping) 값을 이용해서 웹 브라우저의 요청을 처리할 컨트롤러 빈을 찾는다.
  • RequestMappingHandlerAdapter : 컨트롤러의 메서드를 알맞게 실행하고 그 결과를 ModelAndView 객체로 변환해서 DistpatcherServlet 에 리턴.

4. WebMvcConfigurer 인터페이스

@EnableWebMvc 애노테이션을 사용하면 WebMvcConfigurer 타입 빈을 이용해서 mvc 설정을 추가로 생성한다.

@Configuration
@EnableWebMvc
public class MvcConfig implements WebMvcConfigurer{

	//HandlerMapping 역할
	@Override
	public void configureDefaultServletHandling(
			DefaultServletHandlerConfigurer configurer) {
		configurer.enable();
	}
	
    //ViewResolver 역할
	@Override
	public void configureViewResolvers(ViewResolverRegistry registry) {
		registry.jsp("/WEB-INF/view/", ".jsp");
	}
	
}

WebMvcConfigurer 인터페이스를 상속하고있다. 그러므로 MvcConfig는 WebMvcConfigurer 타입 빈이 된다.

5. jsp를 위한 ViewResolver

	@Override
	public void configureViewResolvers(ViewResolverRegistry registry) {
		registry.jsp("/WEB-INF/view/", ".jsp");
	}

컨트롤러의 실행결과를 받은 DispatcherServlet은 ViewREsolver에게 뷰 이름에 해당하는 View 객체를 요청.
Model에 담긴 값은 View 객체에 Map 형식으로 전달된다. Map 객체에 담겨있는 키 값을 request.setAttribute()를 이용해서 request의 속성에 저장한 후 해당 경로의 jsp를 실행한다. 결과적으로 컨트롤러에서 지정한 Model 속성은 request 객체 속성으로 jsp에 전달되기 때문에 jsp는 모델에 지정한 속성이름을 사용해서 값을 사용할 수있게 된다.

6. 디폴트 핸들러와 HandlerMapping 의 우선순위

<servlet-mapping>
		<servlet-name>dispatcher</servlet-name>
		<url-pattern>/</url-pattern>
	</servlet-mapping>

DispatcherSevlet에 대한 매핑경로가 "/"인 경우 .jsp로 끝나는 요청을 제외한 모든 요청을 DispatcherServlet이 처리한다. 그런데 @EnableWebMvc 애노테이션이 등록하는 HandlerMapping은 @Controller 애노테이션을 적용한 빈 객체가 처리할 수 있는 요청 경로만 대응할 수 있다.

profile
개발자 이유리

0개의 댓글