Spring Core/자질구래
[SpringBoot] jar로 배포된 파일에서 resources의 파일 접근 시 FileNotFoundException 발생 처리
은서파
2022. 3. 21. 17:15
SpringBoot에서 resources 경로에 정적 파일을 놓고 사용하는 경우가 왕왕 있다. 그런데 희안하게도 개발하는 과정에서는 잘 동작하는데 jar 파일로 배포하기만 하면 FileNotFoundException이 발생하는 희안한 일이 발생한다.
이번 포스트에서는 이유를 파악하고 그 대책을 알아보자.
기본 구성
파일의 배치
먼저 resources 폴더에는 dongcode.txt 파일이 배치되어있다.
spring boot에서의 활용
다음으로 boot 에서 @Value를 이용해서 설정한 값을 org.springframework.core.io.Resource 타입으로 가져온다.
@Value("classpath:/juso/dongcode.txt")
private Resource fileResource;
다음으로 Resource가 제공하는 getFile 메서드를 이용해서 File 객체를 얻어와서 사용할 수 있다.(정확히는 있을것 같다. ㅎ)
try (BufferedReader reader = new BufferedReader(new FileReader(fileResource.getFile()))) {
// do something
}
일단은 앞서 밝혔듯이 코드상에서 실행할 때는 잘 동작하지만 이것을 jar 파일로 만들어서 배포하게 되면 getFile()에서 문제가 발생한다.
문제의 원인
문제의 원인은 api를 자세히 살펴보면 답이 있는데..
File org.springframework.core.io.Resource.getFile() throws IOException
Return a File handle for this resource.
Throws:
java.io.FileNotFoundException - if the resource cannot be resolved asabsolute file path,
i.e. if the resource is not available in a file system
IOException - in case of general resolution/reading failuresSee Also:getInputStream()
getFile()은 file system 상(즉 c:/Temp/~~~ 형식이나. ../ 이런 식의 접근)에 있는 파일을 가져올 때 사용하는 것인데 jar에 있는 파일은 그런 식의 접근이 안된다.
대책은?
이에 대한 대책은 바로 InputStream을 끌어와서 사용하면 된다.
try (BufferedReader reader = new BufferedReader(new InputStreamReader(fileResource.getInputStream()))) {
// do something
}