..

Troubleshooting: JAR 실행 환경에서 getFile() 예외 해결

1. 문제 상황

로컬 IDE 환경에서는 정상적으로 동작하던 리소스 파일 읽기 코드가, executable jar로 빌드하여 배포한 환경에서 FileNotFoundException을 일으키며 실패하는 현상이 발생했습니다.

// 문제가 된 코드
File file = resource.getFile(); // JAR 환경에서 예외 발생

2. 원인 분석

  • IDE 환경: 리소스가 실제 파일 시스템(file:// 프로토콜)에 존재하므로 File 객체로 직접 접근이 가능합니다.
  • JAR 환경: 리소스가 JAR 파일 내부에 패키징되어 있으며, 그 경로는 jar:// 프로토콜로 시작합니다. Java의 File 객체는 실제 파일 시스템의 경로만을 처리할 수 있으므로, JAR 내부의 가상 경로를 인식하지 못해 예외가 발생합니다.

3. 해결 방법: getInputStream() 활용

파일 시스템의 직접적인 경로 대신, 클래스로더(ClassLoader)에게 리소스 읽기를 위임하는 스트림 방식을 사용해야 합니다.

// 해결된 코드
InputStream is = resource.getInputStream();
// 이후 스트림을 통해 데이터 처리 (예: Jackson ObjectMapper, BufferedReader 등)

Spring 환경에서 리소스를 다룰 때는 배포 환경의 차이를 고려하여 항상 getInputStream()을 사용하는 습관을 들이는 것이 좋습니다.