Spring Core/자질구래

[SpringBoot] jar로 배포된 파일에서 resources의 파일 접근 시 FileNotFoundException 발생 처리

  • -

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
}

 

Contents

포스팅 주소를 복사했습니다

이 글이 도움이 되었다면 공감 부탁드립니다.