printenv
System.getenv()
System.getenv("name")
@Slf4j
public class EnvironmentVariableTest {
public static void main(String[] args) {
Map<String, String> envMap = System.getenv();
for (String key : envMap.keySet()) {
log.info("Environment Variable {}={}", key, envMap.get(key));
}
}
}
java -Dkey=value -jar application-0.0.1.jar
-Dkey=value
public class Properties extends Hashtable<Object,Object> {
// ...
}
System.getProperties()
: Properties
System.getProperty(String)
: String
Properties::get(Object)
: Object
Properties::getProperty(String)
: String
Properties:getOrDefuault(Object, Object)
: Object
Properties::getProperty(String, String)
: String
@Slf4j
public class JavaPropertiesTest {
public static void main(String[] args) {
// Properties extends Hashtable<Object,Object>
Properties properties = System.getProperties();
for (Object key : properties.keySet()) {
// log.info("Java Property {}={}", key, properties.get(key));
log.info("Java Property {}={}", key, System.getProperty(String.valueOf(key)));
}
}
}
java -Durl=dev -Dusername=rolroralra -Dpassword -jar application-0.0.1.jar
Command Line Arguments는 Application 실행 시점에 외부 설정 값을
main
메서드의args
파라미터로 전달하는 방법이다.
java -jar application-0.0.1.jar url=dev username=rolroralra password=
DefaultApplicationArguments
: 구현체ApplicationArguments::getSourceArgs()
: String[]
ApplicationArguments::getNonOptionArgs()
: List<String>
ApplicationArguments::getOptionNames()
: Set<String>
ApplicationArguments::getOptionValues(String)
: List<String>
--
로 시작한다.--url=dev
--username=rolroralra
--password
--
로 시작하지 않는다.mode=on
// --url=dev --username=rolroralra --password "hello world"
@Slf4j
public class CommandLineV2Test {
public static void main(String[] args) {
for (String arg : args) {
log.info("Command Line Argument : {}", arg);
}
ApplicationArguments applicationArguments = new DefaultApplicationArguments(args);
log.info("ApplicationArguments::getSourceArgs() = {}", Arrays.asList(applicationArguments.getSourceArgs()));
log.info("ApplicationArguments::getNonOptionArgs() = {}", applicationArguments.getNonOptionArgs());
log.info("ApplicationArguments::getOptionNames() = {}", applicationArguments.getOptionNames());
for (String optionName : applicationArguments.getOptionNames()) {
log.info("option args {}={}", optionName, applicationArguments.getOptionValues(optionName));
}
List<String> url = applicationArguments.getOptionValues("url");
List<String> username = applicationArguments.getOptionValues("username");
List<String> password = applicationArguments.getOptionValues("password");
List<String> noExistsOptionValues = applicationArguments.getOptionValues("no-exists-option-name");
log.info("url={}", url);
log.info("username={}", username);
log.info("password={}", password);
log.info("noExistsOptionValues={}", noExistsOptionValues);
assertThat(url).isNotEmpty();
assertThat(username).isNotEmpty();
assertThat(password).isEmpty();
assertThat(noExistsOptionValues).isNull();
}
}
Environment
, PropertySource
추상화를 통해 통합해서 관리한다.PropertySource
들을 생성하고, Enviornment
에서 사용할 수 있게 연결해둔다.Environment
를 통해서 특정 외부 설정에 종속되지 않고, 일관성 있게 key=value
형식의 외부 설정에 접근할 수 있다.Environment::getProperty(String)
: String
public interface Environment extends PropertyResolver {
String[] getActiveProfiles();
String[] getDefaultProfiles();
boolean acceptsProfiles(Profiles profiles);
}
PropertyResolver
public interface PropertyResolver {
boolean containsProperty(String key);
@Nullable
String getProperty(String key);
String getProperty(String key, String defaultValue);
@Nullable
<T> T getProperty(String key, Class<T> targetType);
<T> T getProperty(String key, Class<T> targetType, T defaultValue);
String getRequiredProperty(String key) throws IllegalStateException;
<T> T getRequiredProperty(String key, Class<T> targetType) throws IllegalStateException;
String resolvePlaceholders(String text);
String resolveRequiredPlaceholders(String text) throws IllegalArgumentException;
}
XxxPropertySource
구현체를 만들어 두었다.SystemEnvironmentPropertySource
: 환경변수 기반 PropertySource 구현체JOptCommandLinePropertySource
: JVM Option 기반 PropertySource 구현체SimpleCommandLinePropertySource
: Command Line Arguments 기반 PropertySource 구현체ResourcePropertySource
ConfigurationPropertySourcesPropertySource
/**
* @param <T> the source type
*/
public abstract class PropertySource<T> {
@Nullable
public abstract Object getProperty(String name);
// ...
}
application.properties
설정 파일을 조회한다.application.properties
url=dev
username=rolroralra
password=
spring.profiles.active
: 활성화할 프로파일을 설정한다.application-{profile}.properties
-Dspring.profiles.active=dev
--spring.profiles.active=dev
application.properties
파일 하나에서 논리적으로 profile 별로 영역을 나눌수 있다.application.properties
에서는 #---
혹은 !---
application.yml
에서는 ---
spring.config.activate.on-profile
설정 값을 통해 현재 영역에 profile 지정spring.config.activate.on-profile=dev
url=dev
username=rolroralra
password=sa
#---
spring.config.activate.on-profile=prod
url=prod
username=root
password=root
default
profile을 사용한다.spring.profiles.active
설정이 없으면 default
profile을 사용한다.
- 더 유연한 것이 우선권을 가진다.
- 범위가 넓은 것 보다 좁은 것이 우선권을 가진다.
application.properties
@TestPropertySource
(테스트 코드에서 사용)외부 설정에 대한 우선순위 - Spring 공식 메뉴얼
application.properties
application-{profile}.properties
application.properties
application-{profile}.properties