WebMvcAutoConfiguration
- HiddenHttpMethodFilter.class는 Spring framwork에서 filter에 해당하는데, post, delete 등 HTTP 메서드 요청을 _method 라는 히든 파라미터로 어떤 메소드인지 값을 받아 올 수있다. 그리고 그 값을 받아와서 컨트롤러에서 @DeleteMapping 등 HandlerMapping을 할 수 있도록 도와준다.
- HttpPutFormContentFilter.class는 Http POST 폼만 폼데이터를 보낼 수 있도록 서블릿 스펙에 정의가 되어있는데 put과 patch도 post요청처럼 데이터를 꺼낼 수 있도록 도와준다.
* 스프링 부트가 제공하는 MVC기능을 더 확장하고 싶을 때 `implements WebMvcConfigurer`를 이용하면된다.
HttpMessageConverters
Http 요청 본문을 객체로 변환하거나 객체를 Http 응답 본문으로 변환할 때 사용한다.
@RequestBody, @ResponseBody를 사용할 때 HttpMessageConverters가 사용된다.
기본적으론는 JsonMessageConverter다. 만약 리턴타입이 String이면 StringMeesageConverter가 사용된다.
그리고 @RestController는 @ResponseBody를 생략해도 된다. 하지만 @Controller는 생략해서는 안된다.
만약에 @Controller를 사용하고 @ResponseBody를 생략하게되면 ViewResolve를 타게 될 것이다.
View Resolve
view resolver를 설정해주는 자동설정(ContentNegotiatingViewResolver와 BeanNameViewResolver)이 있다.
ContentNegotiatingViewResolver는 여러 view resolver들중 하나인데, 들어오는 요청의 accept header에 따라서 응답이 달라진다. accept header는 브라우저가 어떤 타입의 응답을 원한다라고 서버에 알려주는것이다.
즉 어떤 요청이 들어오면 그 요청의 응답을 만들어 낼 수있는 모든 뷰를 탐색한다. 그 다음에 최종적으로 accept header와 view 타입을 비교해서 선택한다.
accept header를 제공하지않는 요청들도 있는데 이럴때는 format이라는 파라미터를 사용하면된다.
ResourceHttpRequestHandler
Last-Modified 헤더를 보고 적절히 응답한다. 예를 들어 첫 요청은 200응답이고 리소스 내용을 변화하지않은 상태에서 다시 요청하면 304 응답이지만 리소스를 변화한 다음 다시 빌드한 후 요청에대한 응답은 200이다.
템플릿엔진
JSP를 권장하지 않는 이유는 JAR로 패키징한 파일을 사용하지 못하고 WAR로 패키징을 해야한다. 물론 WAR로 패키징을 하더라도 임베디드 톰캣으로 java -jar 옵션으로 실행할 수도 있고 다른 서블릿엔진에 WAR 파일을 배포할 수 있다. 하지만 서블릿엔진중에서 undertow는 JSP를 지원하지 않는다. 이러한 제약사항이 있어서 잘 쓰지않는다.
@CrossOrigin
CORS는 Cross Origin Resouce Sharing의 약자로, SOP(Single Origin Policy)를 우회하기 위한 기술이다.
Origin은 URL 스키마(https,http) + hostname + port로 구성되어있다.
Access-Control-Allow-Origin는 어떤 Origin이 접근했는지 알려주는 헤더이다.
실제로 서버에 요청하기 전에 "Access-Control-Allow-Origin"을 서버에 요청하고 "Access-Control-Allow-Origin"의 정보와 자신의 정보가 일치하면 서버에 요청을 한다