application.properties
스프링부트 구동시 자동으로 로딩하는 규약
- ${random.int} 등으로 랜덤 값 생성가능
- ${key} 로 기존에 정의된 값 사용가능
soomin.name = soomin
soomin.age = ${random.int}
soomin.fullName = ${soomin.name} Jung
Application.properties 의 다중 빌드와 우선순위
겹치는 것은 우선순위로 재정의
- file:/config/ (1): 프로젝트 파일 밑의 config 폴더 밑
- file:./ (2): 프로젝트 루트
- classpath:/config/ (3): 클래스패스의 config 폴더 밑
- classpath:/ (4) : 클래스패스
우선 순위
- 유저 홈 디렉토리에 있는 spring-boot-dev-tools.properties (1)
- @TestPropertySource (2) : properties 속성 값에 키=값 설정 / 별도 properties 파일은 location 속성에 정의가능
- @SpringBootTest (3) : properties 속성 값에 키=값을 설정
- 커맨드 라인 아규먼트 (4) : java -jar target/configuration-0.0.1-SNAPSHOT.jar --키=값
//@TestPropertySource(properties = "soomin.name=soo")
@TestPropertySource(locations = "classpath:/test.properties")
@SpringBootTest
class ConfigurationApplicationTests {
@Autowired
private Environment environment;
@Test
void contextLoads() {
Assertions.assertThat(environment.getProperty("soomin.name"))
.isEqualTo("soo");
System.out.println(environment.getProperty("soomin.age"));
}
}
테스트 코드 빌드 과정
- src 의 모든 파일을 classpath 에 놓음
- test의 모든 파일을 classpath 에 놓음
- 이 과정에서 application.properties 가 존재시 덮어씌워짐
이 과정에서 src 의 prorperties 에 정의돤 내용이 test 의 properties에 없는 상태에서 테스트에서 참조하려면 테스트는 깨진다.
application.properties 는 src 에서 사용하되 별도의 test.properties 파일을 두어 @TestPropertySource 에서 읽어 오는게 좋다.
- src 의 application.properties 클래스패스로 이동
- test 의 test.properties 파일이 @TestPropertySource로 읽어짐. 그 과정에서 같은 값을 우선순위가 높은 값으로 덮어 씀
soomin.name=soo # 덮어씌워지는 값
같은 키로 시작하는 외부설정 묶어 Bean으로 등록하기
- 자바빈 스팩에 맞는 클래스를 생성 / 키값의 이름을 가진 필드 선언
- @ConfigurationProperties 선언, 속성으로 공통된 키이름 정의 / Spring Bean으로 등록
- 메타 정보를 생성하는 플러그인인 spring-boot-configuration-processor 추가 ( 메타 데이터를 생성 ,자동완성이 가능하게 함 )
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-configuration-processor</artifactId>
<optional>true</optional>
</dependency>
4. 스프링부트 구동클래스에 @EnableConfigurationProperties 선언, 속성 값으로 @ConfigurationProperties 클래스 등록
application.properties
soomin.name = soomin
soomin.age = ${random.int(0,100)}
soomin.fullName = ${soomin.name} Jung
JavaBean 클래스 : Bean 등록 , 공통된 키 값 설정 << 프로퍼티에 대한 자료값 선언으로 @Value 보다 Type-Safe 함
@Component
@ConfigurationProperties("soomin")
public class SoominProperties {
String name;
int age;
String fullName;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public String getFullName() {
return fullName;
}
public void setFullName(String fullName) {
this.fullName = fullName;
}
}
스프링 부트 구동클래스 : @EnableConfigurationProperties 에 @ConfigurationProperties 클래스 등록
@SpringBootApplication
@EnableConfigurationProperties(SoominProperties.class)
public class ConfigurationApplication {
public static void main(String[] args) {
SpringApplication.run(ConfigurationApplication.class, args);
}
}
시간의 properties 컨버전
- @ConfigurationProperties 클래스에 Duration 타입 필드 선언 (이름주의)
- getter, setter 선언 (자바빈)
- Duration 클래스의 정적메서드로 기본 값 설정
- properties 파일에 키에 맞는 숫자 정의
Prefix
- ns : 나노초
- ms : 밀리초
- s : 초
- m : 분
- h : 시
- d : 날
** properties 파일의 키값은 굉장히 유연함 , Prefix 로 시간 단위 설정
soomin.name = soomin
soomin.age = ${random.int(0,100)}
soomin.fullName = ${soomin.name} Jung
soomin.sessionTimeout=20s
##케밥케이스
#soomin-name = soomin
#soomin-age = ${random.int(0,100)}
#soomin-fullName = ${soomin.name} Jung
#
##스네이크케이스
#soomin_name = soomin
#soomin_age = ${random.int(0,100)}
#soomin_fullName = ${soomin.name} Jung
#
##카멜케이스
#soominName = soomin
#soominAge = ${random.int(0,100)}
#soominFullName = ${soomin.name} Jung
Duration 클래스 선언 한 것 확인.
@Component
@ConfigurationProperties("soomin")
@Validated
public class SoominProperties {
@NotEmpty
String name;
int age;
String fullName;
private Duration sessionTimeout = Duration.ofSeconds(30);//기본값
public Duration getSessionTimeout() {
return sessionTimeout;
}
public void setSessionTimeout(Duration sessionTimeout) {
this.sessionTimeout = sessionTimeout;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public String getFullName() {
return fullName;
}
public void setFullName(String fullName) {
this.fullName = fullName;
}
}
물론 Hibernate-validator ( jsr 303 ) 적용가능
@Validated
public class SoominProperties {
@NotEmpty
String name;
'SpringBoot' 카테고리의 다른 글
스프링부트 기본 로거 설정 (0) | 2020.10.07 |
---|---|
Profile (0) | 2020.10.04 |
SpringApplication 클래스 (0) | 2020.10.03 |
독립적으로 실행가능한 JAR (0) | 2020.10.03 |
내장 웹 서버 (0) | 2020.10.02 |