본문 바로가기

IT/JAVA

Spring Boot Resource 사용시 접두사(classpath, file 등)를 사용해야 하는 이유

반응형

결론부터 말하자면

특정 Resource 타입을 사용하도록 강제해야 한다면 접두사를 사용해야 한다.

Resource는 java.net.URI를 추상화한 것이다.
Resource를 구현한 구현체는 아래와 같이 많이 존재한다.

이러한 리소스 타입은

Resource.getResource(String location) 메서드에 location 문자열과 ApplicationContext 타입에 의해 결정이 된다.

 

ApplicationContext를 구현한 ServletWebServerApplicationContext 상황일 때 Resource 타입은 ServletContextResource 타입이 된다.

 

문제는 SpringBoot 사용 시 context path에서 발생한다.


ServletContextResource 일 경우 root 경로를 context path로 정하고 resource를 찾게 된다.

 

하지만 아래와 같은 로그를 보면 알 수 있듯이 SpringBoot 기본 설정에서 context path가 지정되어 있지 않다.

그렇다면 이러한 상황에서 리소스를 찾게 되면 아래와 같은 에러가 발생한다.

 

접두사를 지정하지 않고 test.txt로 경로를 지정하게 되면 Resource 타입은 ApplicationContext 타입에 맞게 ServletContextResource 타입이 된다.

 

이때 정해지지 않은 context path에서 파일을 찾다 보니 'URL because it does not exist'이라는 FileNotFountException이 떨어지게 된다.

 

이러한 상황을 방지하고 명시적이고 정확한 Resource를 지정하기 위해 접두사는 필수인 것이다.

 

접두사를 지정하고 Spring을 구동시켜보면 아래와 같이 Resource 로드에 성공하는 것을 볼 수 있다.

 

반응형