본문 바로가기
Spring Boot, JPA

Spring - 외부 설정

by suhsein 2024. 11. 13.
728x90

외부 설정

코드 내의 변수를 외부에서 가져오려면 외부 설정을 사용해야한다.
외부 설정으로부터 값을 가져오는 방법에는 여러가지가 있다.

  1. OS 환경변수
  2. 자바 시스템 속성
  3. 커맨드 라인 인수

그리고 이 세가지를 통합하여 사용하는 방법에 대해서 알아보겠다.

OS 환경변수

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하여 받아온다. 그래서 따로 설정할 필요없이 사용할 수 있다.

728x90