Environment Profile

이한주·2023년 5월 16일
0

Environment

ApplicationContext는 EnvironmentCapable 인터페이스를 상속해 environment를 제공한다.

EnvirionmentCapable 인터페이스 내용은 다음과 같다.

Environment는 애플리케이션의 개발 환경, 테스트 환경, 운영 환경 등을 의미한다.

개발 중에는 H2 DB를 사용하다가 운영 중에는 MySQL을 사용해 환경을 바꿀 수 있다.

스프링의 환경은 Profile과 Property로 제공한다.

Profile에 따라 환경이 바뀌고 그에 따라 Property Source가 바뀐다.

Properties

DB 접속 정보, 서버 포트 정보 등 다양한 정보를 코드 상에 직접 작성하면 배포마다 바꿔야하거나 패스워드 같은 민감한 정보는 코드 상에 놔둘 수 없다.

그렇기 때문에 외부 속성으로 정의하고 읽어 오도록 개발한다.

스프링 Environment는 다양한 외부 소스로부터 환경 변수를 읽어올 수 있도록 인터페이스를 제공한다.

스프링 부트에서는 기본적으로 application.properties 파일을 이용한다.

version = v1.0.0

kdt.version = v1.0.0

kdt.support-vendors = a, b, c, d, e, f, g

kdt.minimum-order-amount = 1

properties 파일을 읽기 위해서는 @PropertySource 어노테이션을 이용할 수 있다.

@Configuration
@ComponentScan(basePackages = {"org.prgrms.kdt.order", "org.prgrms.kdt.voucher", "org.prgrms.kdt.configuration"})
@PropertySource("application.properties")
public class AppConfiguration {
}

Property를 가져올 때는 다음과 같이 ConfigurableEnvironment 객체를 이용한다.

getProperty 메소드의 두번째 인자로 특정 클래스 타입을 지정해 형변환도 가능하다.

ConfigurableEnvironment environment = applicationContext.getEnvironment();
var version = environment.getProperty("kdt.version");
var minimumOrderAmount = environment.getProperty("kdt.minimum-order-amount", Integer.class);
var supportVendors = environment.getProperty("kdt.support-vendors", List.class);
System.out.println("version = " + version);
System.out.println("minimumOrderAmount = " + minimumOrderAmount);
System.out.println("supportVendors = " + supportVendors);

// 출력 결과
version = v1.0.0
minimumOrderAmount = 1
supportVendors = [a, b, c, d, e, f, g]

@Value 어노테이션을 이용하면 필드에 직접 프로퍼티 값을 주입할 수 있다.

값 확인은 InitializingBean 인터페이스를 구현해 확인한다.

@Component
public class OrderProperties implements InitializingBean {

	@Value("${kdt.version}")
	private String version;

	@Value("${kdt.minimum-order-amount}")
	private int minimumOrderAmount;

	@Value("${kdt.support-vendors}")
	private List<String> supportVendors;

	@Override
	public void afterPropertiesSet() throws Exception {
		System.out.println("OrderProperties.afterPropertiesSet");
		System.out.println("version = " + version);
		System.out.println("minimumOrderAmount = " + minimumOrderAmount);
		System.out.println("supportVendors = " + supportVendors);
	}
}

// 출력 결과
OrderProperties.afterPropertiesSet
version = v1.0.0
minimumOrderAmount = 1
supportVendors = [a, b, c, d, e, f, g]

property를 찾지 못할 경우에 대비해 default 값을 다음과 같이 지정할 수 있다.

@Component
public class OrderProperties implements InitializingBean {

	@Value("${kdt.version}")
	private String version;

	@Value("${kdt.minimum-order-amount}")
	private int minimumOrderAmount;

	@Value("${kdt.support-vendors}")
	private List<String> supportVendors;

	@Value("${kdt.version2:v0.0.0}") // kdt.version2 값이 없으면 v0.0.0으로 매핑
	private String version2;

	@Override
	public void afterPropertiesSet() throws Exception {
		System.out.println("OrderProperties.afterPropertiesSet");
		System.out.println("version = " + version);
		System.out.println("minimumOrderAmount = " + minimumOrderAmount);
		System.out.println("supportVendors = " + supportVendors);
		System.out.println("version2 = " + version2);
	}
}

// 출력 결과
OrderProperties.afterPropertiesSet
version = v1.0.0
minimumOrderAmount = 1
supportVendors = [a, b, c, d, e, f, g]
version2 = v0.0.0

시스템에 정의된 환경변수 값도 같은 방법으로 매핑할 수 있다.

@Component
public class OrderProperties implements InitializingBean {

	@Value("${kdt.version}")
	private String version;

	@Value("${kdt.minimum-order-amount}")
	private int minimumOrderAmount;

	@Value("${kdt.support-vendors}")
	private List<String> supportVendors;

	@Value("${kdt.version2:v0.0.0}")
	private String version2;

	@Value("${JAVA_HOME}")   // 환경 변수 값 지정
	private String javaHome;

	@Override
	public void afterPropertiesSet() throws Exception {
		System.out.println("OrderProperties.afterPropertiesSet");
		System.out.println("version = " + version);
		System.out.println("minimumOrderAmount = " + minimumOrderAmount);
		System.out.println("supportVendors = " + supportVendors);
		System.out.println("version2 = " + version2);
		System.out.println("javaHome = " + javaHome);
	}
}

// 출력 결과
OrderProperties.afterPropertiesSet
version = v1.0.0
minimumOrderAmount = 1
supportVendors = [a, b, c, d, e, f, g]
version2 = v0.0.0
javaHome = C:\Program Files\Java\jdk-11.0.13

properties 파일에 key 값이 같은 JAVA_HOME이 정의돼 있어도 시스템 환경변수가 먼저 우선순위를 가져서 매핑된다.

Environment Abstraction :: Spring Framework

4번 → 5번 다음에 properties에서 정의한 값을 매핑한다.

특정한 환경변수만을 제공하기 위해 따로 클래스와 프로퍼티 파일을 만들 수 있다.

# version.properties
version=v1.0.0

위와 같이 version만 제공하는 프로퍼티를 읽어서 다음과 같이 불변값으로 제공할 수 있다.

@Component
@PropertySource("version.properties")
public class VersionProvider {

	private final String version;

	public VersionProvider(@Value("${version:v0.0.0}") String version) {
		this.version = version;
	}

	public String getVersion() {
		return version;
	}
}

코드

https://github.com/yanJuicy/kdt-spring-order/tree/cd7438327b7fff144e2863401d40eee7ed3c7054

0개의 댓글