반응형
ResourceLoader
리소스를 읽어오는 기능을 제공하는 인터페이스로, applicationContext가 상속받고 있다.
public interface ApplicationContext extends EnvironmentCapable, ListableBeanFactory, HierarchicalBeanFactory, MessageSource, ApplicationEventPublisher, ResourcePatternResolver {
...
}
public interface ResourcePatternResolver extends ResourceLoader {
String CLASSPATH_ALL_URL_PREFIX = "classpath*:";
Resource[] getResources(String var1) throws IOException;
}
리소스 읽어오기
- 파일 시스템에서 읽어오기
- 클래스패스에서 읽어오기
- URL로 읽어오기
- 상대/절대 경로로 읽어오기
classPath기준으로 리소스를 찾게됨
@Component
public class ResourceAppRunner implements ApplicationRunner {
@Autowired
ResourceLoader resourceLoader;
@Override
public void run(ApplicationArguments args) throws Exception {
Resource resource = resourceLoader.getResource("classpath:test.txt");
System.out.println(resource.exists());
}
}
Resource 추상화
org.springframework.core.io.Resource
특징
- java.net.URL을 추상화한 것
- 스프링 내부에서 많이 사용하는 인터페이스
추상화 이유
- 클래스패스 기준으로 리소스 읽어오는 기능 부재
- ServletContext를 기준으로 상대 경로로 읽어오는 기능 부재
- 새로운 핸들러를 등록하여 특별한 URL 접미사를 만들어 사용할 수는 있지만 구현이 복잡하고 편의성 메소드가 부족하다.
구현체
- UrlResource : 기본으로 지원하는 프로토콜 http, https, ftp, file, jar.
- ClassPathResource : 지원하는 접두어 classpath:
- FileSystemResource
- ServletContextResource : 웹 애플리케이션 루트에서 상대경로로 리소스를 찾는다.
...
리소스 읽어오기
- Resource의 타입은 location 문자열과 ApplicationContext의 타입에 따라 결정된다.
- ClassPathXmlApplicationContext ⇒ ClassPathResource
- FileSystemXmlApplicationContext ⇒ FileSystemResource
- WebApplicationContext ⇒ ServletContextResource
- ApplicationContext의 타입에 상관없이 리소스 타입을 강제하려면 java.net.URL 접두어(+classpath:) 중 하나를 사용할 수 있음
- classpath:me/corn/config.xml ⇒ ClassPathResource
- file://some/resource/path/config.xml ⇒ FileSystemResource
우리는 보통 WebApplication을 개발하기 때문에, applicactionContext를 주입받아서 그냥 Resource를 꺼내오게 되면, ServletContextResource를 사용하게 된다. (즉, 웹 애플리케이션 루트경로에서 시작해서 리소스를 찾는다.) 만약, classpath에 있는 리소스를 찾길 원한다면 Resource를 꺼내올때 접두어(classpath:)를 붙여줘야한다.
@Component
public class ResourceAppRunner implements ApplicationRunner {
@Autowired
ResourceLoader resourceLoader;
@Override
public void run(ApplicationArguments args) throws Exception {
System.out.println("== resources ==");
System.out.println(resourceLoader.getClass());
Resource servletContextResource = resourceLoader.getResource("test.txt");
System.out.println(servletContextResource.getClass());
Resource classPathResource = resourceLoader.getResource("classpath:test.txt");
System.out.println(classPathResource.getClass());
System.out.println("== resources ==");
}
}
== resources ==
class org.springframework.boot.web.servlet.context.AnnotationConfigServletWebServerApplicationContext // 웹 애플리케이션 컨텍스트
class org.springframework.web.context.support.ServletContextResource // 웹 애플리케이션 컨텍스트이므로 기본 SerlvetContextResource
class org.springframework.core.io.ClassPathResource // classpath: 접두어를 붙여서 사용하였으므로, ClassPathResource 사용
== resources ==
출처 : 백기선님의 스프링 프레임워크 핵심 기술 강좌
반응형
'프로그래밍 노트 > SPRING' 카테고리의 다른 글
[Spring] 데이터 바인딩 - PropertyEditor (0) | 2020.03.25 |
---|---|
[Spring] Validation 추상화 (0) | 2020.03.24 |
[Spring] MessageSource (0) | 2020.03.16 |
[Spring] Environment 프로파일/프로퍼티 (0) | 2020.03.11 |
[Spring] 모델 바인딩과 검증_3(Validator, BindingResult, Errors) (0) | 2020.01.06 |