코드 내의 변수를 외부에서 가져오려면 외부 설정을 사용해야한다.
외부 설정으로부터 값을 가져오는 방법에는 여러가지가 있다.
그리고 이 세가지를 통합하여 사용하는 방법에 대해서 알아보겠다.
OS Environment variables
OS
에서 지원하는 외부 설정으로, 해당 OS를 사용하는 모든 프로세스에 적용된다.
윈도우는 cmd에서 set 명령어로 설정된 환경변수를 확인할 수 있다.
시스템 환경 변수 편집 - 환경 변수에서 확인 및 편집이 가능하다.
자바에서 환경변수를 사용하려면, System.getenv()
로 사용할 수 있다.
Map<String, String> envMap = System.getenv();
String username = envMap.get("username");
key-value 형식으로 저장되어, 지정한 환경변수명으로 값을 꺼낼 수 있다.
Java System properties
실행한 JVM 안
에서 접근 가능한 외부 설정이다. 추가로 자바가 내부에서 미리 설정해두고고 사용하는 속성들도 있다.
인텔리제이에서 Run/Debug Configuration으로부터 자바 시스템 속성을 설정할 수 있다.
Configuration을 열고, 해당 Application의 VM Options를 추가한다.
(칸이 없는 경우, Modify options-Add VM Options로 시스템 속성을 정의하는 칸을 만든다.)
VM Options를 추가할 때는 -D를 prefix로 붙여서 추가한다.
-Dusername=suhsein과 같이 추가하며, 여러 개를 추가할 때는 공백을 주고 추가하면 된다.
자바에서 자바 시스템 속성을 사용하려면, System.getProperties()
로 사용할 수 있다.
Properties properties = System.getProperties();
String username = System.getProperty("username");
key-value 형식으로 저장되어, 지정한 자바 시스템 속성명으로 값을 꺼낼 수 있다.
커맨드 라인 인수는 애플리케이션 실행 시에 받아오는 인수를 의미한다.
public class CommandLineV1 {
public static void main(String[] args) {
for (String arg : args) {
log.info("arg {}", arg);
}
}
}
위 코드에서 main 메서드의 args에 해당한다.
인텔리제이에서 Run/Debug Configuration으로부터 커맨드 라인 인수를 설정할 수 있다.
Configuration을 열고, 해당 Application의 Program arguments를 추가한다.
(칸이 없는 경우, Modify options-Program Arguments로 커맨드 라인 인수를 정의하는 칸을 만든다.)
args로부터 값을 꺼내기만 하면 된다.
하지만, key=value 형식으로 저장되지 않고 String으로 통으로 저장되므로 따로 처리가 필요하다. 커맨드 라인 옵션 인수를 사용하면, 이 처리를 편리하게 할 수 있다.
커맨드 라인 인수 지정 시에 앞에 --를 붙여서 지정한다.
ApplicationArguments appArgs = new DefaultApplicationArguments(args);
Set<String> optionNames = appArgs.getOptionNames();
List<String> username = appArgs.getOptionValues("username");
getOptionName()
로 optionNames(key에 해당)들을 한 번에 받을 수있다.
그리고 getOptionValues()
로 값들을 받을 수도 있다.(하나의 key에 여러 개의 value 가 있을 수 있으므로, List 반환)
하지만, --로 지정하지 않은 경우에는 옵션 인수가 아니기 때문에 위 메소드들로 받을 수 없다.
스프링 부트 애플리케이션에서는 ApplicationArguments를 DI하여 받아온다. 그래서 따로 설정할 필요없이 사용할 수 있다.