java) Value 어노테이션과 classpath

@Value(classpath)

@Value("classpath:...") 를 사용할 때
  • JAR 외부 리소스: 외부 파일 시스템에서 리소스를 찾을 수 있으면, @Value는 파일 경로로 해당 리소스를 로드합니다.
  • JAR 내부 리소스: JAR 내부에 포함된 리소스는 파일 경로로 직접 접근할 수 없으며, getInputStream()을 통해 리소스를 읽어야 합니다. Spring은 이 경우 자동으로 Resource 객체를 통해 리소스를 제공합니다. 리소스는 InputStream을 사용해 읽을 수 있습니다.

WAR 배포시

  • tomcat 이 WAR 가 해제된 디렉토리의 WEB-INF/classes/ (실제 파일 시스템의 경로) 를 클래스패스에 추가
  • 리소스에 직접 접근 가능
1@Value("classpath:menu.xml")  
2private Resource menuFile;
3
4...
5
6menuFile.getFile()

JAR 배포시

  • getFile()File 객체를 반환해야 하는데, JAR 내부 파일은 압축되어 있어서 직접 File 로 변환이 불가
  • getInputStream() 를 통해 압축된 JAR 내부에서 리소스를 직접 읽음
1@Value("classpath:menu.xml")  
2private Resource menuFile;
3
4...
5
6try (InputStream inputStream = menuFile.getInputStream())...

포스트
카테고리
시리즈