Spring

[Spring] 예제로 보는 Resources

KEMON 2020. 5. 29. 01:19
728x90

1. The Resource Interface 

Spring의 Resource 인터페이스는 Resource에 대한 접근을 추상화하기 위한 인터페이스이다.

public interface Resource extends InputStreamSource {
    //리소스가 있는지 없는지 확인
    boolean exists(); 

	//Stream이 열렸는지 체크
    boolean isOpen(); 

	//해당 리소스의 url을 가져온다
    URL getURL() throws IOException; 

	//해당 리소스의 파일을 가져온다
    File getFile() throws IOException; 

	//상대 경로를 통해서 다른 리소스를 가져옴
    Resource createRelative(String relativePath) throws IOException; 

	//파일 이름을 가져온다
    String getFilename(); 

	//설명을 가져온다
    String getDescription(); 
}

위의 인터페이스 정의 중 exists() , getFile(), createRelative(String relativePath)를 주로 사용한다.

 

2. Built-in Resource Implementations

Spring은 다음과 같은 Resource 구현체를 포함한다.

  • UrlResource                                     
  • ClassPathResource
  • FileSystemResource
  • ServletContextResource
  • InputStreamResource
  • ByteArrayResource

보통 Resource Interface를 통해 직접 프로그래밍 하기 보다는 스프링부트에서 사용하는 특정 관례(ResourceLoader에서 사용됨)에 따라서 특정 파일을 읽어들일 때에 Resource Interface를 사용한다.

 

① UrlResource 

    file:  http: 이런식의 Prefix로 프로토콜을 명시해주고 해당 리소스의 위치를 알려주는 URL방식을 통해서 리소스의 위치를 알려주는 방식

Resource resource = new UrlResource("file:{절대경로}");

② ClassPathResource

    Class Loader를 통해서 ClassPath에서 리소스를 찾는 방식

ClassPathResource resource = new ClassPathResource("dao.xml");

③ FileSystemResource

    절대경로라던지 파일시스템에서 리소스를 찾는 방식 (거의 사용 X)

Resource resource = new FileSystemResource({절대경로});

④ ServletContextResource

    웹 프로젝트에서 사용되는데 Spring Core에서는 다루지 않겠음

⑤ InputStreamResource

    inputStream을 넣어주고 사용하는 리소스 (보통 파일을 읽어들일 때 사용)

⑥ ByteArrayResource

    byteArray를 넣어주고 사용하는 리소스 (보통 파일을 쓸 때 사용)

 

※String 객체를 Resource 객체로 변환하는 방법

prefix Example

  • classpath:com/myapp/config.xml        :       classpath로부터 경로에 있는 리소스를 가져옴 (ClassPathResource 인터페이스)
  • file:///data/config.xml                          :       절대경로를 통해 FileSystem으로 부터 리소스를 가져옴 (FileUrlResource 인터페이스)
  • http://myserver/logo.png                    :        외부에 있는 데이터를 가져올 때 사용 (UrlResource 인터페이스)

Resource를 왜 사용하는가 ?

Resource라는 인터페이스를 사용함으로써 일괄된 프로그래밍 메소드를 사용하며 코딩할 수 있다.

하지만, 

실제로 리소스를 구현하는것 보다 ResourceLoader를 사용한다.

ClassPathXmlApplicationContext가 상속 받는 것들을 따라 들어가다보면 implements ResourceLoader를 확인할 수 있다.

3. ResourceLoaderAware

ResourceLoaderAware 인터페이스는 ResourceLoader 참조가 될 Components를 식별하는 콜백  인터페이스이다.

public class Main {
    public static void main(String[] args) throws IOException {
    AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext();
       context.register(ResourceExample.class);
       context.refresh();
       ResourceExample re = context.getBean(ResourceExample.class);
       re.print();
       context.close();
    }
}
@Component
public class ResourceExample implements ResourceLoaderAware {

    private ResourceLoader resourceLoader;

	@Override
    public void setResourceLoader(ResourceLoader resourceLoader) {
        this.resourceLoader = resourceLoader; //여기부분에 로직 작성
    }
    public void print(){
        System.out.println(resourceLoader);
    }
}

위와 같은 방식으로 구현할 수 있다

하지만!!

@Component
public class ResourceExample{

    @Autowired
    private ResourceLoader resourceLoader;

    public void print(){
        System.out.println(resourceLoader);
    }
}

위와 같이 implements ResourceLoaderAware를 삭제하고 ResourceLoader에 @Autowired 어노테이션을 사용하면 위의 방식과 똑같이 사용될 수 있으므로 이와 같은 방법으로 구현하면 훨씬 코드가 깔끔하다!!

728x90