분류없음2019.04.14 00:27

스프링에서 가장 쉽게 프로퍼티를 읽어오는 방법은 @Value를 이용하는 것이다.

- @Value(value="${app.base.name}") 를 이용해서 application의 프로퍼티 하나를 읽어오거나
- @Value("#{systemProperties['os.name']}") 처럼 이용해서 시스템 값을 가져오거나
- @Value("${spring.profiles.active:default}") 를 이용해서 프로파일값을 가져 올 수 있지만,

expression 을 이용하거나, 몇몇 한정된 경우에만 쓰이고 실제로는 @ConfigurationProperties를 더 많이 이용한다.
(링크 : https://docs.spring.io/spring-boot/docs/current/api/org/springframework/boot/context/properties/ConfigurationProperties.html )

ConfigurationProperties를 를 이용해서 외부 설정값을 application 내부에 사용하기 위해서는 spring bean으로 등록해야 한다.

첫번째로 명시적으로 @Bean 으로 명시적으로 생성 하기

@Configuration
public class AppConfigurare {
    @Bean
    public BistrosAppProperties bistrosAppProperties() {
        return new BistrosAppProperties();
    }
}

두번째로는 간단하기 해당 클래스에 바로 @Configuration을 붙여도 된다.

@Configuration
@ConfigurationProperties(prefix = "app.base")
public class BistrosAppProperties {
...
}

둘다 동작은 하지만, Intellij IDE 에서는  아래와 같은 화면을 보여준다. 

이 꼴보기 싫은 빨간줄을 없애려면 가이드대로 @EnableConfigratuinProperties를 사용해야 한다.
그래서 order-eda-gateway 는 4개의 @ConfigurationProperties 클래스가 존재하지만  @EnableConfigurationProperties 도 3개나 선언했다.  (패키지별로의 커플링을 위해서 모듈화 되어 있다)

왜 이럴까 갑자기 궁금해져서 찾아보니.... https://youtrack.jetbrains.com/issue/IDEA-204153

 

Spring: Incorrect error when combining @Configuration and @ConfigurationProperties annotations : IDEA-204153

What steps will reproduce the issue? 1. Start a Spring Boot project 2. Create a class with both the "@Configuration" and "@ConfigurationProperties" annotations (see screenshot) 3. See the red squiggle…

youtrack.jetbrains.com

@Component 는 사용하면 빨간줄이 안나오도록 수정되었고, @Service는 여전히 에러라고 표시된다.   
@Configuration 이나 @Service 어노테이션을 사용 할 경우에 에러라고 나오는 것은 문제이고 '경고'로 나와야 할것 같지만, 그건 좀 어려운것 같다. 정도로 이해했다. 그러니까... 그냥 이렇게 쓰자 '_';;

ps. 내 스프링 기억은 2.5에서 끝인데 끝도 없이 뭐가 생기네 https://docs.spring.io/spring-boot/docs/current/reference/html/boot-features-external-config.html 를 보면 properties 의 적용 순서의 첫번째가 devtools global properties이다. 쓸일도 없고 써본적도 없는 devtools ....

Posted by dev.bistro