[Spring] 스프링에서 리소스에 접근하는 방법

2025. 3. 14. 05:32·개발/Spring

리소스(Resource)는 소프트웨어 애플리케이션이나 시스템이 작동하는 데 필요한 모든 자원 또는 데이터를 의미한다.

스프링 리소스 (Resource)

스프링 프레임워크에서 "리소스"는 애플리케이션에서 필요로 하는 다양한 종류의 정적 자원을 추상화한 인터페이스 이다. 쉽게 말해, 파일, 클래스패스, URL 등으로부터 데이터를 읽어오는 방식을 통일하여 편리하게 자원을 관리할 수 있도록 돕는 역할 한다.

리소스 인터페이스 (org.springframework.core.io.Resource)

Resource 인터페이스는 다음과 같은 주요 메서드를 제공.

  • getInputStream(): 리소스의 내용을 읽어오는 InputStream을 반환.
  • exists(): 리소스가 물리적으로 존재하는지 확인.
  • isOpen(): 리소스가 현재 열려있는 스트림을 나타내는지 확인 (일반적으로 여러 번 읽을 수 없는 경우).
  • getDescription(): 리소스에 대한 설명 (예: 파일 경로, URL)을 반환.
  • getFile(): 리소스가 파일 시스템에 존재할 경우 File 객체를 반환 (항상 가능한 것은 아님).
  • getURL(): 리소스가 URL로 표현될 수 있으면 URL 객체를 반환.
  • createRelative(String relativePath): 현재 리소스를 기준으로 상대 경로에 있는 새로운 Resource를 생성.

리소스의 종류 (구현체)

