1.15.3 로우 레벨 리소스에 대한 편리한 접근 by sh

1.15.3. Convenient Access to Low-level Resources

어플리케이션 컨텍스트를 최적으로 사용하고 이해하기 위해서는 Resources 자료에서 설명한대로 스프링의 Resource추상화를 숙지해야 합니다.

응용 프로그램 컨텍스트는 ResourceLoader이며 Resource객체를 로드 하는 데 사용할 수 있습니다. Resource는 본질적으로 JDK java.net.URL클래스의 보다 기능이 풍부한 버전입니다. 사실, Resource의 구현은 적절한 경우java.net.URL인스턴스를 감쌉니다. Resource는 클래스 패스, 파일 시스템 위치, 표준 URL로 설명할 수 있는 위치 및 기타 변형을 포함하여 거의 모든 위치에서 Low-Level의 리소스들을 투명하게 얻을 수 있습니다. 리소스 위치 문자열이 특별한 접두어 없이 간단한 경로인 경우, 해당 리소스는 실제 응용 프로그램 컨텍스트 유형에 따라 적절합니다.

  • ResourceLoader : 리소스를 읽어오는 기능을 제공하는 인터페이스. 즉, Resource 인스턴스를 리턴(즉 로딩) 할 수 있는 객체로 구현된다는 것을 의미한다.

  • ApplicationContext 인터페이스는 이 ResourceLoader 인터페이스를 상속 받은 상태이므로 ApplicationContext를 통해서도 ResourceLoader가 제공하는 메소드를 사용하는 것이 가능하다 .

  • test.txt 를 가져오는 getResource를 통해 Resource 객체를 반환 받음.

  • Resource 인터페이스의 주요 메소드

    • getInputStream() : 리소스의 위치를 찾고 오픈한 뒤 리소스를 읽기 위한 InputStream을 리턴. 호출할 때마다 새로운 InputStream을 리턴.

    • exists() : 해당 리소스가 물리적인 형태로 실제 존재하는 지 체크

    • getDescription() : 리소스로 작업할 때 오류 출력에 사용할 해당 리소스에 대한 설명을 리턴. 이는 때로 정규화된 파일 명이나 리소스의 실제 URL이다.

응용 프로그램 컨텍스트에 배포된 빈을 구성하여 특수 콜백 인터페이스인 ResourceLoaderAware를 구현하면 응용 프로그램 컨텍스트 자체가 theResourceLoader로 전달되면서 초기화 시 자동으로 다시 호출될 수 있습니다. 정적 리소스에 액세스 하는 데 사용되는 Resource 유형의 프로퍼티들을 노출할 수도 있습니다. 그것들은 다른 프로퍼티들처럼 이것 안으로 주입됩니다. 이러한 Resource프로퍼티들을 간단한 String경로로 지정하고 빈이 배포될 때 해당 텍스트 문자열을 실제 Resource객체로 변환하기 위해 특수 JavaBean PropertyEditor(컨텍스트에 의해 자동 등록됨)에 의존할 수 있습니다.

  • ResourceLoaderAware인터페이스 : ResourceLoader 참조와 함께 제공되기를 기대하는 객체를 식별하는 특별한 마커 인터페이스.

    • 클래스가 ResourceLoaderAware를 구현하고 어플리케이션 컨텍스트에 배포했을 때 (스프링이 관리 하는 빈처럼) 이플리케이션 컨텍스트는 클래스를 ResourceLoaderAware로 인식한다. 그 다음 어플리케이션 컨텍스트는 자신을 아규먼트로 전달하면서 setResourceLoader(ResourceLoader)를 호출할 것이다 .

  • 물론 ApplicationContext가 ResourceLoader이기 때문에 빈은 ApplicationContextAware를 구현할 수도 있고 리소스를 로드하려고 제공된 어플리케이션 컨텍스트를 직접 사용할 수도 있다. 하지만, 리소스를 로드 하려는 목적이라면 전용 ResourceLoader를 사용하는 것이 낫다.

ApplicationContext생성자에 제공된 위치 경로는 실제로 리소스 문자열이며, 간단한 형태로 특정 컨텍스트 구현에 따라 적절하게 처리됩니다. 예를 들어, ClassPathXmlApplicationContext는 단순한 위치 경로를 클래스 경로 위치로 취급합니다. 특정 접두어가 있는 위치 경로 (리소스 문자열)를 사용하여 실제 컨텍스트 유형에 관계 없이 클래스 경로 또는 URL에서 정의를 로드 하도록 할 수 있습니다.

  • 특정 어플리케이션 컨텍스트에서 getResource()를 호출하고 지정된 위치 경로가 특정 접두사를 가지지 않았을 때, 특정 어플리케이션 컨텍스트에 적절한 Resource 타입을 얻을 것이다.

    • ClassPathXmlApplicationContext 인스턴스에 대해서 실행하는 아래의 코드.

      • Resource template = ctx.getResource(“some/resource/path/myTemplate.txt”);

      • 리턴 되는 것은 ClassPathResource.

    • FileSystemXmlApplicationContext 인스턴스에 대해서 같은 메서드를 실행했다면, FileSystemResource를 얻을 것.

Last updated