Spring Boot 를 통해서 Web 의존성을 통해서 손쉽게 웹 애플리케이션을 구현 할 수 있다. 이때, 함께 사용 되는 Thymeleaf 라이브러리가 있다.
Thymeleaf 를 사용하지 않고 Spring Boot Web 을 사용 하면서 생긴 사소한 이슈를 알아보자.
Spring Boot 를 통해서 implementation 'org.springframework.boot:spring-boot-starter-web'
의존성을 주입하면서 기본적인 Web 환경이 구성된다.
localhost:8080 으로 접근하면 기본적으로 resources/static 아래에 위치한 “index.html” 파일을 읽게 됩니다.
위 결과와 같이 “index.html” 파일을 읽어서 화면에 보여지게 된다.
그렇다면, static 폴더 아래에 존재하지 않으면 어떻게 될까?
static → templates 폴더 아래로 “index.html” 파일을 옮기고 동작 시켜 보았다.
결과로 찾지 못하고 Error Page 가 나오게 된다. 로그를 보면 리소스 Mapping 정보가 나오면서 일치하는 것이 없다고 알려 준다.
로그의 정보대로 라면 리소스에 접근할 수 있는 경로는 제한이 되고 이외에는 접근할 수 없다는 것으로 알 수 있다.
만약, Thymeleaf 를 사용 했다면 “ template “ 폴더 아래에 접근하는데 문제가 없었을 것이다. Thymeleaf 를 사용하면 자연스럽게 Mapping 정보가 추가 되면서 사용된 이슈로 사용하지 않으면서 만나게 된 문제였다.
그럼 기본적으로 제공 되는 경로 이외에는 접근하기 위해서는 어떻게 해야 할까? 그리고 기존에 접근 가능한 정보는 언제 등록이 되는 걸까?
위 두가지 의문점을 해결해보자.
첫번째, 기존에 접근 가능한 정보 등록
resources/static 등 path 정보가 등록 되는 것을 알 수 있다.
이는 Spring Boot autoConfiguration 에 의해서 Web 의존성 등록 시 WebMvcAutoConfiguration
Web 에 필요한 작업이 처리가 된다.
이때, 리소스의 경로에 대한 정보도 ResourceChainResourceHandlerRegistrationCustomizer
에서 기본적인 Web 프로퍼티 정보가 등록이 된다.
WebProperties.Resources
안에 기본적인 리소스 경로 정보가 들어 있는 것을 알 수 있다.
SimpleUrlHandlerMapping
에 의해서 Request 의 경로에 따라 리소스에 대한 접근 정보가 들어 있는 것을 확인 할 수 있다.
두번째, 첫번째에서 어떻게 기본적인 리소스 접근 정보가 제공 되는지 알게 되었다. 이어서 그렇다면 기본 리소스 이외에 Mapping 정보를 넣어서 접근할 수 있도록 해보자.
Web 에 관련된 Configuration 설정을 하는 과정에 난입하여 제어를 해보도록 하자.
제어를 하기 위해서 WebMvcConfigurer
을 상속받고 addResourceHandlers
를 override 하여 리소스 경로를 작성해주면 된다.
“ open-api/map/ ”** 의 Request 요청의 경우 *CLASSPATH_RESOURCE_LOCATIONS*
에 포함된 리소스 경로에서 파일을 찾도록 하게 된다.
애플리케이션이 구동이 되면서 이전의 SimpleUrlHandlerMapping
에 “ open-api/map/ ”** 요청의 처리 방식이 추가 된 것을 볼 수 있다.
애플리케이션을 통해서 확인해보면 아래와 같이 “ resourece/template/ “ 아래의 폴더의 “ index.html “ 파일을 잘 찾아오는 것을 알 수 있다.
결과적으로 Spring Boot Web 애플리케이션을 구현 하면서 정적 리소스를 읽어오는 경로 탐색 동작 방법을 알아볼 수 있었다.