ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 외부 설정 - 스프링 통합
    스프링/스프링부트 2023. 9. 30. 15:40

    지금까지 포스팅했던 외부 설정들(OS 환경변수, 자바 시스템 속성, 커맨드 라인 옵션 인수)은 모두 외부 설정을 key=value 형식으로 사용한다.

    그런데 어디에 있는 외부 설정값을 읽어야 하는지에 따라서 각각 읽는 방법이 다르다는 단점이 존재한다.

     

    예를 들어 OS 환경변수에 두면 System.getenv(key)를 사용해야 하며 자바 시스템 속성을 사용하면 System.getProperty(key)를 사용해야 한다는 것이다.

     

    만약에 외부 설정 정책이 변경되면 해당 코드들을 전부 변경해야 한다. OS 환경변수로 설정을 하다가 자바 시스템 속성으로 정책이 변경된다면 System.getenv(key)를 전부 System.getProperty(key)로 변경하는 등 많은 변경이 필요하다.

     

     

    외부 설정값이 어디에 위치하든 상관없이 일관성 있고 편리하게 key=value 형식의 외부 설정값을 읽을 수 있도록 추상화하는 것이 스프링 외부 설정 통합이다.

     

    스프링은 Environment와 PropertySource라는 추상화를 통해서 해결한다.

     

    사진 : 인프런 스프링 강의

    PropertySource
    스프링은 PropertySource 라는 추상 클래스를 제공하고, 각각의 외부 설정를 조회하는 XxxPropertySource 구현체를 만들어뒀다.   -   예)CommandLinePropertySource, SystemEnvironmentPropertySource
    스프링은 로딩 시점에 필요한 PropertySource 들을 생성하고, Environment 에서 사용할 수 있게 연결해둔다.


    Environment
    Environment 를 통해서 특정 외부 설정에 종속되지 않고, 일관성 있게 key=value 형식의 외부 설정에 접근할 수 있다.
    environment.getProperty(key) 등을 통해서 값을 조회할 수 있다.
    Environment 는 내부에서 여러 과정을 거쳐서 PropertySource 들에 접근한다.
    따라서 모든 외부 설정은 이제 Environment 를 통해서 조회하면 된다.

     

     

    쉽게 생각하면 Environemnt만 사용하면 Environment가 알아서 자동으로 맞는 외부 설정을 가져와서 개발자가 사용할 수 있도록 한다.

     

     

    @Slf4j
    @Component
    public class EnvironmentCheck {
    
        private final Environment env;
    
        public EnvironmentCheck(Environment env) {
            this.env = env;
        }
    
        @PostConstruct
        public void init() {
            String url = env.getProperty("url");
            String username = env.getProperty("username");
            String password = env.getProperty("password");
            log.info("env url={}", url);
            log.info("env username={}", username);
            log.info("env password={}", password);
        }
    }

    Environment를 사용하면 어떤 외부 설정을 사용하더라도 다 똑같이 사용할 수 있다.

     

    애플리케이션 코드는 수정할 일이 없고, 이전 3개의 포스팅의 외부 설정을 사용하더라도 실행 결과가 똑같이 나온다.

     

     

     

     

    우선순위

    커맨드 라인 옵션 인수와 자바 시스템 속성을 중복해서 설정하면 우선순위에 따라 설정된다.

    이렇게 중복으로 입력하면 커맨드 라인으로 선택된다.

     

    우선순위의 선택

    1. 더 유연한 것이 우선권을 가진다.

    2. 범위가 넓은 것보다 좁은 것이 우선권을 가진다.

     

    자바 시스템 속성은 해당 JVM 안에서 모두 접근할 수 있다. 반면에 커맨드 라인 옵션 인수는 main의 arg를 통해서 들어오기 때문에 접근 범위가 더 좁다.

     

    자바 시스템 속성과 커맨드 라인 옵션 인수는 커맨드 라인 옵션 인수가 우선권을 가지지만 우선순위에 대한 내용은 이후에 별도의 포스팅으로 정리할 예정이다.

Designed by Tistory.