학습 목표
- @ConfigurationProperties
- 연관된 Key 끼리 묶기
- Bean 등록 & 다른 Bean에 DI
- 융통성 있는 바인딩
- @DurationUnit
- @Validated를 통한 검증
@ConfigurationProperties
가급적이면 @Value 어노테이션을 통해서 프로퍼티를 사용하는 것 보다
@ConfigurationProperties 어노테이션을 통해서 아래 여러 기능들을 이용하는 것이 권장된다.
아래 기능들은 @Value 어노테이션을 통해서는 사용 못할 수 있다.
연관된 프로퍼티 끼리 묶기
여러 프로퍼티를 묶어서 읽어올 수 있다.
ex1. 여러 개의 같은 key를 가진 property 생성

- 이름 : name - String
- 나이 : age - int
- 이름 + 성 : fullName (place holder 사용) - String
ex2. property 묶음 처리를 위한 클래스 생성
- @ConfigurationProperties 어노테이션을 사용.
- key를 인자로 준다. 즉, 예제에서는 "linger0310"을 준다.
- Getter&Setter 작성.
- @ConfigurationProperties 에 인자로 준 Key와 동일한 property 값들을
.properties 파일에서 찾고, 그 값들을 해당 클래스의 필드들에 바인딩(전달)
하는 역할의 클래스다.

Bean 등록 & 다른 Bean에 DI
위에서 만든 property 묶음 처리 클래스를 Bean으로 등록해서
다른 Bean에 주입하여 활용할 수 있다.

ex1. ApplicationRunner
- ApplicationRunner : Application 실행 이후, 실행할 작업을 정의한다.
- ex2 에서 생성한 property 묶음 처리 클래스의 객체를 DI(@AutoWired)를 통해 주입받고
Getter 메소드들을 활용하여 각 property에 해당하는 필드에 값이 잘 바인딩(전달)
되었는지 println()을 통해 Console 상에서 확인 해 본다.

ex2. Application
- @EnableConfigurationProperties
- 받을 수 있는 인자
- .properties로부터 사용하고자 하는 property의 Key
- .properties에서 연관된 Key들을 묶음 처리한 클래스
- Application을 실행 시 springboot가 알아서 @EnableConfigurationProperties에
대한 작업을 처리 해주기 때문에 따로 이 어노테이션을 써 줄 필요는 없다.
다만, 이러한 자동 처리 과정이 가능하기 위해서는
- 인자로 받은 연관된 Key들을 묶음 처리한 클래스가 Bean으로 등록이 되어 있거나
- 인자로 받은 Key에 해당하는 property가 참조 중인
.properties 파일(ex. application.properties 등)에 존재해야한다.

ex3. Application 실행 결과
ex3. ApplicationRunner에서 구현한 작업들이 Console 상에 잘 출력 된 것을 볼 수 있다.

융통성 있는 바인딩
프로퍼티의 key name을 정의할 때 다음 방식들이 허용된다.
- Kebab Case | hyphen
- Snake Case | underscore(= underbar)
- Camel Case | 두 번째 단어부터 대문자
- 모두 대문자
@DurationUnit
어떠한 시간 정보 프로퍼티를 정의하고 이 값을 받고자 할 때
시간 정보 프로퍼티 추가

ex2. 묶음처리 클래스에 코드 추가

ex3. ApplicationRunner 클래스에 코드 추가

ex4. Application 실행 결과

@DurationUnit 쓰지 않는 방법
시간 정보 프로퍼티 수정

묶음처리 클래스 수정

@Validated
프로퍼티 값을 검증할 수 있다.
아래의 dependency가 요구된다.
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-validation</artifactId>
</dependency>
ex. NotEmpty 검증
name 프로퍼티에 대하여 NotEmpty 검증을 해보자.
ex1. 묶음처리 클래스에 코드 추가
클래스에 @Validated, name 필드에 @NotEmpty 어노테이션 추가.

ex2. 프로퍼티 변경
일부러 name 프로퍼티 값을 비워보자.

ex3. Application 실행 결과
아래와 같이 보기 쉽게 에러와 원인을 알려준다.
