Spring

Spring boot 의 외부 설정

쭈녁 2024. 4. 27. 00:55

외부설정이란?

하나의 애플리케이션을 여러 다른 환경에서 사용해야 할 때를 위하여 Spring boot의 실행 or 빌드 시점에 외부에서 설정을 넣어줄 수 있다. 이를 외부 설정이라 한다.

 

그렇다면 애플리케이션 실행에 필요한 설정값을 외부에서 어떻게 주입할 수 있는 것일까?

 

외부 설정파일은 크게 아래와 같이 4개로 나눌 수 있다.

  • OS 환경 변수: OS에서 지원하는 외부 설정 , OS에서 사용되는 모든 프로세스에 적용 가능하다.
  • 자바 시스템 속성: 자바에서 지원하는 외부 설정, 해당 JVM안에서 사용
  • 자바 커맨드 라인 인수: 커맨드 라인에서 실행시 main(args) 메서드에서 사용할 인자를 준다.
  • 외부 파일(설정 데이터): 프로그램 외부의 파일을 읽어 사용 (application.properties)

1. OS 환경변수

    OS 환경변수는 key , value 타입으로 관리된다.

    자바코드에서 System.getenv(); 메서드를 통해 OS 환경 변수를 받아올수있다.

    아래 코드는 OS 환경변수를 확인해보는 코드이다.

@Slf4j
public class OsEnv {
    public static void main(String[] args) {
        Map<String, String> getenv = System.getenv();
        for (String s : getenv.keySet()) {
            log.info("env {} : {}", s, getenv.get(s));
        }
    }
}

결과

 

2. 자바 시스템 속성

Add VM option에 -D{key}={value} 형식으로 옵션을 주면 해당 설정 값을 받아올 수 있다.

 

자바 시스템 속성 설정

 

자바 시스템 속성 로그 찍는 코드

@Slf4j
public class JavaSystemProperties {
    public static void main(String[] args) {
        Properties properties = System.getProperties();
        for (Object o : properties.keySet()) {
            log.info("property:{}={}", o, System.getProperty(String.valueOf(o)));
        }
        String url = System.getProperty("url");
        String username = System.getProperty("username");
        String password = System.getProperty("password");

        log.info("url:{} , username:{} , password:{}", url, username, password);
    }
}

 

로그 결과 일부

 

 

3. 커맨드 라인

커맨드 라인 옵션인수는 main 메서드가 실행될때 인자로 받는 String[] args 에 값을 주어 설정하는 방법이다.

해당 방식은 위 두 방식과 다르게 key value 가 아닌 " " 공백을 기준의 배열로 값을 받는다.

 

@Slf4j
public class CommendLineV1 {
    //커멘드 옵션에 공백을 구분자로 한 args 인자값 부여
    public static void main(String[] args) {
        for (String arg : args) {
            log.info("arg = {}", arg);
        }
    }
}

 

 

공백 기준의 배열로 값을 받아오는 방식인 커맨드라인 방식을 key value 형태로 받기 위해 스프링에서는 커맨드 라인 옵션인수라는 표준을 만들었다. --key=value 형식으로 사용한다.

 

4. 커맨드라인 옵션 인수

인수 설정 시 --key=value 형식으로 설정,  같은 key값에 2개의 value를 넣을 수 있다.

 

결과 값

 

그렇다면 이렇게 많은, 그리고 각기 다른 방식의 외부 설정값 주입 방법을 스프링은 어떤 방법으로 받아 사용할까??

바로 Environment라는 클래스를 통해 추상화 하여 특정 설정에 종속되지 않고 key=value 값으로 설정값을 받아올 수 있도록 하였다. 같은 key 값의 설정을 여러 외부 설정에서 동시에 했을 시 우선순위에 의하여 설정값을 설정한다.

 

계속...

 

Reference : 김영한 - 스프링 부트 - 핵심 원리와 활용  https://www.inflearn.com/course/%EC%8A%A4%ED%94%84%EB%A7%81%EB%B6%80%ED%8A%B8-%ED%95%B5%EC%8B%AC%EC%9B%90%EB%A6%AC-%ED%99%9C%EC%9A%A9/dashboard

 

스프링 부트 - 핵심 원리와 활용 | 김영한 - 인프런

김영한 | 실무에 필요한 스프링 부트는 이 강의 하나로 모두 정리해드립니다., 백엔드 개발자를 위한 스프링 부트 끝판왕! 실무에 필요한 내용을 모두 담았습니다.  [임베딩 영상] 김영한의 스

www.inflearn.com