섹션 7 : 외부설정과 프로필2

최용석·2024년 1월 10일
post-thumbnail

외부 설정

외부 설정 사용 - Environment

외부 설정들은 스프링이 제공하는 Environment 를 통해서 일관된 방식으로 조회할 수 있다.

  • Environment 를 사용하면 외부 설정의 종류와 관계없이 코드 안에서 일관성 있게 외부 설정을 조회할 수 있다.

외부 설정 사용 - @Value

@Value 를 사용하면 외부 설정값을 편리하게 주입받을 수 있다.
참고로 @Value 도 내부에서는 Environment 를 사용한다

  • @Value 에 ${} 를 사용해서 외부 설정의 키 값을 주면 원하는 값을 주입 받을 수 있다.
  • @Value 는 필드에 사용할 수도 있고, 파라미터에 사용할 수도 있다.
@Value("${my.datasource.url}")
private String url;
...
  • 만약 키를 찾지 못할 경우 코드에서 기본값을 사용하려면 다음과 같이 : 뒤에 기본값을 적어주면 된다.
@Value("${my.datasource.etc.max-connection:1}") 
//key 가 없는 경우 1 을 사용한다.

외부 설정 사용 - @ConfigurationProperties

Type-safe Configuration Properties

스프링은 외부 설정의 묶음 정보를 객체로 변환하는 기능을 제공하는데 이것을 타입 안전한 설정 속성이라고 한다. 객체를 사용했을 때 다음과 같은 장점이 있다.

  • 타입을 사용할 수 있다.
  • 실수로 잘못된 타입이 들어오는 문제를 방지할 수 있다.
@Data
@ConfigurationProperties("my.datasource")
public class MyDataSourcePropertiesV1 {
	...
}
  • 외부 설정을 주입 받을 객체를 생성한다. 그리고 각 필드를 외부 설정의 키 값에 맞추어 준비한다.
  • @ConfigurationProperties 이 있으면 외부 설정을 주입 받는 객체라는 뜻이다. 여기에 외부 설정 KEY의 묶음 시작점인 my.datasource 를 적어준다.
  • 기본 주입 방식은 자바빈 프로퍼티 방식이다. Getter , Setter 가 필요하다. (롬복의 @Data 에 의해 자동 생성된다.)
@EnableConfigurationProperties(MyDataSourcePropertiesV1.class)
public class MyDataSourceConfigV1 {
 private final MyDataSourcePropertiesV1 properties;
...
}
  • @EnableConfigurationProperties 스프링에게 사용할 @ConfigurationProperties 를 지정해주어야 한다.

@ConstructorBinding
스프링 부트 3.0 이전에는 생성자 바인딩 시에 @ConstructorBinding 애노테이션을 필수로 사용해야 했다.
스프링 부트 3.0 부터는 생성자가 하나일 때는 생략할 수 있다. 생성자가 둘 이상인 경우에는 사용할 생성자에
@ConstructorBinding 애노테이션을 적용하면 된다

jakarta.validation.constraints.Max
jakarta.validation 으로 시작하는 것은 자바 표준 검증기에서 지원하는 기능이다.
org.hibernate.validator.constraints.time.DurationMax
org.hibernate.validator 로 시작하는 것은 자바 표준 검증기에서 아직 표준화 된 기능은 아니고, 하이버네이트 검증기라는 표준 검증기의 구현체에서 직접 제공하는 기능이다. 대부분 하이버네이트 검증기를 사용하므로 이 부분이 크게 문제가 되지는 않는다.

ConfigurationProperties 장점

  • 외부 설정을 객체로 편리하게 변환해서 사용할 수 있다.
  • 외부 설정의 계층을 객체로 편리하게 표현할 수 있다.
  • 외부 설정을 타입 안전하게 사용할 수 있다.
  • 검증기를 적용할 수 있다.

가장 좋은 예외는 컴파일 예외, 그리고 애플리케이션 로딩 시점에 발생하는 예외이다. 가장 나쁜 예외는 고객 서비스 중에 발생하는 런타임 예외이다.

YAML

@Profile

@Profile 애노테이션을 사용하면 해당 프로필이 활성화된 경우에만 빈을 등록한다. 이러한 기능을 할 수 있는 이유는 @Conditional 이 있기 때문이다.

package org.springframework.context.annotation;
...
@Conditional(ProfileCondition.class)
public @interface Profile {
String[] value();
}

@Profile 을 사용하면 각 환경 별로 외부 설정 값을 분리하는 것을 넘어서, 등록되는 스프링 빈도 분리할 수 있다

profile
호기심이 많은 백엔드 개발자

0개의 댓글