Resource 추상화
- Spring은 java.net.URL을 org.springframework.core.io.Resource로 감싸서 추상화한 클래스이다.
- 스프링 내부에서 많이 사용하는 인터페이스이다
추상화 한 이유
- java.net.URL 이 기본적으로 여러 prefix를 지원하는 프로토콜은 http,https, ftp, file, jar이지만 classpath 기준으로 리소스를 읽어오는 기능이 없다.
- ServletContext를 기준으로 상대 경로로 읽어오는 기능이 없다.
- 새로운 핸들러를 등록하여 특별한 URL 접미사를 만들어 사용할 수는 있지만 구현이 복잡하고 편의성 메소드가 부족하다.
ApplicationContext
- 스프링의 핵심 인터페이스:
- 단순히 빈 팩토리로서의 역할뿐만 아니라, 리소스 로딩 기능을 포함하여 다양한 애플리케이션 설정 기능을 제공.
- 리소스 로딩 기능:
- ApplicationContext의 타입에 따라 로딩 방식과 해석 방식이 달라진다.
- 리소스 로딩은 Resource 인터페이스를 기반으로 하며, 다양한 구현체가 존재한다.
리소스 로딩 방식
- 경로와 컨텍스트 타입에 따라 리소스 구현체(ClassPathResource, ServletContextResource, URLResource)가 결정됨.
- 명시적인 접두어(classpath:, file:)를 사용하면 더 명확하게 리소스를 로드 가능.
@Component
public class ResourceAppRunner implements ApplicationRunner {
@Autowired
ResourceLoader resourceLoader;
@Override
public void run(ApplicationArguments args) throws Exception {
System.out.println("== resources ==");
// ResourceLoader의 실제 구현 클래스 출력
System.out.println(resourceLoader.getClass());
// 기본 리소스 로딩 (ServletContextResource)
Resource servletContextResource = resourceLoader.getResource("test.txt");
System.out.println(servletContextResource.getClass());
// classpath 접두어를 사용한 리소스 로딩 (ClassPathResource)
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
class org.springframework.core.io.ClassPathResource
== resources ==
WebApplicationContext를 리소스 로더로 사용하고, 명시적인 접두어가 없는 리소스 경로를 사용할 경우, 기본적으로 해당 경로는 ServletContextResource로 resolving 된다.
WebApplicationContext
는ApplicationContext
의 하위 인터페이스로, 웹 애플리케이션 환경에 특화된 컨텍스트이다.WebApplicationContext
는 리소스를 로드할 때, 명시적인 접두어가 없는 경로에 대해 기본적으로 서블릿 컨텍스트의 루트(ServletContext)를 기준으로 경로를 해석한다.- 이때, 리소스 타입은
ServletContextResource
로 결정됩니다.
참고로, ResourceLoader의 구현체가 ApplicationContext이기 때문에, resourceLoader의 타입을 ApplicationContext로 변경해도 동작과 결과는 동일하다.
'Programming > Spring' 카테고리의 다른 글
ApplicationEventPublisher (0) | 2024.12.13 |
---|---|
@Component와 @Bean (0) | 2024.12.12 |
Autowired (0) | 2024.12.11 |
ApplicationContext 2가지 빈 설정 방식 (0) | 2024.12.11 |
RequestBody 자바 객체 매핑 (0) | 2024.12.11 |