CNU_SW_모각코

16주차 모각코 학습 결과(22.10.18 14:00 ~ 17:00)

nayeonee__ 2022. 10. 25. 10:34

# Section 14.
(1)
자바의 URL 클래스를 이용해 당장은 몇가지 다른 방식으로 제공할 수 있지만, 한계는 존재한다.
자바의 URL 클래스로는 자바 웹 애플리케이션 개발 시 사용되는 서블릿 컨텍스트 경로 나 클라우드 스토리지 서비스에 있는 자원과 같은 것들은 표현할 수 없기 때문이다. 그래서 스프링은 일관된 방식으로 저 수준의 자원에 접근할 수 있는 서비스 추상화를 제 공한다.

(2)

스프링은 파일이나 원격지에 있는 자원에 일관된 방식으로 접근하고 사용할 수 있는 추 상화 인터페이스로 리소스 인터페이스를 제공한다.
스프링은 컨테이너가 사용할 설정 정보 파일을 다루는 것부터 외부 리소스 정보가 필요 할 때는 항상 리소스 추상화 인터페이스를 사용하고 있다.

UrlResource ClassPath, FileSystem, ServletContext InputStream, ByteArray 와 같은 것들을 취득할 수 있다.
리소스 인터페이스를 좀 더 쉽게 활용하기 위해서 리소스 로더 컴포넌트라는 것도 함께 제공하고 있다.

리소스 로더는 간단하게 getResource 라는 메소드를 통해서 주어진 위치에 있는 자원 을 취득할 수 있도록 도와주는 컴포넌트이다.
모든 애플리케이션 컨텍스트는 이 리소스 로더 인터페이스로 구현하고 있다.
그래서 이제 콘텍스트 별로 적합한 리소스 객체를 손쉽게 얻을 수 있도록 제공해준다. 이때 접두어를 이용하면 다른 방식의 리소스도 손쉽게 얻을 수 있다.

접두어로 Classpath 라는 접두어를 주면 클래스 패스 경로 상에 있는 리소스를 얻을 수 있고, file 을 주면 파일 리소스로부터 얻을 수 있고, http 의 경우 http 로부터도 얻을 수 있다.
리소스 인터페이스와 리소스 로더를 이용해서, 즉 스프링의 리소스 추상화를 이용해서 MovieReader 개선

기존에는 자바의 URL 이나, 직접 자바의 URL 객체를 이용해서 Null 이거나 아니거나, 또는 Files, NIO API 를 이용해서 읽을 수 있는 파일인지 아닌지 판단하는 코드를 작 성했는데,
이제는 이 모든 것을 스프링의 리소스 인터페이스를 통해서 확인한다.

 

package moviebuddy.data;

import moviebuddy.ApplicationException;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Value; import org.springframework.context.ResourceLoaderAware; import org.springframework.core.io.Resource;

import org.springframework.core.io.ResourceLoader;

import javax.annotation.PostConstruct; import javax.annotation.PreDestroy; import java.io.FileNotFoundException; import java.net.URL;

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

import java.util.Objects;
public abstract class AbstractFileSystemMovieReader implements

ResourceLoaderAware {

private final Logger log = LoggerFactory.getLogger(getClass()); private String metadata;
private ResourceLoader resourceLoader;

public String getMetadata() { return metadata;

}

@Value("${movie.metadata}")
public void setMetadata(String metadata) {

this.metadata = metadata; }

public URL getMetadataUrl(){
String location = getMetadata(); if(location.startsWith("file:")){

// file URL 처리
}else if(location.startsWith("http:")){

//http URL 처리 }

return ClassLoader.getSystemResource(location); }

@Override
public void setResourceLoader(ResourceLoader resourceLoader) {

this.resourceLoader = resourceLoader; }

public Resource getMetadataResource(){
return resourceLoader.getResource(getMetadata());

}

@PostConstruct // 메타데이터의 빈이 초기화될 때 메타데이터가 올바른 값인지를 검증해 주는 코드

public void afterPropertiesSet() throws Exception {
// ClassLoader.getSystemResource() 클래스패스 상의 자원만 처리할 수 있

다.
// 애플리케이션 외부인 file:, http:, ftp: 등의 다른 프로토콜을 이용해야 한다

면 이런 방식으로 네트워크 상의 파일을 읽어야 한다면 프로토콜에 따라서 URL 객체를 다루기 위한 방식이 변경이 되어야 한다.

Resource resource = getMetadataResource(); if (resource.exists() == false) {

throw new FileNotFoundException(metadata); }

if (resource.isReadable() == false) {
throw new ApplicationException(String.format("cannot read to

metadata. [%s]", metadata)); }

log.info(resource + "is ready.");

}



@PreDestroy
public void destroy() throws Exception {

log.info("Destoryed bean");

}

}