스프링 웹 MVC

MVC에 대한 설명은 많은 곳에서 찾아볼 수 있다. 스프링 웹 MVC 모듈은 이러한 MVC 패턴을 중심으로 만들어졌다. 스프링부트를 이용하면 별도의 설정없이 스프링 웹 MVC 개발을 바로 시작할 수 있다. 이는 스프링부트가 제공하는 자동설정 덕분이다.

다른 분이 작성한 Spring Web MVC 구조 포스팅에 스프링프레임워크 웹 MVC 동작에 대한 전체적인 구조가 있다. 요청과 응답의 전체적인 과정이 어떻게 동작하는지 궁금한 사람들이 읽어보면 좋을 것 같다.

앞으로 11부에 거쳐 스프링 웹 MVC를 학습하는데, 이번 포스팅에서는 스프링부트에서 어떻게 웹 MVC 개발을 바로 시작할 수 있는지에 대해 알아본다.

스프링부트 MVC

# Auto Configure
....
org.springframework.boot.autoconfigure.web.servlet.WebMvcAutoConfiguration,\
....

spring-boot-autoconfigure 모듈의 META-INF/spring.factories를 열어보면 org.springframework.boot.autoconfigure.web.servlet.WebMvcAutoConfiguration가 사용되는 것을 알 수 있다.

@Configuration
@ConditionalOnWebApplication(type = Type.SERVLET)
@ConditionalOnClass({ Servlet.class, DispatcherServlet.class, WebMvcConfigurer.class })
@ConditionalOnMissingBean(WebMvcConfigurationSupport.class)
@AutoConfigureOrder(Ordered.HIGHEST_PRECEDENCE + 10)
@AutoConfigureAfter({ DispatcherServletAutoConfiguration.class,
		TaskExecutionAutoConfiguration.class, ValidationAutoConfiguration.class })
public class WebMvcAutoConfiguration {
    @Bean
	@ConditionalOnMissingBean(HiddenHttpMethodFilter.class)
	@ConditionalOnProperty(prefix = "spring.mvc.hiddenmethod.filter", name = "enabled", matchIfMissing = true)
	public OrderedHiddenHttpMethodFilter hiddenHttpMethodFilter() {
		return new OrderedHiddenHttpMethodFilter(); // 1
	}
    
    @Bean
	@ConditionalOnMissingBean(FormContentFilter.class)
	@ConditionalOnProperty(prefix = "spring.mvc.formcontent.filter", name = "enabled", matchIfMissing = true)
	public OrderedFormContentFilter formContentFilter() {
		return new OrderedFormContentFilter(); // 2
	}
    
    @Configuration
	@Import(EnableWebMvcConfiguration.class)
	@EnableConfigurationProperties({ WebMvcProperties.class, ResourceProperties.class })
	@Order(0)
	public static class WebMvcAutoConfigurationAdapter
			implements WebMvcConfigurer, ResourceLoaderAware { // 3
        ...
    }
}

주요 요소들을 살펴보자.

// 1: HiddenHttpMethodFilter는 스프링 3이후로 제공되는 필터이다. PUT이나 DELETE, PATCH 요청에서 _method라는 hidden form paramater로 어떤 메소드인지 값을 받아올 수 있다. 컨트롤러에 매핑해줄 수 있는 이러한 정보를 바탕으로, @GetMapping, @DeleteMapping등의 핸들러를 만들 수 있도록 도와주는 필터이다.

// 2: HTTP POST에 Form Data를 보낼 수 있게 서블릿 스펙에 정의되어 있는데, FormContentFilter는 PUT과 PATCH 요청에서도 Form Data를 사용할 수 있도록 래핑해준다.

// 3: WebMvcProperties와 ResourceProperties를 사용한다. WebMvcProperties는 spring.mvc로 시작하는 프로퍼티즈를 파싱하여 바인딩한다. ResourceProperties는 spring.resource로 시작하는 프로퍼티즈를 파싱하여 바인딩한다.

이외에도 컨텐츠 네고시에이션 리졸버, 포메터, 리소스핸들러 등 기본적인 웹 MVC 설정으로부터 스프링부트가 더 많은 컨벤션을 제공한다.

스프링 MVC 확장

@Configuration
public class WebConfig implements WebMvcConfigurer {
    
}

@Configuration를 지정하고 WebMvcConfigurer 인터페이스를 구현하여 기본 제공되는 MVC를 확장할 수 있다. @EnableWebMvc를 추가로 지정하면 스프링부트가 제공하는 모든 웹 MVC 기능이 사라지고, 웹 MVC와 관련된 모든 기능을 직접 구현해야한다.

해당 포스팅은 스프링 부트 개념과 활용 강의 내용을 토대로 작성하였습니다.