java.net.URL의 한계(classpath 내부 접근이나 상대경로 등)를 넘어서기 위해 스프링에서 추가로 구현
스프링 내부 동작을 이해하기 위해서 반드시 필요한 부분이다.
Spring 내부 Resource 구현체 중 대표적인 몇가지
UrlResource
java.net.URL을 래핑한 버전, 다양한 종류(ftp,file,http 등의 prefix로 접근유형 판단)의 Resource에 접근 가능하지만 기본적으로는 Http(s)로 원격접근
ClassPathResource
classpath(소스코드를 빌드한 결과(기본적으로 target/classes 폴더)) 하위의 리소스 접근 시 사용
FileSystemResource
이름과 같이 File을 다루기 위한 리소스 구현체
servletContextResource, InputStreamResource, ByteArrayResource
servlet 어플리케이션 루트 하위 파일, inputStream,ByteArrayInput 스트림을 가져오기 위한 구현체
Spring ResourceLoader
실제로 사용하는 방식
스프링 프로젝트 내 Resource(파일 등)에 접근할 때 사용하는 기능
기본적으로 applicationContext에서 구현되어 있음
프로젝트 내 파일(주로 classpath 하위 파일)에 접근할 일이 있을 경우 활용
대부분의 사전정의된 파일들은 자동으로 로딩되도록 되어 있으나, 추가로 필요한 파일이 있을 때 이 부분 활용 가능
@Service
public class ResourceService{
@Autowired
ApplicationContext ctx;
public void setResource(){
Resource myTemplate =
ctx.getResource("classpath:some/resource/path/myTemplate.txt"); // 특정 클래스 패스 아래 파일 접근
//ctx.getResource("file:/some/resource/path/myTemplate.txt"); // 내 로컬에 있는 파일 접근
//ctx.getResource("http://myhost.com/resource/path/myTemplate.txt"); //http 특정 호스트에 있는 파일에 접근
//use myTemplate...
}
}
위에서 스프링에서 가장 핵심이자, 뇌 같은 존재인 ApplicationContext를 이용해서 ResourceLoader를 불러왔고, 경우에 따라 ("classpath:***","file:***","http:***")중 하나를 자동으로 선택해서 파일에 접근할 수 있게 해주었다.
이때 ResourceLoader가 위치 지정자 패턴(classpath 등등...)을 자동으로 선택할 수 있게 해주는 것이 ResourcePatternResolver
이다.
정리하자면
classpath, 로컬, http에서 파일에 접근하기 위해서는 ApplicationContext라는 것을 이용해야 한다. ApplicationContext에는 ResourceLoader가 있어서 파일을 불러올 수 있다. 파일이 어떤 형태의 경로에 있느냐를 선택할때는 ResourceLoader를 implement하고 있는 ResourcePatternResolver가 그 역할을 한다.