프로그래밍 노트/SPRING BOOT

[Spring Boot] 외부설정하기 (externalized configuration)

깡냉쓰 2019. 11. 18. 21:50
728x90
반응형

프로퍼티 우선순위

  1. 유저 홈 디렉토리에 있는 spring-boot-dev-tools.properties
  2. 테스트에 있는 @TestPropertySource
  3. @SpringBootTest 애노테이션의 properties 애트리뷰트
  4. 커맨드 라인 아규먼트
  5. SPRING_APPLICATION_JSON (환경 변수 또는 시스템 프로티) 에 들어있는 프로퍼티
  6. ServletConfig 파라미터
  7. ServletContext 파라미터
  8. java:comp/env JNDI 애트리뷰트
  9. System.getProperties() 자바 시스템 프로퍼티
  10. OS 환경 변수
  11. RandomValuePropertySource
  12. JAR 밖에 있는 특정 프로파일용 application properties
  13. JAR 안에 있는 특정 프로파일용 application properties
  14. JAR 밖에 있는 application properties
  15. JAR 안에 있는 application properties
  16. @PropertySource
  17. 기본 프로퍼티 (SpringApplication.setDefaultProperties)

application.properties 우선순위

=> 높은게 낮은걸 덮어 씀

  1. file:./config/ (실행 디렉토리 하위에 구성된 config 디렉토리)
  2. file:./ (실행 디렉토리)
  3. classpath:/config/ (클래스패스의 /config 패키지)
  4. classpath:/ (루트 클래스 패스)

프로파일 관련

애플리케이션 실행시 설정한 spring.profiles.active 속성에 따라 application-{profile}.properties의 이름을 사용할 수 있다.

Type-safe properties 타입 세이프 프로퍼티 @ConfigurationProperties

  1. 여러 프로퍼티를 묶어서 읽어올 수 있음
  2. 빈으로 등록해서 다른 빈에 주입할 수 있음
  • @EnableConfigurationProperties
  • @Component
  • @Bean

계층데이터나 다수의 property를 사용하게되면 @Value("${property}")방식은 복잡해 질 수 있다.
Spring Boot는 강한 Typed Bean을 사용한 property관리 방식을 제공한다.

예제

1. application.properties
application.properties 아래 내용을 사용하고 싶을 때

corn.name = sunghyun
corn.howLong = 50

@ConfigurationProperties
Spring Boot properties를 정의 하기 위한 Annotation

@Target({ ElementType.TYPE, ElementType.METHOD })
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface ConfigurationProperties {

    @AliasFor("prefix")
    String value() default "";

    @AliasFor("value")
    String prefix() default "";

    boolean ignoreInvalidFields() default false;

    boolean ignoreNestedProperties() default false;

    boolean ignoreUnknownFields() default true;

    @Deprecated
    boolean exceptionIfInvalid() default true;
}

3. @ConfigurationProperties 설정
JSR-303 표준을 지원 (hibernate-validator)
spring-boot-starter-web에 포함되어 있음

@ConfigurationProperties("corn")
@Validated
public class CornProperties {
    @NotNull
    private String name;
    private int age;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }
    ...
}

3. Configuration 설정

@Configuration
@EnableConfigurationProperties(CornProperties.class)
public class CornConfiguration {

    @Bean
    @ConditionalOnMissingBean
    public Corn corn(CornProperties cornProperties){
        Corn corn = new Corn();
        corn.setName(cornProperties.getName());
        corn.setAge(cornProperties.getAge());
        return corn;
    }
}
728x90
반응형