모르지 않다는 것은 아는것과 다르다.

Spring

설정파일(Properties) 관리

채마스 2022. 3. 19. 20:56

설정파일 우선 순위

  1. JAR 패키지 안의 application.properties, application.yaml
  2. JAR 패키지 안의, 프로파일이 지정된 파일: application-{profile}.properties
  3. JAR 패키지 밖의 파일
  4. JAR 패키지 밖의, 프로파일이 지정된 파일

 

경로에 따른 우선 순위

  • classpath 에 존재하는 파일이 1순위를 가진다.
  • 순위는 아래와 같다.

1.classpath

  • classpath:/
  • classpath:/config

2.현재 디렉토리

  • ./
  • ../config
  • ../config/child

 

설정파일을 읽는 방법

  1. @value
  2. Environment
  3. @ConfigurationProperties

 

@Value

  • SpEL 로 프로퍼티명을 표현한다.
  • type-safe 하지 않다.
  • 인스턴스화 이후에 주입하므로, final 쓸 수 없다.
  • 생성자 안에서 보이지 않음 -> 대안: @PostConstruct
  • Relaxed binding 지원 (kebab-case only)
  • meta-data 없음 (javadoc은 적용 가능)
@Configuration
@EnableJpaAuditing
public class JpaConfig {

   @Value("${cloud.aws.s3.accessKey}")
   protected String accessKey;

   @Value("${cloud.aws.s3.secretKey}")
   protected String secretKey;

   @Bean
   @Primary
   public AWSCredentialsProvider buildAWSCredentialsProvider() {
       AWSCredentials awsCredentials = new BasicAWSCredentials(accessKey, secretKey);
       return new AWSStaticCredentialsProvider(awsCredentials);
   }
}

 

Environment

  • 애플리케이션 컨텍스트에서 꺼내오는 방법이다.
@Configuration
@EnableJpaAuditing
public class JpaConfig {

    private final Environment env;

    private final ApplicationContext context;

   private String accessKey = env.getProperty("cloud.aws.s3.accessKey");
   private String secretKey = context.getEnvironment().getProperty("${cloud.aws.s3.secretKey}");

   @Bean
   @Primary
   public AWSCredentialsProvider buildAWSCredentialsProvider() {
       AWSCredentials awsCredentials = new BasicAWSCredentials(accessKey, secretKey);
       return new AWSStaticCredentialsProvider(awsCredentials);
   }
}
  • Environment 와 ApplicationContext 를 사용해서 설정 정보를 불러올 수 있다.

 

Configuration Properties

  • 자바 클래스로 매핑하므로 type-safe 하다.
  • 각 프로퍼티에 대응하는 meta-data 작성 가능하다.
  • Relaxed binding 지원한다.
@ConfigurationProperties("cloud.aws.s3")
@Configuration
public class MyProperties {
    /**
     * accessKey 입니다.
     */
    private String accessKey;

    /**
     * scretKey 입니다.
     */
    private String scretKey;

    public String getAccessKey() {
        return accessKey;
    }

    public void setAccessKey(String accessKey) {
        this.accessKey = accessKey;
    }
    public String getScretKey() {
        return scretKey;
    }

    public void setScretKey(String scretKey) {
        this.scretKey = scretKey;
    }
}
  • 위와 같이 자바 코드로 설정 파일을 작성할 수도 있다.
  • 이렇게 정의하면 이전과 같이 Environment 와 ApplicationContext 를 통해서 설정정보를 가져올 수 있다.
  • 위와 같이 주석을 설정해 주면 아래와 같이 프로퍼티를 지정할때 도움을 준다.

외부 설정 우선순위

  • 외부 설정을 읽어들이는 순서: 아래 설정이 위에서 읽은 것을 덮어쓴다.
  1. 디폴트 프로퍼티
  2. @Configuration 클래스에 @PropertySource 로 정의된 것
  3. 설정 파일: application.properties
  4. RandomValuePropertySource
  5. OS 환경변수
  6. 자바 시스템 프로퍼티: System.getProperties()
  7. JNDI 속성: java:comp/env
  8. ServletContext - 초기 파라미터
  9. ServletConfig - 초기 파라미터
  10. SPRING_APPLICATION_JSON 안의 프로퍼티들
  11. Command-line arguments
  12. 테스트에 사용된 프로퍼티들
  13. @TestPropertySource
  14. Devtools 글로벌 세팅: $HOME/.config/spring-boot

 

 

REFERENCES

  • 양세열님의 스프링 프레임워크

'Spring' 카테고리의 다른 글

Spring Cache Abstraction  (0) 2022.03.19
@ControllerAdvice  (0) 2022.03.19
Null Safety  (0) 2022.03.14
프락시 팩토리빈과 @AspectJ  (0) 2022.03.11
프로파일과 Resource 인터페이스  (0) 2022.03.10