ResourceLoader classPath롤 이용해 파일을 찾는 경우 getFile() 사용시 에러
1. 상황
상황은 이렇습니다. SpringBoot를 이용해 서버를 구축하는 도중 file을 가져와야할 상황이 발생했고, 해당 파일은 classpath
를 통해 접근할 수 있도록, src/main/resources/
경로에 포함시키기로 했습니다. 또한 classpath
에 존재하는 파일에 쉽게 접근할 수 있도록 Spring에서 제공하는 ResourceLoader
를 이용하기로 했습니다.
위그림을 보면, resourceLoader
를 통해 성공적으로 file을 불러온것을 볼 수 있습니다.
하지만, 이 프로그램을 jar
파일로 만들어 배포하여 실행하면 위와 같이 File not found Exception
이 발생하는 것을 볼 수 있습니다.
2. 원인
원인은 간단합니다. 이를 이해하기 위해 우선 Resource
인터페이스의 getFile()
메소드를 살펴보겠습니다.
위 그림은 ResourceLoader
의 getResource()
메소드가 반환하는 인터페이스인, Resource
의 getFile()
메소드 입니다. FileNotFoundException
을 발생시키는 상황은 resource가 File System에서 사용가능하지 않는 경우라고 나와있습니다.
이해가 가시나요?? 조금더 자세히 설명드리겠습니다.
제가 배포환경에서 서버를 구동시키기 위해 만드는 파일은 jar
입니다. 또한 해당 jar
에만 우리가 classpath
를 통해 접근하고자 하는 file이 담겨있습니다.(다시 말해, FileSystem에서는 찾을 수 없는 위치 입니다.)
3. 해결방법
xxxxxxxxxx
public class Runner implements ApplicationRunner {
private ResourceLoader resourceLoader;
public void run(ApplicationArguments args) throws Exception {
System.out.println(resourceLoader .getResource("classpath:test.txt")
.getInputStream()
.available());
}
}
해결방법 역시 간단합니다. getFile()
메소드는 FileSystem에서 file을 찾습니다. 따라서 getInputStream()
을 통해 파일을 읽어오면 성공합니다.
성공입니다. (참고로, inputStream.available() 메소드는 파일에서 읽을 수 있는 byte의 크기를 반환합니다.)
'FrameWork > Spring Boot' 카테고리의 다른 글
Spring Boot - Custom Validator를 생성해야하는 경우와 생성방법(Collection 검증) (0) | 2020.04.10 |
---|---|
Spring Boot - 한글, 한자 인코딩(Encoding) 에러시 체크리스트! (0) | 2020.01.17 |
Spring Boot - Profile에 따른 properties(yml) 파일 설정하기 (2) | 2019.11.28 |
Spring Boot - Timezone을 설정한 채로 배포하기(-Duser.timezone을 사용하지 않고) (2) | 2019.10.05 |
SpringBoot - REST API 인증 - 1 (Interceptor와 JwtToken을 이용한 App API 인증) (2) | 2019.09.17 |