1. 스프링에서 외부설정을 조회하는 방법

    1. Environment
    2. @Value
    3. @ConfigurationProperties
  2. Environment

    Untitled

    1. 스프링에서 외부 설정들을 하나의 객체에서 일관적으로 조회 가능하도록 Environment 타입의 빈을 등록해둠
    2. getProperty(key, type)
      1. 원하는 설정정보 key를 넘겨주면 해당 설정정보 조회 가능
      2. 클래스 타입으로 type에 타입 정보를 넘겨주면 해당 타입으로 설정정보를 얻을 수 있음
      3. type을 생략하는 경우 모든 value는 String Type
    3. Environment객체로 모든 설정을 조회하므로 이후 커맨드 라인 인수, 자바 시스템 속성으로 변경하더라도 조회 가능
    4. 하지만, 빈을 주입받아야 하며 getProperty()메서드를 매번 사용하는 것은 번거로움
  3. @Value

    1. 사용

      Untitled

      Untitled

      1. 기본적으로 빈으로 등록되는 클래스만 **@Value**로 읽어올 수 있음
      2. 만약 **${}**로 감싸지 않고 작성한 경우 문자 그대로를 바인딩
      3. 어노테이션에 **${}**를 사용해서 key를 넣어주면 받는 필드 변수 타입으로 외부 설정을 받을 수 있음
      4. 내부적으로는 **${}**내부에 작성한 값을 후처리기를 통해 변환하여 처리 따라서 변수 final 설정이 불가능
      5. 만약 key가 없을 때 기본값을 설정하고 싶다면 **${key: (기본값)}**를 통해 기본값을 설정
  4. @ConfigurationProperties

    Untitled

    Untitled

    1. 스프링은 외부 설정의 묶음 정보를 객체로 바인딩하며 타입 안전한 설정 속성이라고 함

    2. 객체를 사용하면 타입을 사용할 수 있으며, 타입이 잘못 들어오는 문제도 방지

    3. Prefix

      Untitled

      Untitled

      1. @ConfigurationProperties 어노테이션을 사용하면, 해당 객체는 설정 정보를 바인딩할 객체라는 것을 명시하게 됨
      2. 위처럼 작성하면 **my.datasource.XXX**형식으로 작성된 설정정보는 해당 객체를 통해 바인딩하겠다고 명시
      3. 변수이름대로 설정정보를 가져오는데, 필드에서 낙타표기법으로 작성해도 케밥 케이스로 작성한 설정정보를 잘 가져옴(중간에서 변환)
      4. **@EnableConfigurationProperties**를 통해 해당 객체를 활성화하면 빈으로 등록되어 원하는 곳에서 주입받아 사용할 수 있게됨
    4. @ConfigurationPropertiesScan

      1. 앞서 @ConfigurationProperties를 작성해도 @EnableConfigurationProperties를 통해 활성화를 해야 했는데
      2. 해당 어노테이션을 통해 특정 경로의 @ConfigurationProperties를 모두 활성화해줄 수 있음
    5. 바인딩 과정

      1. 기본적으로 바인딩은 getter/setter를 이용해 바인딩
      2. 하지만 이런 바인딩 방식은 중간에 값이 바뀔 수도 있기 때문에 위험함
      3. 대안으로 스프링에서는 단일 생성자를 가지고 있다면 해당 생성자를 통해 외부 설정을 바인딩함
      4. @ConstructorBinding
        1. 스프링 부트 3.0 이전
          1. 생성자 바인딩 시에 해당 어노테이션을 사용해야 했음
        2. 스프링 부트 3.0 이후
          1. 생략가능하지만, 생성자가 둘 이상인 경우는 사용해야함
    6. @DefaultValue

      1. 이전에 @Value어노테이션은 기본값을 설정할 수 있었는데
      2. 이 기능을 사용하려면 @DefaultValue("default") 를 통해 가능하며, 이 명령은 기본값으로 **“default”**를 선언
    7. 자바 빈 검증기

      1. 참조: 자바 빈 검증기

      2. 설치

        implementation: 'org.springframework.boot:spring-boot-starter
        -validation'
        
      3. 사용

        1. 검증 할 빈 클래스에 @Validated 어노테이션을 통해 활성화
        2. @NotEmpty: 해당 값이 반드시 있어야함
        3. @Min: 해당 필드의 최소값 명시
        4. @Max: 해당 필드의 최대값 명시
        5. @DurationMin(seconds = 1): 해당 필드는 최소 1초의 값만 가짐
  5. @Profile

    Untitled

    1. 활성화된 프로필에 따라 빈을 다르게 구성하기 위해 사용하는 어노테이션
    2. 내부적으로는 @Conditional어노테이션을 사용해서 조건에 따라 작동
    3. 위 예제는 default, prod 프로필에 따라 다른 빈을 등록하는 예제