본문 바로가기
Java, Kotlin, Spring/Spring, Spring Boot

Spring - ResourceLoader

by Wordbe 2021. 1. 12.
728x90

ApplicationContext 은 여러가지 클래스를 상속받는다.

그 중 ResourceLoader 를 알아보자.

리소스를 읽어오는 기능을 제공한다.

 

ResourceLoader

Resourceloader 를 통해 resources 폴더 안의 리소스들을 읽을 수 있다.

classpath 는 기본적으로 target/classes 로 되어있다.

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.ApplicationArguments;
import org.springframework.boot.ApplicationRunner;
import org.springframework.core.io.Resource;
import org.springframework.core.io.ResourceLoader;
import org.springframework.stereotype.Component;

import java.nio.file.Files;
import java.nio.file.Path;

@Component
public class AppRunner 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()); // 리소스(파일)가 존재하면 true
        System.out.println(resource.getURI()); // 리소스 위치
        System.out.println(Files.readString(Path.of(resource.getURI()))); // 리소스 안의 내용 읽기 (java 11)
    }
}

리소스는 파일 시스템, 클래스패스, URL, 상대/절대 경로 등 다양한 방법으로 읽어올 수 있다.

 

 


Resource 추상화

다양한 리소스를 읽어올 때는 Resource 클래스를 사용한다. 방법은 다양하다. 클래스패스 기준으로 리소스를 읽어올 수 있으며, ServletContext 기준의 상대 경로로 리소스를 불러올 수 있다.

org.springframework.io.Resource 는

java.net.URL 을 한번 더 감싸서 추상화했다. 스프링 내부에서 많이 사용하는 인터페이스 이다.

 

위에서 적은 코드를 보자.

test.txt 파일은 resources 폴더에 위치하면 된다.

ApplicationContext 를 받아온 리소스로더로부터 getResource() 메소드로 특정 경로의 리소스를 불러올 수 있다.

이렇게 불러온 Resource 는 다양한 메소드를 지원한다. getInputStream(), exist(), isOpen(), getDescrption(), getURI()

또한 다양한 구현체가 있다.

  • UrlResource 는 http, https, ftp, file, jar 프로토콜을 기본으로 지원한다.
  • ClassPathResource 는 접두어 classpath: 를 지원한다.
  • FileSystemResource : 접두어 file:/// 을 지원한다.
  • ServletContextResource 는 웹애플리케이션 루트에서 상대 경로로 리소스를 찾는다. 기본값이다. 가장 많이 사용하는 리소스이다.

 

리소스를 읽어올 때는,

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

ApplicationContext 타입 Resource 타입
ClassPathXmlApplicationContext ClassPathResource
FileSystemXmlApplicationContext FileSystemResource
WebApplicationContext ServletContextResource

 

추가로 ApplicationContext 타입상관없이 문자열( file:///, claspath: )을 조작항 리소스타입을 정할 수 있다.

다시 위 예제를 보면,

ApplicationContext 를 가져와서 getResource() 안에 "test.txt"만 쓰면 기본적으로 ServletContextResource 로 Resource 타입이 잡힌다.

이렇게 되면 상대 경로에 test.txt 파일이 없기 때문에 URI를 가져오지 못한다.

이 때 classpath: 접두어를 앞에 붙여주면 ClassPathResource 로 타입이 지정된다. 따라서 resources 폴더 안에 있는 test.txt 파일의 URI 를 가져오고, 파일을 읽을 수 있게 된다.

 

 

 

728x90

'Java, Kotlin, Spring > Spring, Spring Boot' 카테고리의 다른 글

Spring - 데이터 바인딩  (4) 2021.01.13
Spring - Validation  (4) 2021.01.12
Spring - ApplicationEventPublisher  (4) 2021.01.12
Spring - Messagesource  (2) 2021.01.12
Spring - 프로파일, 프로퍼티  (4) 2021.01.11

댓글