4.2 Externalized Configuration

1. 외부설정 1부

1.1 외부 설정

  • properties
    • application.properties에 key=value 형태로 정의
    • 사용 방법 @Value(“${summit.name}”)
  • YAML
  • 환경 변수
  • 커맨드 라인 아규먼트

1.2 우선순위

  • 유저 홈 디렉토리에 있는 spring-boot-dev-tools.properties
  • 테스트에 있는 @TestPropertySource
test
+- java
 +- package
  +-xxxxyyyTests
+- resources
 +- application.properties
package com.summit.dev.springbootbasic;

import org.junit.jupiter.api.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.core.env.Environment;
import org.springframework.test.context.junit4.SpringRunner;

import static org.assertj.core.api.Assertions.assertThat;

@RunWith(SpringRunner.class)
@SpringBootTest
class SpringbootBasicApplicationTests {

    @Autowired
    Environment environment;

    @Test
    void contextLoads() {
        assertThat(environment.getProperty("sample.name"))
                .isEqualTo("jacob");
    }

}
  • @SpringBootTest 애노테이션의 properties 애트리뷰트
@RunWith(SpringRunner.class)
@SpringBootTest(properties = "sample.name=bbang")
class SpringbootBasicApplicationTests {
  • 커맨드 라인 아규먼트
  java -jar ./target/springboot-basic-0.0.1-SNAPSHOT.jar --sample.name=yeseo
  • SPRING_APPLICATION_JSON (환경 변수 또는 시스템 프로티) 에 들어있는 프로퍼티
  • ServletConfig 파라미터
  • ServletContext 파라미터
  • java:comp/env JNDI 애트리뷰트
  • System.getProperties() 자바 시스템 프로퍼티
  • OS 환경 변수
  • RandomValuePropertySource
  • JAR 밖에 있는 특정 프로파일용 application properties
  • JAR 안에 있는 특정 프로파일용 application properties
  • JAR 밖에 있는 application properties
  • JAR 안에 있는 application properties
  • @PropertySource
  • 기본 프로퍼티 (SpringApplication.setDefaultProperties)
sample.name=jacob

1.3 application.properties 우선순위

    1. file:./config/
    1. file:./
    1. classpath:/config/
    1. classpath:/

2. 외부설정 2부

2.1 같은 키의 설정을 빈으로 등록

  • 같은 키의 설정을 빈으로 등록하는 방법
sample.name=jacob
sample.age=${random.int(0, 100)}
sample.fullname=${sample.name} park
  • @ConfigurationProperties
package com.summit.dev.springbootbasic.sample;

import org.springframework.boot.context.properties.ConfigurationProperties;


@Component
@ConfigurationProperties("sample")
public class SampleProperties {
    private String name;
    private int age;
    private String fullname;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

    public String getFullname() {
        return fullname;
    }

    public void setFullname(String fullname) {
        this.fullname = fullname;
    }
}
  • dependency 추가
<dependency>
	<groupId>org.springframework.boot</groupId>
	<artifactId>spring-boot-configuration-processor</artifactId>
	<optional>true</optional>
</dependency>
  • @EnableConfigurationProperties
@SpringBootApplication
@EnableConfigurationProperties(SampleProperties.class)
public class SpringbootBasicApplication {

    public static void main(String[] args) {
        SpringApplication.run(SpringbootBasicApplication.class, args);
    }

}
  • 활용
@Component
public class SampleRunner implements ApplicationRunner {
    @Autowired
    SampleProperties sampleProperties;
    @Override
    public void run(ApplicationArguments args) throws Exception {
        System.out.println(" =================== ");
        System.out.println( sampleProperties.getName() );
        System.out.println( sampleProperties.getAge() );
        System.out.println(" ===================");
    }
}

2.2 Relexed binding

  • 아래 형식 모두 contextPath에 바인딩 됨

context-path (케밥)
context_path (언드스코어)
contextPath (캐멀)
CONTEXTPATH

2.3 프로퍼티 타입 컨버전

@DurationUnit

@DurationUnit(ChronoUnit.SECONDS)
private Duration sessionTimeout = Duration.ofSeconds(30);

public Duration getSessionTimeout() {
    
    return sessionTimeout;
}

public void setSessionTimeout(Duration sessionTimeout) {
    this.sessionTimeout = sessionTimeout;
}

2.4 프로퍼티 값 검증

@Validated
JSR-303 (@NotNull, …)

@Component
@ConfigurationProperties("sample")
@Validated
public class SampleProperties {
    private String name;
    private int age;
    private String fullname;

    @NotEmpty
    public String getName() {
        return name;
    }

메타 정보 생성 @Value SpEL 을 사용할 수 있지만… 위에 있는 기능들은 전부 사용 못합니다.

3. 외부설정 3부

카테고리:

업데이트:

댓글남기기