[미션2] 영화 메타데이터 위치를 변경 가능
외부에서 메타데이터 위치를 주입할 수 있도록 CsvMovierReader와 XmlMovieReader에 설정자를 추가하고 초기화 과정에서 읽을 수 있는 메타데이터인지 검증하는 기능을 추가했다.
그러나 아직 개선의 여지가 있다. 메타데이터 위치를 변경하려면 결국 MovieBuddyFactory
코드를 변경해야 한다.
코드를 변경하지않고 위치를 변경하려면 어떻게 해야 할까?
getProperty
애플리케이션 외부에서 설정정보를 읽어, 메타데이터 위치를 설정하게 한다.
System의 getProperty
함수를 사용해 OS의 환경변수나 VM의 아규먼트를 읽을 수 있다.
1. MovieBuddyFactor 코드 수정
movieReader.setMetadata(System.getProperty("movie.metadata"));
MovieBuddyFactory의 CsvMovieReader와 XmlMovieReader 에서 movierReader.setMetadata안의 인자를 위와 같이 바꾼다.
2. VM 아큐먼트 설정
RunConfigurations
에 들어가 Junit의 MovieFinderTest
에 다음과 같이 VM argument를 추가한다.
MovieFinderTest
를 실행하면 잘 동작하는 것을 볼 수 있다.
Properties load test
- src -> test -> java에 resources 폴더 생성
- 패키지 익스플로러에서 메인 폴더(루트) 우클릭 후 Gradle- > Refresh Gradle Project를 통해 프로젝트 갱신
- 생성한 resources에 config.properties라는 파일 생성
- config.properties에
name=hongo
라고 작성 -
src -> test -> java아래에 클래스
PropertiesTests
생성 PropertiesTests
안에 다음과 같이 작성
package moviebuddy;
import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Paths;
import java.util.Properties;
import org.junit.jupiter.api.Assertions;
import org.junit.jupiter.api.Test;
public class PropertiesTests {
@Test
void Load_PropertiesFile() throws IOException {
Properties config = new Properties();
config.load(Files.newInputStream(Paths.get("./src/test/resources/config.properties")));
Assertions.assertEquals(1, config.size());
Assertions.assertEquals("hongo", config.get("name"));
}
}
- 실행을 하면 config.properties의 값을 잘 받아오는 것을 알 수 있다.
Environment 인터페이스
그러나 위처럼 우리가 설정해줄 필요없이 설정 정보를 읽을 수 있는 방법이 있다.
스프링에는 외부 설정 파일이나 앞서 사용했던 VM 아규먼트와 같이 시스템 환경 변수나 그 외에도 다양한 방식으로 부터 일관된 방식으로 환경 정보를 읽을 수 있는 런타임 환경 서비스 추상화인 Environment 인터페이스
가 존재한다.
DataSourceModuleConfig
클래스 내부에 Environment 생성
private final Environment environment;
public DataSourceModuleConfig(Environment environment) {
this.environment = environment;
}
스프링에 의해 자동으로 의존성 주입이 일어난다.
- movieReader.setMetadata(System.getProperty("movie.metadata")); 코드에서 System을 enviroment로 변경한다.
이처럼 Environment인터페이스를 사용해 인터페이스가 제공하는 getProperty
메소드를 통해 외부의 설정 정보를 읽어서 메타데이터의 위치를 설정할 수 있다.
빈 프로퍼티 값 설정해보기
@Value
AbstractFileSystemMovieReader
의 setter메소드위에 Value 어노테이션을 추가한다.
@Value("${movie.metadata}")
MovieFactory의 datasourcemodule 클래스안에서 정의했던 코드를 다 지우고 실행하면 잘 동작하는 것을 볼 수 있다.
이처럼 Value어노테이션을 사용하면 자동으로 property의 값을 가져오는 것을 볼 수 있다.
프로퍼티 파일로부터 환경정보 가져오기
위에서는 JVM argument를 통해 환경 정보를 가져왔다. 이번에는 프로퍼티 파일로부터 환경정보를 가져오는 방법을 알아보도록 하자!
📌 프로퍼티 파일 작성
- src/main/resources 아래에
application.properties
라는 파일을 생성하자 - 해당 파일안에
movie.metadata=movie_metadata.csv
라고 적는다.
📌 @PropertySource
-
MovieBuddyFactory
클래스위에 @PropertySource 를 작성한다.@PropertySource("/application.properties")
application.properties를 클래스 패스 루트로부터 찾는다.
📌 test 실행
이후 VM argument를 지우고 MovieFinderTest를 실행하면 잘 동작하는 것을 볼 수 있다!
❓ XmlMovieReaderTest를 실행시켜본다면?
현재 프로퍼티파일에는 csv형식의 파일만 지정해주고 있기때문에 실행이 실패한다.
📌 @TestPropertySource
Test를 위한 프로퍼티를 설정해줄 수 도 있다.
XmlMovieReaderTest에 @TestPropertySource
를 사용해서 다음과 같이 작성하면 잘 동작하는 것을 볼 수 있다.
@TestPropertySource(properties = "movie.metadata=movie_metadata.xml")