====== SpringBoot and Spring Web MVC ====== ===== 설정 커스터마이즈 ===== * [[https://docs.spring.io/spring/docs/4.3.x/javadoc-api/org/springframework/web/servlet/config/annotation/WebMvcConfigurerAdapter.html|WebMvcConfigurerAdapter]] 를 구현하고 ''@Configuration''을 등록하면 여러가지 옵션을 override 할 수 있다. * Spring 5 에서는 Java 8 의 default 지원으로 ''WebMvcConfigurerAdapter''가 deprecated 되었다. * [[https://docs.spring.io/spring/docs/5.0.x/javadoc-api/org/springframework/web/servlet/config/annotation/WebMvcConfigurer.html|WebMvcConfigurer]] 직접 사용. * [[https://docs.spring.io/spring-boot/docs/2.0.x/api/org/springframework/boot/autoconfigure/web/servlet/WebMvcRegistrations.html|WebMvcRegistrations]] 구현으로 몇가지 Handler 등록. * ''@EnableWebMvc''를 활성화 하면 일반 Spring MVC 모드가 되어 Auto Configuration이 안먹게 된다. * 이 경우 ''WebMvcConfigurationSupport'' Bean이 등록되는데 이 Bean이 존재하면 Auto Configuration 이 중단된다. * 즉, SpringBoot 에서는 ''org.springframework.boot:spring-boot-starter-web'' 의존성이 걸려있다면 ''@EnableWebMvc''를 설정하지 말라. ===== @WebMvcTest 가 잘되게 하려면 ===== * [[springframework:springboot:test|SpringBoot Test]]의 ''@WebMvcTest''는 WebMvc 관련 설정만 읽고 나머지 컴포넌트에 대한 설정은 읽지 않는데, 이 때문에 WebMvc 관련 설정(''WebMvcConfigurer'')가 다른 컴포넌트를 import 하는 설정들과 섞여 있으면 컨텍스트를 올바로 설정하지 못한다. * 따라서 WebMvc 관련 설정(특히 ''WebMvcConfigurer'')들은 다른 컴포넌트들의 설정과 분리해 두도록 한다. ===== Formatter ===== * Controller 파라미터로 들어온 **문자열을 객체로 변환**해주는 전역 설정. * [[https://docs.spring.io/spring/docs/5.0.x/javadoc-api/org/springframework/format/Formatter.html|Formatter]] 인터페이스 구현. ''Formatter''의 상속 클래스들도 모두 살펴볼 것. * 날짜의 경우 ''@DateTimeFormat'' 애노테이션으로 모든 파라미터마다 설정해주는 것도 가능하지만 공통 전역 설정으로 ''Date'', ''LocalDate'', ''LocalDateTime'' 을 만들어두는게 좋음. * [[https://docs.spring.io/spring/docs/5.0.x/javadoc-api/org/springframework/web/servlet/config/annotation/WebMvcConfigurer.html|WebMvcConfigurer]] ''addFormatters''로 등록. * Formatter와 Jackson Serializers/Deserializers 에 대해서 테스트를 만들어 보증하는 것이 좋다. [[https://gist.github.com/kwon37xi/aa359e364b7e81f79085fb04cc710037|FormatterSerializerTestControllerTest.groovy]] ==== Java 8 java.time.* Formatter 일괄 등록 ==== * from https://stackoverflow.com/a/47934151/1051402 * 아래 설정은 Java 8 ''java.time.*'' 의 Formatter 를 일괄등록해준다. @Configuration public class MyApiWebMvcConfig implements WebMvcConfigurer { @Override public void addFormatters(FormatterRegistry registry) { DateTimeFormatterRegistrar dateTimeFormatterRegistrar = new DateTimeFormatterRegistrar(); dateTimeFormatterRegistrar.setUseIsoFormat(true); // ISO 포맷 사용시, 그게 아니면 각자 명시적 설정 dateTimeFormatterRegistrar.registerFormatters(registry); } } ===== Converter ===== * [[springframework:springboot:httpmessageconverters|SpringBoot HttpMessageConverters]]