Spring/boot

[Spring-boot] 외부설정 2부

jay Joon 2021. 1. 14. 23:02

외부설정 2부

앞에서 살펴봤던 외부프로퍼티에 대한 바인딩은 전혀 Type safe 하지 않다.

@Value("${test.projectName}")
String projectName;

@Value("${test.version}")
int version;

@Value("${test.projectNameAndVersion}")
String projectNameAndVersion;

@Value("${~~}") 안에 적는 외부 properties 의 key 값이 정확히 일치 해야 해당 변수에 바인딩 된다.

 

이러한 경우 대신 자바 bean 스펙을 이용하여 객체에 직접 바인딩을 해줄 수 있다.

image

해당 prefix 값을 기억하자.

 

 

그리고 바인딩 받을 수 있는 class 를 하나 만들자. (프로퍼티 를 주입받기 위해선 Java Bean 스펙 준수)

public class Test {
    private String projectName;
    private int version;
    private String projectNameAndVersion;

    //getter ,setter 추가
}

class 이름은 마음대로 정해도 된다.

 

그리고 해당 class 위에 @ConfigurationProperties 애노테이션을 선언한다.

image

 

그리고 아까 기억하고있는 prefix 값을 적어준다.

 

그리고 해당 class 를 @Component 를 이용하여 Bean으로 등록해주면 끝이다.

 

전체코드

@Component
@ConfigurationProperties("test")
public class Test {

    private String projectName;
    private int version;
    private String projectNameAndVersion;

   //getter ,setter 추가
}

 

 

image image

 

또한 바인딩시 값에대한 검증도 같이 할 수 있다.

@Validated 애노테이션을 이용한 JSR-303 (@NotNull, ...) 검증 이 가능하다.

 

spring-boot 2.3 이후 부터는 의존성을 추가해줘야 합니다.

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-validation</artifactId>
</dependency>

 

 

++추가

 

앞서 살펴본 properties 설정방법은 Setter 를 사용함으로 immutable 하지 않다.

즉 얼마든지 setter 를 통한 값 변경이 쉽다.

 

그래서 스프링부트 2.2 이상부터 Setter 를 사용하지않고 properties 를 설정하는 방법을 알아보자.

 

@ConfigurationProperties(prefix = "jaejoon.test")
@ConstructorBinding  // 1
@ToString
public class HostProperties {

    private final String host;
    private final String name;

    public HostProperties(String host, String name) {  
        this.host = host;
        this.name = name;
    }
}

1. @ConstructorBinding  - 말 그대로 Setter 방식이 아닌 생성자 방식으로 property 를 설정하게 할 수 있다.

해당 설정만 해서는 정상적으로 작동하지 않는다 .

 

따라서 반드시 @SpringbootApplication 이 붙은 클래스에 @EnableConfigurationProperties 을 설정하여야 한다.

 

@EnableConfigurationProperties([] class )

만약 properties 클래스를 여러개 정의해야 한다면 value = {...} 와 같이 설정해주면된다.