본문 바로가기
학습/Spring

[spring] 스프링부트의 외부 설정 (활용)

by KKambi 2020. 4. 12.

여러 프로퍼티를 묶어서 하나의 빈으로 등록하기

프로퍼티 value들을 클래스 멤버 필드로 오토 바인딩

  1. 프로퍼티 클래스에 @ConfigurationProperties("key") 선언
  2. 프로퍼티 클래스에 @Component 선언
  3. 바인딩할 프로퍼티 값들을 멤버 필드
  4. (생략 가능) 어노테이션 프로세서 플러그인 추가
    • 프로젝트 빌드 시 메타정보 생성
    • 프로퍼티 파일에서 IDE의 자동완성 가이드 사용가능 by 메타정보
  5. (생략 가능) 어플리케이션 클래스에 @EnableConfigurationProperties(프로퍼티클래스.class) 선언
    • 스프링부트에서 자동으로 추가해주므로 생략해도 됨
//application.properties
kkambi.name=kkambi
kkambi.age=${random.int(0,10)}
kkambi.fullName=${kkambi.name} babo

//Property Class
@Component
@ConfigurationProperties("kkabmi")
public class KkambiProperties{
	
    private String name;
    
    private int age;
    
    private String fullName;
    
    //getter
}

 

@Value보다 @ConfigurationProperties를 사용하자

장점1. Type-Safe

  • @Value로 사용하는 곳에서 프로퍼티 값을 주입받을 경우, 타입 문제
  • @Configuration 사용 시 타입이 하나로 고정
  • @Value를 사용할 때 발생하는 문제 코드
public class KkambiOne{
	
    @Value("${kkambi.age}")
    private String age;
    
}

public class KKambiTwo{
	
    @Value("${kkambi.age}")
    private int age;
    
}

 

장점2. 융통성 있는 바인딩 (Relaxed Binding)

  • 프로퍼티 정의할 때, Snake_case / Kebab-case 로 적어도 맵핑
  • kkambi.full_name / kkambi.full-name도 private String fullName에 주입

 

장점3. 프로퍼티 타입 컨버전

  • 프로퍼티 파일에서 정의한 값은 모두 문자열
  • ${random.int(0,10)}을 사용하더라도 문자열
  • 스프링이 제공하는 컨버전 서비스에 의해 int 타입 변수에 바인딩할 시, 자동 컨버젼

 

장점4. 프로퍼티 값 검증

  • 프로퍼티 클래스에 @Validated 선언
  • 멤버 필드 @NotEmpty, @NotNull, @NotBlank, @Size, ...

 

스프링 부트의 독특한 Duration 컨버전

Duration Type으로 컨버전

  • @DurationUnit 으로 시간 종류 설정 가능
  • @DurationUnit 없이, 프로퍼티 파일에서 직접 시간 종류 설정 가능
  • Duration.ofSeconds(30)처럼 프로퍼티 값이 없을 시, 기본값 설정 가능
//application.properties
kkambi.sessionTimeout=25
kkabmi.connectionTimeout=60s

//Property Class
@Component
@ConfigurationProperties("kkabmi")
public class KkambiProperties{
	
    @DurationUnit(ChronoUnit.SECONDS)
    private Duration sessionTimeout = Duration.ofSeconds(30);	// default 30s
    
    private Duration connectionTimeout;	// 60s에 의해 sec로 바인딩
    
    //getter
}

 

프로퍼티가 어플리케이션 내에 없을 때

spring-boot-autoconfigure의 ServerProperties처럼 다른 JAR파일 안에 있는 경우

  • 프로퍼티 클래스를 @Component로 등록 불가능
    컴포넌트 스캔 이후, 자동설정이 등록되잖아!
  • @Bean으로 해당 프로퍼티 인스턴스 반환하는 메소드 구현 후, @ConfigurationProperties("key") 선언
  • rare한 경우

 

 

댓글