////
Search
Duplicate
🧫

Chapter 5. 구성 속성 사용하기

이 장에서 배우는 내용
자동-구성되는 빈 조정하기
구성 속성을 어플리케이션 컴포넌트에 적용하기
스프링 프로파일 사용하기
스프링 부트의 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.ymlspring.profiles.active 속성에 해당 프로파일을 지정해두면 된다.
해당 속성에는 여러 프로파일이 포함될 수 있다.
만일 스프링 어플리케이션을 클라우드 파운드리에 배포하는 경우, cloud라는 이름의 프로파일이 자동으로 활성화됨을 알아 두자.

3. 프로파일을 사용해서 조건별로 빈 생성하기

일반적으로 자바 구성 클래스에 선언된 빈은 활성화되는 프로파일과는 무관하게 생성되는 경우가 많다.
그러나 특정 프로파일이 활성화될 때만 생성되어야 하는 빈들이 있다고 해보자. 개발 환경과 프로덕션 환경이 다른 경우의 DataSource 같은 빈 말이다.
이 경우 @Profile 어노테이션을 사용하면 지정된 프로파일에만 적합한 빈들을 나타낼 수 있다.
이때 !, {} 등 조건을 사용해 조건에 부합하는 프로파일이 활성화되었을 때 활성화되도록 할 수 있다.

요약

스프링 빈에 @ConfigurationProperties를 지정하면 여러 가지 원천 속성으로부터 구성 속성 값의 주입을 활성화할 수 있다.
구성 속성은 명령행 인자, 환경 변수, JVM 시스템 속성, 속성 파일, YAML 파일, 커스텀 속성 등에서 설정할 수 있다.
데이터 소스 URL과 로깅 수준의 지정을 포함해서 구성 속성은 스프링의 자동-구성 설정을 변경하는데 사용할 수 있다.
스프링 프로파일은 활성화된 프로파일을 기반으로 구성 속성을 설정하기 위해 사용할 수 있다.