1. The Resource Interface
Spring의 Resource 인터페이스는 Resource에 대한 접근을 추상화하기 위한 인터페이스이다.
public interface Resource extends InputStreamSource {
//리소스가 있는지 없는지 확인
boolean exists();
//Stream이 열렸는지 체크
boolean isOpen();
//해당 리소스의 url을 가져온다
URL getURL() throws IOException;
//해당 리소스의 파일을 가져온다
File getFile() throws IOException;
//상대 경로를 통해서 다른 리소스를 가져옴
Resource createRelative(String relativePath) throws IOException;
//파일 이름을 가져온다
String getFilename();
//설명을 가져온다
String getDescription();
}
위의 인터페이스 정의 중 exists() , getFile(), createRelative(String relativePath)를 주로 사용한다.
2. Built-in Resource Implementations
Spring은 다음과 같은 Resource 구현체를 포함한다.
- UrlResource
- ClassPathResource
- FileSystemResource
- ServletContextResource
- InputStreamResource
- ByteArrayResource
보통 Resource Interface를 통해 직접 프로그래밍 하기 보다는 스프링부트에서 사용하는 특정 관례(ResourceLoader에서 사용됨)에 따라서 특정 파일을 읽어들일 때에 Resource Interface를 사용한다.
① UrlResource
file: http: 이런식의 Prefix로 프로토콜을 명시해주고 해당 리소스의 위치를 알려주는 URL방식을 통해서 리소스의 위치를 알려주는 방식
Resource resource = new UrlResource("file:{절대경로}");
② ClassPathResource
Class Loader를 통해서 ClassPath에서 리소스를 찾는 방식
ClassPathResource resource = new ClassPathResource("dao.xml");
③ FileSystemResource
절대경로라던지 파일시스템에서 리소스를 찾는 방식 (거의 사용 X)
Resource resource = new FileSystemResource({절대경로});
④ ServletContextResource
웹 프로젝트에서 사용되는데 Spring Core에서는 다루지 않겠음
⑤ InputStreamResource
inputStream을 넣어주고 사용하는 리소스 (보통 파일을 읽어들일 때 사용)
⑥ ByteArrayResource
byteArray를 넣어주고 사용하는 리소스 (보통 파일을 쓸 때 사용)
※String 객체를 Resource 객체로 변환하는 방법
prefix Example
- classpath:com/myapp/config.xml : classpath로부터 경로에 있는 리소스를 가져옴 (ClassPathResource 인터페이스)
- file:///data/config.xml : 절대경로를 통해 FileSystem으로 부터 리소스를 가져옴 (FileUrlResource 인터페이스)
- http://myserver/logo.png : 외부에 있는 데이터를 가져올 때 사용 (UrlResource 인터페이스)
Resource를 왜 사용하는가 ?
→ Resource라는 인터페이스를 사용함으로써 일괄된 프로그래밍 메소드를 사용하며 코딩할 수 있다.
하지만,
실제로 리소스를 구현하는것 보다 ResourceLoader를 사용한다.
ClassPathXmlApplicationContext가 상속 받는 것들을 따라 들어가다보면 implements ResourceLoader를 확인할 수 있다.
3. ResourceLoaderAware
ResourceLoaderAware 인터페이스는 ResourceLoader 참조가 될 Components를 식별하는 콜백 인터페이스이다.
public class Main {
public static void main(String[] args) throws IOException {
AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext();
context.register(ResourceExample.class);
context.refresh();
ResourceExample re = context.getBean(ResourceExample.class);
re.print();
context.close();
}
}
@Component
public class ResourceExample implements ResourceLoaderAware {
private ResourceLoader resourceLoader;
@Override
public void setResourceLoader(ResourceLoader resourceLoader) {
this.resourceLoader = resourceLoader; //여기부분에 로직 작성
}
public void print(){
System.out.println(resourceLoader);
}
}
위와 같은 방식으로 구현할 수 있다
하지만!!
@Component
public class ResourceExample{
@Autowired
private ResourceLoader resourceLoader;
public void print(){
System.out.println(resourceLoader);
}
}
위와 같이 implements ResourceLoaderAware를 삭제하고 ResourceLoader에 @Autowired 어노테이션을 사용하면 위의 방식과 똑같이 사용될 수 있으므로 이와 같은 방법으로 구현하면 훨씬 코드가 깔끔하다!!
'Spring' 카테고리의 다른 글
[Spring] WebApplicationInitializer (0) | 2020.06.14 |
---|---|
[Spring] 예제로 보는 Aspect Oriented Programming with Spring (0) | 2020.06.07 |
[Spring] 예제로 보는 Environment Abstraction (0) | 2020.05.27 |
[Spring] 예제로 보는 Java-based Container Configuration (0) | 2020.05.21 |
[Spring] 예제로 보는 Using JSR 330 Standard Annotations (0) | 2020.05.19 |