# 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");
}
}
'CNU_SW_모각코' 카테고리의 다른 글
17주차 모각코 학습 결과(22.10.27 13:00 ~ 16:00) (0) | 2022.10.31 |
---|---|
17주차 모각코 학습 목표(22.10.27 13:00 ~ 16:00) (0) | 2022.10.31 |
16주차 모각코 학습 목표(22.10.18 14:00 ~ 17:00) (0) | 2022.10.25 |
15주차 모각코 학습 결과(22.10.12 14:00 ~ 17:00) (0) | 2022.10.25 |
15주차 모각코 학습 목표(22.10.12 14:00 ~ 17:00) (0) | 2022.10.25 |