개발/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: 웹 애플리케이션 루트 디렉토리에 대한 상대 경로로 해석.
- ApplicationContext의 종류에 따라 다르게 동작.
- 예시:
- 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*: 접두어는 와일드카드 패턴을 사용하여 여러 리소스를 한 번에 로드.
- 접두어를 생략하는 것은 컨텍스트에 의존하는 동작이므로 주의가 필요. 가능한 한 명확하게 접두어를 지정하는 것이 좋다.