SPRING/Spring Boot

[SpringBoot] 외부설정 가져오기(1) - Enviroment

IT록흐 2023. 5. 5. 00:03
반응형

 

Application은 외부에서 설정을 가져올 수 있다.

 

외부설정을 가져 오는 방법은 다양한데,

SpringBoot는 최대한 통합하고 추상화하여, 외부설정을 간단히 조작할 수 있도록 기능을 제공한다.

 

그럼 SpringBoot가 어떻게 외부설정을 조작하는지 알아보자.

 

 


 

 

 

 

 

Application은 다양한 환경에서 설정을 가져온다.

OS의 환경변수, JVM의 VM옵션 그리고 App 시작 시, 수행되는 커맨드라인에도 설정을 넣을 수 있다.

 

환경이 다양한 만큼,

설정을 가져오는 방법도 각각 다르다. 

 

OS 환경변수는 System.getenv()에서 가져온다.

JVM의 VM옵션은 System.getProperties()에서 가져온다.

커맨드라인은 main 메소드의 String[] args에서 가져온다.

 

환경에 따라, 설정을 가져오는 API가 다르다.

Spring은 이를 통합한 방식을 가지고 있다. 바로, Enviroment이다.

 

코드를 구현해보자.

@Slf4j
@Component
public class EnviromentCheck {
    private final Environment env;  //Enviroment와 연관관계

    public EnviromentCheck(Environment env) { //Bean 생성시, Enviroment 객체 주입
        this.env = env;
    }

    @PostConstruct //의존성 주입이 이루어진 후, 수행되는 메소드 지정하는 어노테이션
    public void init(){
        String url = env.getProperty("url"); // VM옵션에서 가져오기
        String name = env.getProperty("name"); // 커맨드라인에서 가져오기
        log.info("url = {}",url); 
        log.info("name = {}",name); 
        
    }
}

 

 

@Component 어노테이션을 가진 클래스 하나를 생성하였다.

컴포넌트 스캔시, Bean으로 등록될 대상이다.

 

Enviroment 객체는 Spring 실행시, 자동으로 Bean으로 IOC컨테이너에 등록된다. 컴포넌트 스캔으로 EnviromentCheck 클래스를 Bean으로 등록할때, 연관관계인 Enviroment 객체가 주입된다.

 

그리고

@PostConstruct 어노테이션이 붙은 메소드를 수행한다. 이는 의존성 주입이 완료된 후 수행되어야 할 메소드를 지정한 어노테이션이다. url은 JVM에서 name은 커맨드라인에서 가져온다. 서로 다른 환경에서 가져옴에도 env.getProperty() 메소드를 동일하게 사용한다. 

 

 

VM옵션에 url 속성을 추가하고 커맨드라인의 args에는 name 속성을 추가했다.args는 key=value 포맷을 인식하지 못하기에, key=value앞에 --를 붙여주어야 한다.

 

SpringBoot를 실행시켜 보았다.

 

 

이와 같이, VM옵션과 커맨드라인에서 받은 설정정보가

모두 동일한 env.getProperty() 메소드에서 구현되었다.

 

Spring은 여러 설정정보를 통합하여 조회하는 Enviroment 객체를 가지고 있으므로,

어떤 설정이든 동일한 코드로 설정정보를 가져 올 수 있다.

 

만약 속성명이 중복되는 경우 우선순위도 존재한다.

커맨드라인 > JVM > OS  순으로 우선순위가 높은데, 범위가 좁을수록 디테일한 설정이 가능해서이다.

 

 


 

참고자료

 

스프링 부트 - 핵심 원리와 활용 - 인프런 | 강의

실무에 필요한 스프링 부트는 이 강의 하나로 모두 정리해드립니다., - 강의 소개 | 인프런

www.inflearn.com

 

반응형