티스토리 뷰
Spring - ResourceLoader
ResourceLoader
- ResourceLoader는 리소스를 읽어오는 기능을 제공하는 Interface
- 리소스를 읽어 Resource Type 객체를 반환한다.
- Spring 을 사용한다면 @Autowired를 통하여 의존성 주입을 받아 바로 사용할 수 있다.
- ApplicationContext는 ResourceLoader를 구현하고 있기때문에 ApplicationContext로도 ResourceLoader의 기능을 사용할 수 있다.
-
ResourceLoader를 우리가 Bean으로 등록하지 않았는데 대체 어떻게 사용할수 있는것일까 ?
-
테스트 코드
- 결과
-
ApplicationContext는 ResourceLoader를 구현하고 있기때문에 ResourceLoader Type으로 주입 받아 사용할 수 있는것이다.
-
앞서 ResourceLoader는 Resource Type 객체를 반환한다고 했다. 그렇다면 Resource 란 대체무엇일까
Resource Interface
- 스프링의 Resource 인터페이스는 저수준 리소스 접근을 추상화한 더 기능이 많은 인터페이스이다.
- 주요 메서드
- getInputStream(): 리소스의 위치를 찾고 오픈한뒤 리소스를 읽기위한 InputStream을 Return, 호출시마다 새로운 객체를 Return 스트림을 닫는것은 호출한 쪽에 책임이 있다.
- exists(): 해당 리소스가 존재하는지 논리값을 Return
- isOpen(): 해동 리소스가 오픈 스트림을 가진 하나의 핸들을 나타내는지 논리값을 Return, true일경우 'InputStream은 여러번 읽을수 없고 반드시 한번만 읽은뒤 닫아주어야 한다.' InputStreamResource 예외를 가진 일반적인 리소스 구현체에서는 false
- getDescription(): 해당 리소스에 대한 설명을 Return, 정규화된 파일명이나, 리소스의 실제 URL이다.
- Resource 구현체
-
- UrlResource
- java.net.URL을 Wrapping 하고 일반적으로 URL로 접근할수 있는 파일, HTTP, FTP등 과 같은 객체에 접근시 사용한다.
- UrlResource
-
- ClassPathResource
- 클래스패스에서 얻어와야하는 리소스를 나타낸다.
- Thread Context Loader, ClassLoader , Class Load시 주어진 클래스를 모두 사용한다.
- 파일시스템에 존재하면 java.io.File과 같은 해결책을 지원하지만 jar에 존재하는 클래스패스 리소스는 지원하지않으며 파일시스템으로 확장하지도 않는다.
- ClassPathResource
-
- FileSystemResource
- java.io.File 핸들에 대한 구현체이다.
- FileSystemResource
-
- ServletContextResource
- 웹 어플리케이션 루트 경로내에서 상대경로를 인터프리팅하는 ServletContext 리소스에대한 구현체이다.
- ServletContextResource
-
- InputStreamResource
- InputStream에 대한 구현체이다. 적용가능한 특정 Resource 구현체가 없을때만 사용 가능하다.
- ByteArrayResource 나 파일 기반 Resource구현체가 가능한 곳에서 선호한다.
- 다른 구현체와 달리 이미 오픈된 Resource에 대한 디스크립터이다.
- 즉 isOpen() 은 true를 리턴한다.
- InputStreamResource
-
- ByteArrayResource
- Byte 배열에 대한 구현체이다.
- 주어진 바이트배열에서 컨텐츠 로드시 유용하다.
- ByteArrayResource
-
ResourceLoaderAware Interface
-
ResourceLoaderAware 인터페이스는 ResourceLoader 참조와 함께 제공되기를 기대하는 객체를 식별하는 특별한 마커(marker) 인터페이스이다.
-
이를 구현하는 Class가 ApplicationContext에 Bean으로 등록 되었을때 ApplicationContext는 해당 클래스를 ResourceLoaderAware로 인식한다.
-
그런 다음 자신을 Argument로 setResourceLoader 메서드를 호출해 의존성을 주입한다.
-
ResourceLoaderAware를 사용하는 이유 ?
- ApplicationContext가 ResourceLoader를 구현하고있기때문에 ApplicationContext를 직접 사용해도 된다.
- 하지만 리소스를 로드하는 목적이라면 리소스 로드용 ResourceLoader를 사용하는 편이 낫다.
'Spring' 카테고리의 다른 글
Spring - MVC @ResponseBody_ResponseEntity (0) | 2019.07.31 |
---|---|
Spring - MVC FileDownload (0) | 2019.07.30 |
Spring - MVC MultipartFile (0) | 2019.07.29 |
Spring - MVC RedirectAttributes (0) | 2019.07.29 |
Spring - MVC @SessionAttribute (0) | 2019.07.28 |
댓글