[스프링 부트] chapter 8. 외부 설정

외부 설정

사용할 수 있는 외부 설정

외부설정에 선언되어 있는 값을 가져오는 방법

  1. @Value

    application.properties등과 같은 설정 파일에 아래와 같이 설정한다.

    juho.name=juho
    

    아래와 같이 가져다 쓸 수 있음

    @Value("${juho.name})
    private String name;
    
  2. Environment

    Spring에 있는 Environment를 주입받아 사용

    @Autowired
    private Environment environment;
       
    environment.getProperty("juho.name");
    

프로퍼티 우선순위

  1. 유저 홈 디렉토리에 있는 spring-boot-dev-tools.properties

  2. 테스트에 있는 @TestPropertySource
    • @TestPropertySource(properties = “juho.name=juho2”)
    • @TestPropertySource(properties = “classpath:/test.properties”)
  3. @SpringBootTest 애노테이션의 properties 애트리뷰트
    • @SpringBootTest(properties = “juho.name=juho2”)
  4. 커맨드 라인 아규먼트
    • java -jar test.jar –name=juho.kim
  5. SPRING_APPLICATION_JSON (환경 변수 또는 시스템 프로퍼티)에 들어있는 프로퍼티

  6. ServletConfig 파라미터

  7. ServletContext 파라미터

  8. java:comp/env JNDI 애트리뷰트

  9. System.getProperties() 자바 시스템 프로퍼티

  10. OS 환경 변수

  11. RandomValuePropertySource

  12. JAR 밖에 있는 특정 프로파일용 application.properties

  13. JAR 안에 있는 특정 프로파일용 application.properties

  14. JAR 밖에 있는 application.properties

  15. JAR 안에 있는 application.properties

  16. @PropertySource

  17. 기본 프로퍼티 (SpringApplication.setDefaultProperties)

위와 같은 우선 순위에 의하여 우선 순위가 낮은 곳에 선언하더라도

같은 이름으로 우선 순위가 높은 설정값이 있다면 해당 값으로 덮어쓴다.

application.properties 우선 순위 (높은게 낮은걸 덮어 씀)

  1. file:./config/

  2. file:./

  3. classpath:/config/

  4. classpath:/

랜덤 값 설정법

${random.*}

랜덤이란 변수가 이미 정의되어 있어 사용가능

플레이스 홀더

name=juho

full.name=${name} Kim

매번 main과 test의 application.properties를 동기화 시켜줘야 하는가?

test쪽 application.properties가 후순위이므로 main쪽 application.properties를 삭제해 주면

test쪽 application.properties가 반영됨.

타입-세이프 프로퍼티 @ConfigurationProperties

@Component
@ConfigurationProperties("juho")
public class JuhoProperties {
    private String name;
    private int age;
    private String fullName;
    
    getter/setter 추가....
}

여러 프로퍼티를 묶어서 읽어올 수 있음

빈으로 등록해서 다른 빈에 주입 가능

융통성 있는 바인딩

프로퍼티 타입 컨버전

프로퍼티 값 검증

@Validated
public class JuhoProperties {

    @NotEmpty
    private String name;

    @Size(min = 0, max = 100)
    private int age;
}

메타 정보 생성

@Value