SPA, 예를 들어 Angular 빌드 결과를 Spring Boot(MVC) static 폴더에 올리고, http://host:port/ 만으로 index.html 페이지로 이동하게 하려면 redirect 설정을 해야 함
Angular 에서는 Client-side Routing을 제공하기 때문에 Spring의 Server-side Routing의 제어가 통하지 않는다. 다만 index.html로만 잘 연결해도 클라이언트가 라우팅 상태를 잃지 않고 subdirectory에 대한 path 연결을 이어갈 수 있다.
ex) http://host:port/#/subpage 에서 refresh(F5) 시도 할 때 없는 페이지라며 오류 나던 문제
==> http://host:port/index.html 로 리다이렉트 되면서 다시 한번 Angular Router가 http://host:port/index.html/#/subpage 로 연결해 준다. 최종적인 URL은 http://host:port/#/subpage 로 돌아감
해당 코드 예제
Spring 4.1부터 addRedirectViewController 함수 추가됨
==> addViewController + setViewName 함수의 결합
@Configuration @EnableWebMvc public class WebApplicationConfig extends WebMvcConfigurerAdapter { private static final String[] CLASSPATH_RESOURCE_LOCATIONS = { "classpath:/META-INF/resources/", "classpath:/resources/", "classpath:/static/", "classpath:/public/" }; /* * 참고 https://spring.io/blog/2015/06/08/cors-support-in-spring-framework */ @Override public void addCorsMappings(CorsRegistry registry) { // 일단 모두 해제 상태로 개발하다가 추후 클라이언트의 접근 URL 기준으로 조정 registry.addMapping("/**"); } // index.html을 찾기 위한 리소스 로케이션 등록 @Override public void addResourceHandlers(ResourceHandlerRegistry registry) { if (!registry.hasMappingForPattern("/**")) { registry.addResourceHandler("/**").addResourceLocations("classpath:/static/"); } } @Override public void addViewControllers(ViewControllerRegistry registry) { // **NOTE: forward도 redirect도 안먹힘 registry.addRedirectViewController("/", "/index.html"); } }
** 참고자료
http://www.logicbig.com/tutorials/spring-framework/spring-web-mvc/url-to-url-redirect/