개발/Spring

[Spring] 리소스 접두어

함수형 인간 2025. 3. 14. 05:50

 

1. classpath:

  • 의미: 클래스패스(Classpath)에서 리소스를 찾는다.
    (ex: 일반적인 maven / gradle 폴더 구조에서는 src/main/java , src/main/resources , src/test/java , src/test/resources   
    가 클래스패스 루트로 등록 되어 있음)
  • 동작 방식:
    • 클래스 로더(Class Loader)를 사용하여 리소스를 찾는다.
    • JAR 파일 내부, 클래스패스에 등록된 디렉토리 등에서 리소스를 탐색.
    • classpath: 뒤에 오는 경로는 클래스패스 루트를 기준으로 하는 상대 경로.
  • 예시:
    • classpath:config/application.properties: 클래스패스 루트의 config 디렉토리 안에 있는 application.properties 파일을 찾는다.
    • classpath:com/example/myapp/data.xml: com/example/myapp 패키지에 해당하는 디렉토리 또는 JAR 파일 안에서 data.xml 파일을 찾는다.
  • 주의 사항:
    • 클래스패스에 동일한 이름의 리소스가 여러 개 존재할 수 있다. 이 경우, 어떤 리소스가 로드될지는 클래스 로더의 동작 방식에 따라 달라진다 (일반적으로는 먼저 발견되는 리소스가 로드됨).
    • classpath*: (별표 포함) 접두어를 사용하면, 동일한 이름의 모든 리소스를 찾아서 Resource 배열로 반환. 

2. file:

  • 의미: 파일 시스템(File System)에서 리소스를 찾는다.
  • 동작 방식:
    • java.io.File을 사용하여 리소스를 로드.
    • file: 뒤에 오는 경로는 절대 경로 또는 상대 경로일 수 있다.
    • 상대 경로인 경우, 현재 작업 디렉토리(Current Working Directory)를 기준으로 해석. (JVM이 시작된 위치, -Duser.dir 시스템 프로퍼티로 확인 가능)
  • 예시:
    • file:/path/to/my/file.txt: 절대 경로 /path/to/my/file.txt에 있는 파일을 로드.
    • file:relative/path/to/file.txt: 현재 작업 디렉토리 아래의 relative/path/to/file.txt 파일을 로드.
  • 주의 사항:
    • 파일 시스템 경로는 운영체제에 따라 다르게 표현될 수 있다 (예: Windows에서는 C:\path\to\file, Unix/Linux에서는 /path/to/file).

3. URL 접두어 (http:, https:, ftp:, 등)

  • 의미: java.net.URL을 사용하여 리소스를 로드.
  • 동작 방식:
    • 해당 프로토콜(http, https, ftp 등)을 처리할 수 있는 URL 핸들러를 사용하여 리소스를 가져온다.
    • 일반적으로 네트워크를 통해 리소스를 다운로드.
  • 예시:
    • http://example.com/resource.txt: example.com 서버에서 resource.txt 파일을 가져온다.
    • ftp://ftp.example.com/files/data.csv: FTP 서버에서 data.csv 파일을 다운로드.
  • 주의 사항:
    • 네트워크 연결이 필요하며, 연결 상태에 따라 리소스 로딩이 실패할 수 있다.
    • 보안: 신뢰할 수 없는 URL로부터 리소스를 로드하는 것은 보안 위험을 초래할 수 있다.

4. 접두어 없음

  • 의미: ResourceLoader 구현체 (일반적으로 ApplicationContext)의 기본 전략에 따라 리소스 경로를 해석.
  • 동작 방식:
    • ApplicationContext의 종류에 따라 다르게 동작.
      • ClassPathXmlApplicationContext: 클래스패스 경로로 해석 ( classpath: 접두어가 붙은 것과 동일).
      • FileSystemXmlApplicationContext: 파일 시스템 경로로 해석 (file: 접두어가 붙은 것과 유사하지만, 상대 경로의 기준이 다를 수 있음).
      • WebApplicationContext: 웹 애플리케이션 루트 디렉토리에 대한 상대 경로로 해석.
  • 예시:
    • ClassPathXmlApplicationContext에서 config/app.xml은 classpath:config/app.xml과 동일하게 해석됩니다.
    • FileSystemXmlApplicationContext에서 config/app.xml은 파일 시스템의 상대 경로로 해석 (현재 작업 디렉토리 기준).
  • 주의 사항:
    • ApplicationContext의 종류에 따라 다르게 해석되므로, 혼동을 피하기 위해 명시적으로 접두어를 사용하는 것이 좋다.

5. classpath*: (별표 포함)

  • 의미: 클래스패스에서 지정된 패턴과 일치하는 모든 리소스를 찾는다. 와일드카드(*)를 사용하여 패턴을 지정할 수 있다.
  • 동작 방식:
    • 클래스 로더를 사용하여 클래스패스를 검색하고, 지정된 패턴과 일치하는 모든 리소스를 찾는다.
    • Resource 배열을 반환.
  • 예시:
    • classpath*:com/example/**/*.xml: com/example 패키지 및 하위 패키지에 있는 모든 XML 파일을 찾는다.
    • classpath*:META-INF/spring.factories: 클래스패스 전체에서 META-INF/spring.factories파일을 모두 찾는다. (스프링 부트 자동 설정에 사용됨)
  • 주의 사항:
    • classpath*:는 클래스패스 전체를 검색하므로, 성능에 영향을 줄 수 있다. 꼭 필요한 경우에만 사용하는 것이 좋다.
    • PathMatchingResourcePatternResolver를 사용해야 동작. (ApplicationContext는 PathMatchingResourcePatternResolver의 구현체입니다.)

정리

  • 스프링 리소스 접두어는 리소스의 종류와 위치를 명확하게 지정하여, 리소스 로딩 방식을 제어하는 강력한 기능.
  • classpath:, file:, URL 접두어, 그리고 접두어 없음을 이해하고 적절하게 사용하면, 다양한 환경에서 일관되고 유연하게 리소스를 관리할 수 있다.
  • classpath*: 접두어는 와일드카드 패턴을 사용하여 여러 리소스를 한 번에 로드.
  • 접두어를 생략하는 것은 컨텍스트에 의존하는 동작이므로 주의가 필요. 가능한 한 명확하게 접두어를 지정하는 것이 좋다.