[Spring] 스프링 Resource 추상화( Spring Resource Abstraction )

2021. 1. 15. 01:20 Spring Framework/Spring 입문 - 개념 및 핵심

| 스프링 Resource 추상화

 

스프링의 Resource 객체는 java.net.URL을 추상화한 인터페이스다. Resource 객체는 스프링 내부에서 가장 많이 사용하는 인터페이스이며 스프링 IoC 컨테이너가 생성될 때, 컨테이너 설정 정보를 담는 파일들을 가져올 때도 사용된다. 

 

리소스를 읽어오는 기능을 Resource 인터페이스를 통해 추상화한 이유는 다음과 같다.

 

1. 클래스 패스 기준으로 리소스 읽어오는 기능 부재

2. ServletContext를 기준으로 상대 경로로 읽어오는 기능 부재

3. 새로운 핸들러를 만들어 사용할 수 있지만 기능이 복잡하고 편리하지 않다.

 

 

| Resource 인터페이스 구현체

 

Resource 인터페이스를 구현한 구현체들의 목록은 다음과 같다.

 

1. UrlResource : URL을 기준으로 리소스를 읽어들임 지원하는 프로토콜은 http, https, ftp, file, jar

2. ClassPathResource : 지원하는 접두어가 classpath: 일 때, 클래스패스를 기준으로 리소스를 읽어들인다.

3. FileSystemResource : 파일 시스템을 기준으로 읽는다.

4. ServletContextResource : 웹 어플리케이션 루트에서 상대 경로로 리소스를 찾는다.

 

참고로 스프링 부트에서는 ApplicationContext 인터페이스에 @Autowired 같은 어노테이션으로 자동주입할 경우 ServletContextResource를 통해 리소스를 읽는 AnnotationConfigServletWebServerApplicationContext 컨텍스트 객체가 주입된다.

 

 

| Resource 읽어오기

 

Resource의 타입은 location 문자열과 ApplicationContext 타입에 따라 결정된다. 

 

- ClassPathXmlApplicationContext => ClassPathResource

- FileSystemXmlApplicationContext => FileSystemResource

- WebApplicationContext => ServletContextResource

 

만약 ApplicationContext에 주입되는 컨텍스트 빈에 관련없이 리소스 타입을 강제하려면 java.net.URL 접두어 중 하나를 사용할 수 있다.

 

- classpath:com/saelobi/springtutorial/config.xml => ClassPathResource

- file:///some/resource/path/config.xml => FileSystemResource

 

아래는 위의 내용을 참고로 ApplicationContext가 처음에 어떻게 설정되어 있는지 알아내고, 그 뒤 접두어로 Resource 구현체를 강제하는 것을 나타내는 코드다.

 

@Component
public class AppRunner implements ApplicationRunner {

    @Autowired
    ApplicationContext resourceLoader;

    @Override
    public void run(ApplicationArguments args) throws Exception {
        System.out.println(resourceLoader.getClass());

        Resource resource = resourceLoader.getResource("classpath:test.txt");
        System.out.println(resource.getClass());

        System.out.println(resource.exists());
        System.out.println(resource.getDescription());
        System.out.println(resource.getURI().getPath());
    }
}
class org.springframework.boot.web.servlet.context.AnnotationConfigServletWebServerApplicationContext
class org.springframework.core.io.ClassPathResource
true
class path resource [test.txt]
/C:/Users/user/spring/spring-tutorial/target/classes/test.txt



출처: https://engkimbs.tistory.com/724?category=767795 [새로비]