스프링 핵심 기술-09.Resource 추상화
Resource 추상화
java.net.URL 클래스를 추상화 한 것 (스프링 내부에서 많이 사용하는 인터페이스)
= org.springframework.core.io.Resource 클래스로 java.net.URL 클래스를 감싼 것.
감싸서 실제 low level에 있는 리소스에 접근하는 기능을 만든 것입니다.
추상화 한 이유?
기존 클래스(java.net.URL)가 클래스패스 기준으로 리소스 읽어오는 기능 부재
http ftp https httpx 등 지원하긴 하지만,
스프링 입장에서는 클래스패스를 가져오는 기능, 어차피 동일하게 리소스를 가져오는 기능이니까 추상화시켜 방법을 통일을 시킨 것ServletContext를 기준으로 상대 경로로 읽어오는 기능 부재
새로운 핸들러를 등록하여 특별한 URL 접미사를 만들어 사용할 수는 있지만 구현이 복잡하고 편의성 메소드가 부족하다.
Resource
앞서 말했든 Resource는 굉장히 자주 쓰는 인터페이스.
예를 들면
ClassPathXmlApplicationContext ctx = new ClassPathXmlApplicationContext("application.properties.xml")
// "application.properties.xml" 이 내부적으로 리소스의 문자열로 변환된다.
// "classpath:application.properties.xml"의 리소스 문자열
Resource resource = resourceLoader.getResource("classpath:application.properties.xml");
첫줄의 “application.properties.xml” 이 문자열이 내부적으로는 리소스의 문자열로 변환되며,
“classpath:application.properties.xml” 의 리소스 문자열이라고 보면 된다.
주요 메소드
- getInputStream()
- exitst()
- isOpen()
- getDescription(): 전체 경로 포함한 파일 이름 또는 실제 URL
구현체
-UrlResource: java.net.URL 참고, 기본으로 지원하는 프로토콜 http, https, ftp, file, jar.
(java.net.URL)
참조 : https://docs.oracle.com/javase/7/docs/api/java/net/URL.html
- ClassPathResource : 지원하는 접두어 classpath:
- FileSystemResource
- ServletContextResource : 웹 애플리케이션 루트에서 상대 경로로 리소스 찾는다. (사실상 가장 많이 사용)
리소스 읽어오기 및 리소스
-Resource의 타입은 locaion 문자열과 ApplicationContext의 타입에 따라 결정 된다.
ClassPathXmlApplicationContext -> ClassPathResource
FileSystemXmlApplicationContext -> FileSystemResource
WebApplicationContext -> ServletContextResource
ex.
new FileSystemXmlApplicationContext("test.txt"); // -> ClassPathResource
new ClassPathXmlApplicationContext("test.txt"); // -> FileSystemResource
- ApplicationContext의 타입에 상관없이 리소스 타입을 강제하려면 java.net.URL 접두어(+ classpath:)중 하나를 사용할 수 있다.
classpath:me/whiteship/config.xml -> ClassPathResource
file:///some/resource/path/config.xml -> FileSystemResource
ex.
System.out.println(resourceLoader.getClass()); // AnnotationConfigServletWebServerApplicationContext
//Resource resource = resourceLoader.getResource("test.txt");
// ServletContextResource
Resource resource = resourceLoader.getResource("classpath:test.txt");
// ClassPathResource
//Resource resource = resourceLoader.getResource("file:///test.txt");
// FileUrlResource
System.out.println(resource.getClass());
이게 어디서 오는 파일인지 명시적으로 써 주는게 좋다.
(과거 버전 추정)
추가적으로 와일드카드(*)도 사용 가능하다.
/WEB-INF/*-context.xml
com/example//applitionContext.xml
file:C:/some/path/*-context.xml
classpath:com/example//application.xml
공식 레퍼런스 업데이트 (2019-12-07 기준)
==== Ant-style Patterns
Path locations can contain Ant-style patterns, as the following example shows:
/WEB-INF/-context.xml
com/mycompany//applicationContext.xml
file:C:/some/path/-context.xml
classpath:com/mycompany//applicationContext.xml
더 깊은 내용은 공식 문서 참조
https://docs.spring.io/spring/docs/current/spring-framework-reference/core.html#beans-dependencies