외부 설정
사용할 수 있는 외부 설정
-
properties, YAML, 환경 변수, 커맨드 라인 아규먼트
-
application으로 시작하는 파일명을 인식
외부설정에 선언되어 있는 값을 가져오는 방법
-
@Value
application.properties등과 같은 설정 파일에 아래와 같이 설정한다.
juho.name=juho
아래와 같이 가져다 쓸 수 있음
@Value("${juho.name}) private String name;
-
Environment
Spring에 있는 Environment를 주입받아 사용
@Autowired private Environment environment; environment.getProperty("juho.name");
프로퍼티 우선순위
-
유저 홈 디렉토리에 있는 spring-boot-dev-tools.properties
- 테스트에 있는 @TestPropertySource
- @TestPropertySource(properties = “juho.name=juho2”)
- @TestPropertySource(properties = “classpath:/test.properties”)
- @SpringBootTest 애노테이션의 properties 애트리뷰트
- @SpringBootTest(properties = “juho.name=juho2”)
- 커맨드 라인 아규먼트
- java -jar test.jar –name=juho.kim
-
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)
위와 같은 우선 순위에 의하여 우선 순위가 낮은 곳에 선언하더라도
같은 이름으로 우선 순위가 높은 설정값이 있다면 해당 값으로 덮어쓴다.
application.properties 우선 순위 (높은게 낮은걸 덮어 씀)
-
file:./config/
-
file:./
-
classpath:/config/
-
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 추가....
}
여러 프로퍼티를 묶어서 읽어올 수 있음
빈으로 등록해서 다른 빈에 주입 가능
-
@EnableConfigurationProperties
-
@Component
-
@Bean
융통성 있는 바인딩
-
context-path(케밥)
-
context_path(언더스코어)
-
contextPath(캐멀)
-
CONTEXTPATH
프로퍼티 타입 컨버전
-
@DurationUnit (시간정보)
@DurationUnit(Chronounit.SECOND) private Duration sessionTimout = Duration.ofSeconds(30); // 값이 없으면 디폴트 30초
-
@DurationUnit
만 정의한 후 application.properties에서 해당 값을 25s로 정의해도 25초로 주입된다.
프로퍼티 값 검증
- @Validated
- JSR-303 (@NotNull, …)
@Validated
public class JuhoProperties {
@NotEmpty
private String name;
@Size(min = 0, max = 100)
private int age;
}
메타 정보 생성
@Value
-
SpEL을 사용할 수 있지만…
-
위 기능들은 전부 사용 못함