Back-End/Spring Advance & Boot

스프링 부트 - 외부 설정과 프로필2

Meluu_ 2025. 1. 21. 15:18

✔️ 스프링이 지원하는 외부 설정


스프링이 지원하는 다양한 외부 설정 조회 방법

  • Environment
  • @Value - 값 주입
  • @ConfigurationProperties - 타입 안전한 설정 속성

 

@Slf4j
public class MyDataSource {

    private String url;
    private String username;
    private String password;
    private int maxConnection;
    private Duration timeout;
    private List<String> options;

    // 생성자
    
    // @PostConstruct 로 멤버변수 log 출력
    
}

 

 

# application.properties

my.datasource.url=local.db.com
my.datasource.username=username
my.datasource.password=password
my.datasource.etc.max-connection=1
my.datasource.etc.timeout=3500ms
my.datasource.etc.options=CACHE,ADMIN

캐밥 표기법으로 사용(-) 

 

 

1. Environment 

@Slf4j
@Configuration
public class MyDataSourceEnvConfig {

    private final Environment env;

    public MyDataSourceEnvConfig(Environment env) {
        this.env = env;
    }

    @Bean
    public MyDataSource myDataSource() {
        String url = env.getProperty("my.datasource.url");
        // 뒤에 타입 적으면 해당 타입으로 변환
        Integer maxConnection = env.getProperty("my.datasource.etc.max-connection", Integer.class);
	//...
        
        return new MyDataSource(url, username, password, maxConnection, timeout, options);
    }
}

 

 

2. @Vaule

@Value도 내부에서는 Environment를 사용

@Slf4j
@Configuration
public class MyDataSourceValueConfig {

    @Value("${my.datasource.url}")
    private String url;
    //...

    @Bean
    public MyDataSource myDataSource1() {
        return new MyDataSource(url, username, password, maxConnection, timeout, options);
    }

    // 파라미터에 적용
    @Bean
    public MyDataSource myDataSource2(
        @Value("${my.datasource.url}") String url,
        // 생략..
        @Value("${my.datasource.etc.options}") List<String> options) {

        return new MyDataSource(url, username, password, maxConnection, timeout, options);
    }
}

 

@Value("${my.url:default 값}")

:을 넣어서 기본값을 설정 가능 

없으면 기본값 사용

 

3. ConfigurationProperties 

스프링은 외부 설정의 묶음 정보를 객체로 변환하는 기능을 제공 : 타입 안전한 설정 속성

설정 정보 그 자체도 타입을 가지게 됨

 

자바 빈 검증기를 사용

 

@Getter
@Validated
@ConfigurationProperties("my.datasource")
public class MyDataSourcePropertiesV3 {
    @NotEmpty
    private String url;
    @NotEmpty
    private String username;
    @NotEmpty
    private String password;
    private Etc etc;


    public MyDataSourcePropertiesV3(String url, String username, String password, Etc etc) {
        this.url = url;
        this.username = username;
        this.password = password;
        this.etc = etc;
    }

    @Getter
    public static class Etc {
        @Min(1)
        @Max(999)
        private int maxConnection;
        @DurationMin(seconds = 1)
        @DurationMax(seconds = 60)
        private Duration timeout;
        private List<String> options;

        public Etc(int maxConnection, Duration timeout, List<String> options) {
            this.maxConnection = maxConnection;
            this.timeout = timeout;
            this.options = options;
        }
    }
}

@ConfigurationProperties 이 있으면 외부 설정을 주입 받는 객체라는 뜻

 

@Slf4j
@EnableConfigurationProperties(MyDataSourcePropertiesV3.class)
public class MyDataSourceConfigV3 {

    private final MyDataSourcePropertiesV3 properties;

    public MyDataSourceConfigV3(MyDataSourcePropertiesV3 properties) {
        this.properties = properties;
    }

    @Bean
    public MyDataSource dataSource() {
        return new MyDataSource(properties.getUrl(),
                properties.getUsername(),
                properties.getPassword(),
                properties.getEtc().getMaxConnection(),
                properties.getEtc().getTimeout(),
                properties.getEtc().getOptions());
    }
}

 

@ConfigurationPropertiesScan

@SpringBootApplication
@ConfigurationPropertiesScan({ "com.example.app", "com.example.another" })
public class MyApplication {}

@EnableConfigurationProperties를 직접 추가하지 않고 주어진 패키지를 탐색해서

@ConfigurationProperties 이 붙은 클래스를 스캔하여 빈 등록한다. 

 

 

ConfigurationProperties 장점

  • 외부 설정을 객체로 편리하게 변환해서 사용
  • 외부 설정의 계층을 객체로 편리하게 표현
  • 외부 설정을 타입 안전하게 사용
  • 검증기를 적용 가능
@ConstructorBinding : 생성자 둘 이상인 경우 사용 

 

 

✔️ @Profile


각 환경마다 서로 다른 빈을 등록해야할때 사용

@Slf4j
@Configuration
public class PayConfig {

    @Bean
    @Profile("default")
    public LocalPayClient localPayClient() {
        log.info("LocalPayClient 빈 등록");
        return new LocalPayClient();
    }

    @Bean
    @Profile("prod")
    public ProdPayClient prodPayClient() {
        log.info("ProdPayClient 빈 등록");
        return new ProdPayClient();
    }
}

 

프로필 값을 주는 방법은 전 포스팅을 참고하자.

 

🔖 학습내용 출처


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