@HandlebarsHelper
를 찾았다. 자동으로 메소드 명으로 헬퍼에 등록해주는데 이걸로 날짜 포메팅을 했다. 굳이 헬퍼까지 만든 이유는 어제 찾아봤던 @DateTimeFormat
이 Model Attribute
로 받아올 때 포메팅을 지원해주는 것이고(프로퍼티에 설정할 수도 있는 것 같다), 출력해주는 것은 객체에 지정된 로케일대로 출력되기 때문이었다.URL과 HTML 연결을 해주는 WebMvcConfigurer
를 설정하는데, 예시에 나와있는 WebMvcConfigurerAdapter
는 deprecated 되었다고 한다. 이유는 java8부터 인터페이스에 default 메소드가 추가되었기 때문에 더 이상 어댑터 클래스가 필요가 없어졌기 때문이라고 한다. 예전에 백기선님 스터디를 보면서 배웠던 것이지만 다시 간단히 정리해보자면, 저런 식으로 추상 클래스를 어댑터로 사용하면 인터페이스에 고정된 메소드 대신 선택해서 override할 수 있는 장점이 있었다. 그런데 java8부터는 이를 언어차원에서 지원하고, java8이 최소 조건인 스프링 버전 부터는 이 메소드가 deprecated된 것이다.
그리고 또 한가지 헤멨던 부분은 @EnableWebMvc
이었다. 분명 인터페이스 설명에는 같이 사용하라고 되어있는데, 같이 사용하면 인식을 하지 못한다. 왜 그런가 찾아봤더니, 해당 어노테이션은 WebMvcConfigurationSupport
를 상속받은 DelegatingWebMvcConfiguration
를 넣어준다. 기본 설정을 추가해주겠다는 것인데, 스프링 부트는 이미 이 동작을 해준다. 바로 WebMvcAutoConfiguration
클래스인데 autoconfigure
패키지에 들어있으며, 설명을 읽어보면 'Auto-configuration for Web MVC.' 라고 되어있다. 여기서 'Auto-configuration'는 EnableAutoConfiguration
어노테이션으로 링크가 되어있다. 문제는 WebMvcAutoConfiguration
가 동작하기 위해서는 위에서 말했던 WebMvcConfigurationSupport
가 빈으로 등록되지 않은 상태여야한다. 그런데 @EnableWebMvc
를 붙이면 자동으로 import해서 해당 클래스의 인스턴스가 빈에 등록되므로 자동설정이 되지 않는 것이었다. 정적 파일들이 제대로 로드되지 않는 것을 보니, 아마 static 폴더와 관련된 자동 설정이 아닐까 싶다.
이외에 한 가지 더 있었는데, ViewControllerRegistry
에 order를 최상위로 지정해줘야 한다는 것이었다. 처음에 무슨 의미인지 이해가 잘 가지 않았는데, RequestMapping도 우선순위가 있다고 한다. 기본값은 1이고 @Controller
의 하위는 0으로 설정된다고 한다. 참고로 낮을 수록 우선순위가 높다. 다시 말해, order를 따로 지정하지 않으면 컨트롤러의 매핑보다 우선순위가 낮으므로 비슷한 주소를 사용하는 컨트롤러의 다른 리퀘스트 매퍼에 매핑이 된다. 다시 말하면 굳이 최상위로 지정해주지 않아도 -1만 명시해줘도 지금은 잘 동작한다. 굳이 저렇게 해준건 또 다른 이유가 있지 않을까 싶다. 단순히 매직넘버 때문일 것 같기도 하고 나중에 또 생각이 나지 않을까 싶다.
Powered with by Gatsby 2.0