진짜 개발자
본문 바로가기

FrameWork/Spring Boot

Spring Boot - resourceLoader가 jar에 포함된 File을 찾지 못하는 에러(classPath 사용시 발생)

ResourceLoader classPath롤 이용해 파일을 찾는 경우 getFile() 사용시 에러

ResourceLoader classPath롤 이용해 파일을 찾는 경우 getFile() 사용시 에러

1. 상황

상황은 이렇습니다. SpringBoot를 이용해 서버를 구축하는 도중 file을 가져와야할 상황이 발생했고, 해당 파일은 classpath를 통해 접근할 수 있도록, src/main/resources/ 경로에 포함시키기로 했습니다. 또한 classpath 에 존재하는 파일에 쉽게 접근할 수 있도록 Spring에서 제공하는 ResourceLoader를 이용하기로 했습니다.

 

위그림을 보면, resourceLoader를 통해 성공적으로 file을 불러온것을 볼 수 있습니다.

 

하지만, 이 프로그램을 jar파일로 만들어 배포하여 실행하면 위와 같이 File not found Exception이 발생하는 것을 볼 수 있습니다.

 

 

 

 

2. 원인

원인은 간단합니다. 이를 이해하기 위해 우선 Resource인터페이스의 getFile()메소드를 살펴보겠습니다.

 

위 그림은 ResourceLoadergetResource()메소드가 반환하는 인터페이스인, ResourcegetFile()메소드 입니다. FileNotFoundException을 발생시키는 상황은 resource가 File System에서 사용가능하지 않는 경우라고 나와있습니다.

 

 

이해가 가시나요?? 조금더 자세히 설명드리겠습니다.

제가 배포환경에서 서버를 구동시키기 위해 만드는 파일은 jar입니다. 또한 해당 jar에만 우리가 classpath를 통해 접근하고자 하는 file이 담겨있습니다.(다시 말해, FileSystem에서는 찾을 수 없는 위치 입니다.)

 

 

 

 

3. 해결방법

해결방법 역시 간단합니다. getFile()메소드는 FileSystem에서 file을 찾습니다. 따라서 getInputStream()을 통해 파일을 읽어오면 성공합니다.

 

성공입니다. (참고로, inputStream.available() 메소드는 파일에서 읽을 수 있는 byte의 크기를 반환합니다.)