@ConfigurationProperties

스프링으로 개발을 하다 보면 properties 나 yml 파일에 설정한 값을 불러와야할 때가 있다.

대표적으로 외부에 노출되서는 안되는 SecretKey 값 같은 값이 있다.

AWS IAM Key 같은 값은 외부에 노출 됐다가 채굴당해서 요금폭탄 나오는 경우도 많으니 특히 조심해야한다.

전에는 @Value를 사용하곤 했지만 같은 변수를 재사용할 수 없다는 단점이 있었다.

이번에는 @ConfigurationProperties를 통해 properties 나 yml 파일에서 값을 불러오는 법을 정리해두려 한다.

@ConfigurationProperties 로 값 바인딩 하는법 ]

  1.  setter 로 바인딩
  2.  생성자로 바인딩

기본 설정

이 기능을 쓰기 위해 아래처럼 의존성을 추가해준다.

build.gradle

annotationProcessor 'org.springframework.boot:spring-boot-configuration-processor'

 

아래의 application.yml 파일의 데이터 값을 AppConfig 로 가져와보도록 한다.

application.yml

midcon:
  jwt-key: "pjx7jVXbdaeOmw0ZO1SotIHLVApe8FZ+LmGCuMKa8T8="

AppConfig

public class AppConfig {

    private String jwtKey;
}

DunpleApplication

스프링을 실행하고 컨테이너가 시작될 때 AppConfig 를 초기화하고 빈으로 생성하도록 등록을 해주어야 한다.

이를 위해서는 @EnableConfigurationProperties를 등록하고 해당 클래스를 추가해주어야 한다.
일반적으로 SpringBoot의 메인 클래스에 @EnableConfigurationProperties 어노테이션을 다음과 같이 추가해준다.

@EnableConfigurationProperties(AppConfig.class)
@SpringBootApplication
public class DunpleApplication {

   public static void main(String[] args) {
      SpringApplication.run(DunpleApplication.class, args);
   }
}

1. setter 로 바인딩

우선 setter 로 바인딩 하는법을 알아보자.

가져오려는 값의 prefix 또한 설정할 수 있다. 여기서는 "midcon" 으로 설정하겠다.

@ConfigurationProperties는 기본적으로 자바빈 프로퍼티 방식으로 동작하기 때문에 Setter가 반드시 필요하다.

@Setter
@ConfigurationProperties(prefix = "midcon")
public class AppConfig {

    private String jwtKey;
}

 

실행해보면 값이 잘 바인딩 된걸 확인할 수 있다.


2. 생성자로 바인딩

하지만 Setter 를 열어두는건 그다지 좋은 방법이 아니다. 

스프링 컨테이너에 의해 싱글톤으로 관리되는 객체에 변경 가능성이 열려있기 때문이다. 

그러므로 해당 클래스의 변수들을 final로 선언하고 생성자로 바인딩하여 불변성을 보장하는 것이 좋다.

변경 가능성을 닫기 위해 해당 변수를 final로 선언하고 생성자를 추가한다.

그리고 생성자를 이용해 yml 파일의 값을 바인딩하도록 @ConstructorBinding 어노테이션을 추가해준다.

(참고로 이 글은 스프링부트 2.7 점대 버전 기준임. 3.0 이상부터는 @ConstructorBinding 불필요 해당 글 참고)

@RequiredArgsConstructor
@ConstructorBinding
@ConfigurationProperties(prefix = "midcon")
public class AppConfig {

    private final String jwtKey;
}

 

실행해보면 값이 잘 바인딩 된걸 확인할 수 있다.

 

 

관련글

JWT 를 이용한 인증

스프링부트 3.0 이상의 경우

 

 

참고자료

 

[SpringBoot] final 변수를 갖는 클래스에 프로퍼티(Properties) 설정 값 불러오기, 생성자 바인딩(Construct

Spring 프레임워크로 개발을 하다 보면 프로퍼티(Properties)에 저장된 특정한 설정 값들을 불러와야 하는 경우가 있다. 많은 글 들에서 프로퍼티(Properties)를 불러오는 내용들을 설명하고 있는데, 이

mangkyu.tistory.com

 

'백엔드 > Spring' 카테고리의 다른 글

yml 파일 분리해보기  (0) 2024.04.26
ArgumentResolver  (0) 2023.09.29
Interceptor 써보기  (0) 2023.09.29
Filter  (0) 2023.09.29
Interceptor  (0) 2023.09.29

+ Recent posts