[KOTLIN] [SPRINGBOOT 2.7.X] jar 배포 후 Resources 파일의 경로를 얻어오지 못하는 문제

[KOTLIN] [SPRINGBOOT 2.7.X] jar 배포 후 Resources 파일의 경로를 얻어오지 못하는 문제

Resources 디렉토리 안에 솔루션 라이센스 키를 넣어두고 해당 파일을 읽어 솔루션의 API 호출을 해야하는 작업을 진행했다. 별로 어려울 건 없는 작업이라 오전부터 점심까지 빠르게 처리했는데.. 문제는 여기서부터 시작되었다..

로컬에서는 Resources 디렉토리를 참조해서 불러오는 것이 아무런 이슈가 없었으나 EB(Elastic Beanstalk)에 jar 파일 하나로 배포를 하려니 Resources에 있던 파일의 경로가 로컬과는 달라지는 이슈를 겪게 되었다.

abc.dat 파일이라고 가정했을때 아래와 같이 경로가 다르게 확인되었다.
– Local: /src/main/resources/abc.dat
– AWS EB(Elastic Beanstalk): /var/app/current/application.jar!/BOOT-INF/classes!/abc.dat

결론부터 말하면 저 경로를 맞추더라도 “cannot be resolved to absolute file path because it does not reside in the file system” 에러 메세지와 함께 참조할 수 없다는 결과를 얻게 된다.
찾은 해답은 ClassPathResource를 통해 Resources 내 파일을 읽어온 뒤 InputStream으로 복사를 하고 복사한 파일의 경로를 참조하여 사용하는 것이다.

처음엔 이렇게까지 해야하나 싶어 경로를 다 찍어보고 접근해보고 많은 시도를 해봤지만 무용지물이었다. 저 방법이 최선이었다. 해결한 코드는 아래와 같다.

fun getResourcePath(resourceFileName: String): String {

        val resourceFileNameInfo = resourceFileName.split(".")
        val inputStream: InputStream = ClassPathResource(resourceFileName).inputStream
        val tempFile: File = File.createTempFile(resourceFileNameInfo.first(), ".${resourceFileNameInfo.last()}")

        try {
            FileUtils.copyInputStreamToFile(inputStream, tempFile)
        } finally {
            IOUtils.closeQuietly(inputStream)
        }

        return tempFile.path
    }

위 코드를 작성하기까지 자료 도움을 받은 곳의 출처:
https://velog.io/@hmyanghm/jarfilepath
https://fire-programmer.tistory.com/91
https://zoetechlog.tistory.com/111

그리고 위 코드에서 FileUtils를 사용하기 위해서는 Gradle 의존 라이브러리 추가가 필요하다.

dependencies {
    implementation("commons-io:commons-io:2.11.0")
}
%d 블로거가 이것을 좋아합니다: