애플리케이션 관련 설정 파일들을 코드 안 또는 밖에다가 정의해 놓는 것입니다.
프로퍼티를 정의할 수 있는 방법이 워낙 많고, 우선순위가 정해져 있습니다.
1) 유저 홈 디렉토리에 있는 spring-boot-dev-tools.properties
2) 테스트에 있는 @TestPropertySource
//@TestPropertySource(properties = "keesun.name=keesun2") // 2
@TestPropertySource(locations = "classpath:/test.properties")
//@SpringBootTest(properties = "keesun.name=keesun2") // 3
@SpringBootTest
class DemoApplicationTests {
@Autowired
Environment environment;
@Test
void contextLoads() {
assertThat(environment.getProperty("keesun.name"))
.isEqualTo("whiteship");
}
}
3) @SpringBootTest 애노테이션의 properties 애트리뷰트
4) 커맨드 라인 아규먼트(터미널에서 자르파일 실행시킬 때 --로 파라미터 넘김)
5) SPRING_APPLICATION_JSON (환경 변수 또는 시스템 프로티) 에 들어있는 프로퍼티
6) ServletConfig 파라미터
7) ServletContext 파라미터
8) java:comp/env JNDI 애트리뷰트
9) System.getProperties() 자바 시스템 프로퍼티
10) OS 환경 변수
11) RandomValuePropertySource
12) JAR 밖에 있는 특정 프로파일용 application properties
13) JAR 안에 있는 특정 프로파일용 application properties
14) JAR 밖에 있는 application properties
15) JAR 안에 있는 application properties
16) @PropertySource
17) 기본 프로퍼티 (SpringApplication.setDefaultProperties)
application.properties도 여러 곳에서 만들 수 있기 때문에 이들간의 우선순위가 있습니다.
1) file:./config/
2) file:./
3) classpath:/config/
4) classpath:/
server.port=${random.int}가 아닌 server.port=0으로 설정해야 합니다.
random.int는 사용하면 안되는 포트 번호를 알지 못하기 때문입니다.
같은 파일이면 전부 오버라이딩 되어서 만일 소스에서는 있었던 프로퍼티가 테스트 설정 파일에서는 없다면 오류가 납니다.
이를 방지하기 위해 이름을 달리하고 그 이름을 어노테이션에 location으로 경로를 지정해줍니다. 그러면 중복되는 키 값만 오버라이딩됩니다.
큰 의미는 아니지만 타입세이프 하다는 장점이 있습니다.
package com.example.demo;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.stereotype.Component;
@Component
@ConfigurationProperties("keesun")
public class KeesunProperties {
private String name;
private int age;
private 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;
}
}
// application.properties
keesun.name = keesun
keesun.age = ${random.int(0,100)}
package com.example.demo;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.ApplicationArguments;
import org.springframework.boot.ApplicationRunner;
import org.springframework.stereotype.Component;
@Component
public class SampleListener implements ApplicationRunner {
@Autowired
KeesunProperties keesunProperties;
@Override
public void run(ApplicationArguments args) throws Exception {
System.out.println("===================");
System.out.println(keesunProperties.getName());
System.out.println("===================");
}
}