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 를 가져오고, 파일을 읽을 수 있게 된다.
'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 |
댓글