설정파일 우선 순위
- JAR 패키지 안의 application.properties, application.yaml
- JAR 패키지 안의, 프로파일이 지정된 파일: application-{profile}.properties
- JAR 패키지 밖의 파일
- JAR 패키지 밖의, 프로파일이 지정된 파일
경로에 따른 우선 순위
- classpath 에 존재하는 파일이 1순위를 가진다.
- 순위는 아래와 같다.
1.classpath
- classpath:/
- classpath:/config
2.현재 디렉토리
- ./
- ../config
- ../config/child
설정파일을 읽는 방법
- @value
- Environment
- @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 를 통해서 설정정보를 가져올 수 있다.
- 위와 같이 주석을 설정해 주면 아래와 같이 프로퍼티를 지정할때 도움을 준다.
외부 설정 우선순위
- 외부 설정을 읽어들이는 순서: 아래 설정이 위에서 읽은 것을 덮어쓴다.
- 디폴트 프로퍼티
- @Configuration 클래스에 @PropertySource 로 정의된 것
- 설정 파일: application.properties
- RandomValuePropertySource
- OS 환경변수
- 자바 시스템 프로퍼티: System.getProperties()
- JNDI 속성: java:comp/env
- ServletContext - 초기 파라미터
- ServletConfig - 초기 파라미터
- SPRING_APPLICATION_JSON 안의 프로퍼티들
- Command-line arguments
- 테스트에 사용된 프로퍼티들
- @TestPropertySource
- 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 |