•
이 장에서 배우는 내용
◦
자동-구성되는 빈 조정하기
◦
구성 속성을 어플리케이션 컴포넌트에 적용하기
◦
스프링 프로파일 사용하기
•
스프링 부트의 auto-configuration은 스프링 어플리케이션의 개발을 굉장히 단순화해 준다. 기존의 스프링 XML 구성으로 속성 값을 설정하는 것은 명시적으로 빈을 구성하지 않고서는 속성을 설정할 마땅한 방법이 없었다.
•
스프링 부트는 구성 속성을 사용하는 방법을 제공한다. 스프링 어플리케이션 컨텍스트에서 구성 속성은 빈의 속성이며 JVM 시스템 속성, 명령행 인자, 환경 변수 등의 여러 원천 속성을 설정할 수 있다.
1. 자동-구성 세부 조정하기
•
스프링에는 보통 다음 두 형태의 서로 다르면서도 관련 있는 구성이 존재한다.
◦
빈 연결(Bean wiring): 스프링 어플리케이션 컨텍스트에서 빈으로 생성되는 어플리케이션 컴포넌트 및 상호 간에 주입되는 방법을 선언하는 구성
◦
속성 주입(Property injection): 스프링 어플리케이션 컨텍스트에서 빈의 속성 값을 설정하는 구성
•
이 두 구성은 스프링의 XML 구성과 자바 기반 구성 모두에서 종종 같은 곳에서 선언된다. 자바 기반 구성에서 @Bean 어노테이션이 지정된 메소드는 빈의 인스턴스를 생성하고 속성 값도 설정한다.
1. 스프링 환경 추상화 이해하기
•
스프링 환경 추상화는 구성 가능한 모든 속성을 한 곳에서 관리하는 개념이다. 즉 속성의 근원을 추상화하여 각 속성을 필요로 하는 빈이 스프링 자체에서 해당 속성을 사용할 수 있게 해준다.
•
스프링 환경에서는 다음과 같은 속성의 근원으로부터 원천 속성을 가져온다.
◦
JVM 시스템 속성
◦
운영체제의 환경 변수
◦
명령행 인자
◦
어플리케이션의 속성 구성 파일
•
그런 다음 스프링은 이 속성들을 한 군데로 모은 후, 각 속성이 주입되는 스프링 빈을 사용할 수 있게 해준다.
•
스프링 부트에 의해 자동으로 구성되는 빈들은 스프링 환경으로부터 가져온 속성들을 사용하여 구성될 수 있다.
server:
port: 9090
YAML
복사
2. 데이터 소스 구성하기
•
데이터 소스의 경우, 나름의 DataSource 빈을 선언함으로써 명시적으로 구성할 수 있다. 그러나 스프링 부트 사용 시 그럴 필요는 없으며 대신 구성 속성을 통해서 해당 데이터베이스의 URL과 인증을 구성하는 것이 더 간편하다.
3. 내장 서버 구성하기
•
만약 포트가 0으로 설정되면 어떻게 될까? 서버는 0번 포트로 시작하지 않으며 사용 가능한 포트를 무작위로 선택하여 시작된다.
•
이는 자동화된 테스트 서버를 구성할 때 유용하다. 즉 동시적으로 실행되는 어떤 테스트도 같은 포트를 점유하지 않도록 하기 때문이다.
5. 다른 속성의 값 가져오기
•
임의의 커스텀된 구성 속성을 선언하여 값을 가져올 수도 있다.
2. 우리의 구성 속성 생성하기
•
구성 속성의 올바른 주입을 지원하기 위해 스프링 부트는 @ConfigurationProperties 어노테이션을 제공한다. 그리고 어떤 스프링 빈이건 해당 어노테이션이 지정되면 해당 빈의 속성들이 스프링 환경의 속성으로부터 주입될 수 있다.
1. 구성 속성 홀더 정의하기
•
@ConfigurationProperties는 컨트롤러나 특정 빈에 사용되기 보단 구성 데이터의 홀더로 사용되는 빈에 지정되는 경우가 많다.
◦
이렇게 하면 컨트롤러와 이외의 다른 어플리케이션 클래스 외부에 구성 관련 정보를 따로 유지할 수 있으며 다른 빈들에게 공통적인 구성 속성을 쉽게 공유할 수 있다.
◦
@ConfigurationProperties에 사용하고자 하는 구성 속성의 경로를 작성해두면 된다. 네이밍 규칙은 상관없는 것 같다. 스프링이 바인딩 시, 이런 변형들을 처리해주는 것 같다.
▪
공식문서에 따르면 prefix 값은 케밥 케이스로 작성해주어야 한다고 한다.
2. 구성 속성 메타데이터 선언하기
•
임의의 속성을 선언하는 경우, 메타데이터로 선언해두어 이 값이 무엇을 하는 값인지 적절히 작성해줄 필요가 있다.
•
속성 파일만으로는 해당 값에 제공해줄 수 있는 맥락 정보가 제한적이기 때문에 메타데이터를 잘 활용하여 설명해주자.
3. 프로파일 사용해서 구성하기
•
어플리케이션은 서로 다른 런타임 환경에서 배포, 개발, 설치되므로 대개 구성 명세가 달라진다.
◦
이때는 각 환경의 속성들을 각 상황에 맞게 적절히 작성해주어야 한다.
•
이때 스프링 프로파일을 사용해야 한다.
◦
런타임 시 활성화되는 프로파일에 따라 서로 다른 구성을 가진 빈, 구성 클래스, 구성 속성들이 적용 또는 무시되도록한다.
1. 프로파일 특정 속성 정의하기
•
프로파일에 특정한 속성을 정의하는 한 가지 방법은 프로덕션 환경의 속성들만 포함하는 또 다른 .yml을 생성하는 것이다.
2. 프로파일 활성화하기
•
그렇다면 프로파일을 어떻게 활성화할 수 있을까. application.yml의 spring.profiles.active 속성에 해당 프로파일을 지정해두면 된다.
◦
해당 속성에는 여러 프로파일이 포함될 수 있다.
•
만일 스프링 어플리케이션을 클라우드 파운드리에 배포하는 경우, cloud라는 이름의 프로파일이 자동으로 활성화됨을 알아 두자.
3. 프로파일을 사용해서 조건별로 빈 생성하기
•
일반적으로 자바 구성 클래스에 선언된 빈은 활성화되는 프로파일과는 무관하게 생성되는 경우가 많다.
•
그러나 특정 프로파일이 활성화될 때만 생성되어야 하는 빈들이 있다고 해보자. 개발 환경과 프로덕션 환경이 다른 경우의 DataSource 같은 빈 말이다.
•
이 경우 @Profile 어노테이션을 사용하면 지정된 프로파일에만 적합한 빈들을 나타낼 수 있다.
◦
이때 !, {} 등 조건을 사용해 조건에 부합하는 프로파일이 활성화되었을 때 활성화되도록 할 수 있다.
요약
•
스프링 빈에 @ConfigurationProperties를 지정하면 여러 가지 원천 속성으로부터 구성 속성 값의 주입을 활성화할 수 있다.
•
구성 속성은 명령행 인자, 환경 변수, JVM 시스템 속성, 속성 파일, YAML 파일, 커스텀 속성 등에서 설정할 수 있다.
•
데이터 소스 URL과 로깅 수준의 지정을 포함해서 구성 속성은 스프링의 자동-구성 설정을 변경하는데 사용할 수 있다.
•
스프링 프로파일은 활성화된 프로파일을 기반으로 구성 속성을 설정하기 위해 사용할 수 있다.