스프링은 다양한 리소스 타입을 지원하기 위해 Resource 인터페이스의 여러 구현체를 제공.

  • UrlResource: java.net.URL을 기반으로 하는 리소스 (예: http://, ftp:// 등으로 시작하는 URL).
  • ClassPathResource: 클래스패스에서 자원을 찾습니다. classpath: 접두어를 사용하거나, 접두어 없이 상대 경로를 사용할 수 있다.

 

Java
 
Resource resource = new ClassPathResource("config/application.properties"); // 클래스패스 루트의 config/application.properties
Resource resource2 = new ClassPathResource("application.properties", MyClass.class); // MyClass와 같은 패키지의 application.properties

 

  • FileSystemResource: 파일 시스템의 파일을 나타냄. 절대 경로 또는 상대 경로를 사용할 수 있다.
Java
 
Resource resource = new FileSystemResource("/path/to/file.txt");
Resource resource2 = new FileSystemResource("relative/path/to/file.txt"); // 현재 작업 디렉토리 기준

 

  • ServletContextResource: 웹 애플리케이션 컨텍스트 (루트 디렉토리) 내의 리소스를 나타냄.
  • InputStreamResource: 주어진 InputStream을 리소스로 사용.
  • ByteArrayResource: 바이트 배열 (byte[])을 리소스로 사용.

리소스 로더 (ResourceLoader)

ResourceLoader 인터페이스는 리소스의 위치 (문자열)를 기반으로 Resource 인스턴스를 가져오는 기능을 제공.

Java
 
public interface ResourceLoader {
    Resource getResource(String location);

    ClassLoader getClassLoader();
}

 

  • getResource(String location): 주어진 위치(location) 문자열에 해당하는 Resource 객체를 반환합니다.
  • getClassLoader(): 리소스를 로드하는 데 사용되는 ClassLoader를 반환합니다.

ApplicationContext는 ResourceLoader 인터페이스를 구현하므로, 애플리케이션 컨텍스트 자체가 리소스 로더 역할을 합니다.

Java
 
@Autowired
private ResourceLoader resourceLoader;

public void loadResource(String location) {
    Resource resource = resourceLoader.getResource(location);
    // resource를 이용한 작업 수행
}

location 문자열에는 다음과 같은 접두어를 사용할 수 있다:

  • classpath:: 클래스패스에서 리소스를 찾는다.
  • file:: 파일 시스템에서 리소스를 찾는다.
  • http://, https://, ftp://: URL을 통해 리소스를 찾는다.
  • 접두어 없음: 컨텍스트에 따라 다르게 해석될 수 있다 (예: ApplicationContext의 종류에 따라).

리소스 활용 예시

  • 프로퍼티 파일 로드:
Java
 
@Value("classpath:config/application.properties")
private Resource applicationProperties;

// applicationProperties.getInputStream() 등을 통해 파일 내용 접근

 

  • 파일 업로드/다운로드:
Java
 
//업로드 예시
public void handleFileUpload(MultipartFile file) {
	Resource resource = file.getResource();
  //resource를 이용해서 저장 로직 구현
}

//다운로드 예시, Resource를 ResponseEntity에 담아 반환
public ResponseEntity<Resource> downloadFile(String filename) {
    Resource resource = new FileSystemResource("/path/to/files/" + filename);

    if (resource.exists()) {
      return ResponseEntity.ok()
        .header(HttpHeaders.CONTENT_DISPOSITION, "attachment; filename=\"" + resource.getFilename() + "\"")
        .body(resource);
   } else {
      return ResponseEntity.notFound().build();
    }
}

 

  • XML 설정 파일 로드:
Java
 
 ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");

 

장점

  • 추상화: 리소스의 실제 위치 (파일 시스템, 클래스패스, URL 등)에 관계없이 동일한 방식으로 리소스에 접근할 수 있다.
  • 유연성: 다양한 종류의 리소스를 지원하며, 애플리케이션의 요구사항에 맞게 리소스 로딩 전략을 변경할 수 있다.
  • 테스트 용이성: 리소스 로딩을 추상화함으로써 단위 테스트에서 실제 파일 시스템이나 네트워크에 의존하지 않고도 리소스를 모킹(mocking)할 수 있다.
  • 코드 간결성: Resource와 ResourceLoader를 사용하면 리소스를 직접 다루는 코드를 줄여 가독성을 높일 수 있다.
  • 일관성: 스프링의 다른 기능들(예: @Value, @PropertySource)과 자연스럽게 통합되어 리소스 관리를 일관된 방식으로 처리할 수 있다.

 

저작자표시 비영리 변경금지 (새창열림)

'개발 > Spring' 카테고리의 다른 글

[Spring] webapp 루트 디렉토리 리소스 사용하기  (0) 2025.03.14
[Spring] 리소스 접두어  (0) 2025.03.14
[Spring] 스프링 빈 주입 방법  (0) 2025.03.13
[Spring] 의존성 주입 어노테이션  (0) 2025.03.13
[Spring] 스프링 빈의 라이프 사이클  (0) 2025.01.23
'개발/Spring' 카테고리의 다른 글
  • [Spring] webapp 루트 디렉토리 리소스 사용하기
  • [Spring] 리소스 접두어
  • [Spring] 스프링 빈 주입 방법
  • [Spring] 의존성 주입 어노테이션
함수형 인간
함수형 인간
잘 까먹는 개발자의 두뇌 확장 장치
  • 함수형 인간
    개발 기록 노트
    함수형 인간
  • 글쓰기 관리
  • 전체
    오늘
    어제
    • 글 목록 (84)
      • 기타 (1)
      • 개발 (82)
        • Java (6)
        • Javascript (1)
        • Spring (20)
        • jQuery (0)
        • Git (0)
        • servlet (11)
        • JSP (6)
        • HTML (0)
        • CSS (10)
        • SQL (9)
        • JSTL (3)
        • Mybatis (4)
        • Design Patterns (0)
        • HTTP (2)
        • Devtools (0)
        • IntelliJ (5)
        • JDBC (1)
        • Lombok (3)
        • Logging (1)
      • 책 리뷰 (0)
  • hELLO· Designed By정상우.v4.10.3
함수형 인간
[Spring] 스프링에서 리소스에 접근하는 방법
상단으로

티스토리툴바