공모전 준비 중에 resources에 static 디렉토리에있는 index.html을 스프링에서 인식하지 못하는 문제가 발생하였다.
내가 알기론 static 디렉토리에 있는 html파일은 외부에서 url만으로 접근할 수 있었는데(localhost/~~~), 404 not found문제가 계속 발생하였다.
부트에서는
이런 WARN 메세지가 발생하였는데 처음보는 에러기도하고 검색하며 찾아봐도 많은 사람들이 발생하는 에러가 아닌 것 같았다.
처음에는 부트와 리액트를 연동했다가 해제하는 과정 중 어딘가를 빼먹어서 매핑이 잘못됐나? 하는 마음으로 다 찾아봤지만 문제가 없었다.
그래서 내가 알고있는 개념이 틀렸나? 싶어서 구글링을하며 막 찾아보다가 직접 WebMvcAutoConfiguraion의 addResourceHandlers함수도 보고,
여기서 resource 클래스의 코드도 직접보며 경로 설정은 내가 알고있는 대로 돼있는 걸 확인했다.
private static final String[]CLASSPATH_RESOURCE_LOCATIONS= { "classpath:/META-INF/resources/",
"classpath:/resources/", "classpath:/static/", "classpath:/public/" };
그럼 경로 설정 문제가 아닌데..를 느꼈고 WARN 메세지를 곰곰히 생각해보니까 뭔가 mapping쪽에서 문제가 생긴 것 같았다. 그래서 application.properties를 보니까
spring.mvc.throw-exception-if-no-handler-found=true
spring.web.resources.add-mappings=false
이 설정이 돼있었다. mapping이라는 단어가 있는게 수상해서 주석처리해보니까 놀랍게도 된다..
이 설정 추가한 공모전 같이 진행하는 친구에게 물어봤는데 “예외처리할때 HTTP바디에도 에러내용 담아서 보내려고 여러가지 하다가 안지웠나봐” 였다. 어제 밤부터 두명이서 짬 날때 틈틈히 보면서 몇 시간동안 찾아봤는데 알고보니 별 거 아닌거라 다행이다 싶으면서도 찾아내서 뿌듯하다 ㅋㅋㅋㅋㅋ
<Spring Boot Web development static resource processing 문서>를 찾아보니까 add-mappings가 true여야 WebMvcAutoConfiguration의 addResourceHandler 메소드가 실행되는 것 같다. (디폴트 값이 true)
-> 그래서 자동으로 resources라든지 static이라든지 기본경로에 있으면 컨트롤러 매핑을 안해줘도 조회가 되는 것이었다!
이 속성이 언제 쓰일지는 아직 잘 모르겠지만 다음 번에 쓸 문제가 생긴다면 좀 더 유연하게 대처할 수 있을 것 같다.
너무 너무 도움되었어요. 제 삽질의 마침표.