NoSuchFileException - Spring Boot 애플리케이션에 리소스를 추가할 때 이를 피하는 방법

Spring Boot 프로젝트에서 리소스(json 파일, htm 템플릿, 텍스트 파일 등)를 읽으려고 시도했지만 java.nio.file.NoSuchFileException이 발생한 적이 있습니까?

파일이 지정된 위치에 없으면 NoSuchFileException이 발생합니다. 발생하는 유사한 예외는 FileNotFoundException입니다.

1. 디렉토리에서 파일 불러오기



개발자가 리소스를 추가하는 데 사용하는 일반적인 접근 방식은 파일을 src/main/resources/디렉터리에 배치한 다음 해당 경로에서 파일을 읽는 것입니다.
모범 사례는 아니지만 이 접근 방식은 프로젝트가 로컬에서 실행되는 경우 작동합니다. 이는 프로젝트 디렉토리가 런타임 동안 현재 작업 디렉토리로 사용되기 때문입니다.

예를 들어 아래 코드를 사용하여 파일에서 사용자 데이터를 읽고 문자열에 값을 저장할 수 있습니다.

application.properties

filePath=src/main/resources/filename.txt


ReadUserDataFromFile.java

public class ReadUserDataFromFile {
   @Value("${filePath}")
   private String dataFilePath;

   public String readDataFile() throws IOException {
      String data = new String(Files.readAllBytes(Paths.get(filePath)));
     return data;
    }
}


파일이 src/main/resources/디렉토리에 있으면 성공적으로 읽은 것입니다.

이제 프로젝트가 JAR 파일로 패키지된 경우 파일을 읽으려고 하면 NoSuchFileException이 발생합니다. 이는 filename.txt가 JAR의 루트 폴더에 있고 파일 경로를 사용하여 액세스할 수 없기 때문에 발생합니다.

2. 리소스 객체 생성



NoSuchFileException에 대한 더 나은 접근과 해결책은 클래스에 org.springframework.core.io.Resource 객체를 생성하고 파일을 가리키도록 값을 설정하는 것입니다.
예시:

ReadUserDataFromFile.java

public class ReadUserDataFromFile {
   @Value("classpath:filename.txt")
   private Resource dataFile;

   public String readDataFile() throws IOException {
      String data = new String(dataFile.getInputStream().readAllBytes());
      return data;
    }
}


이 접근 방식을 사용하면 로컬 및 JAR 파일 모두에서 파일을 읽을 수 있습니다.

좋은 웹페이지 즐겨찾기