애플리케이션이 실행될 때 자동으로 로딩
key : value 형태로 저장
기본적인 사용방법
@Component
public class SampleListener implements ApplicationRunner {
@Value("${choi.name}")
private String name;
@Override
public void run(ApplicationArguments args) throws Exception {
System.out.println("===========================");
System.out.println(name);
System.out.println("===========================");
}
}
사용할 수 있는 외부 설정
- properties
- YAML
- 환경 변수
- 커맨드 라인 아규먼트
프로퍼티 우선순위
1. 유저 홈 디렉터리에 있는 spring-boot-dev-tools.properties
2. 테스트에 있는 @TestPropertySource
@ExtendWith(SpringExtension.class)
@TestPropertySource(properties = "choi.name=junwoo3")
@SpringBootTest
class SpringinitApplicationTests {
@Autowired
Environment environment;
@Test
@DisplayName("test")
void contextLoads() {
assertEquals(environment.getProperty("choi.name"),"junwoo3");
}
}
@ExtendWith(SpringExtension.class)
@SpringBootTest
class SpringinitApplicationTests {
@Autowired
Environment environment;
@Test
@DisplayName("test")
void contextLoads() {
assertEquals(environment.getProperty("choi.name"),"junwoo");
}
}
테스트 용도로 properties 파일을 바꿔야 할 때
test 하위의 resources dir에 application.properties 파일을 만든다.
src 하위에 있는 것을 빌드해서 classpath에 들어간다. (source 빌드)
그다음 test 코드를 빌드하여 classpath에 넣는다. (test code 빌드)
이때 application.properties가 바뀌게 된다.
application.properties에서 server.port를 랜덤 값으로 두면 안 되는 이유 (server.port = ${random.int})
포트를 랜덤 값으로 설정하게 된다면 가용하지 않는 포트로 설정할 수 있기 때문에 에러가 떨어질 가능성이 생긴다.
(ex minus값)
application.properties에서 server.port를 랜덤 값으로 두면 안 되는 이유 (server.port = ${random.int})
포트를 랜덤 값으로 설정하게 된다면 가용하지 않는 포트로 설정할 수 있기 때문에 에러가 떨어질 가능성이 생긴다.
(ex minus값)
하지만 여기서 복잡한 문제가 발생한다.
1. src의 application.properties의 값을 수정
choi.name = junwoo
choi.age = ${random.int}
2. 해당 age값을 받아오는 코드를 작성
@Component
public class SampleListener implements ApplicationRunner {
@Value("${choi.name}")
private String name;
@Value("${choi.age}")
private int age;
@Override
public void run(ApplicationArguments args) throws Exception {
System.out.println("===========================");
System.out.println(name);
System.out.println(age);
System.out.println("===========================");
}
}
이때 src의 application.properties 빌드를 마치고 test의 application.properties 빌드를 시작한다.
이때 에러가 발생한다.
test의 application.properties에는 age가 없기 때문이다.(test의 application.properties에도 age를 설정해야 한다.)
3. @SpringBootTest 애노테이션의 properties 애트리뷰트
@ExtendWith(SpringExtension.class)
@SpringBootTest(properties = "choi.name = junwoo2")
class SpringinitApplicationTests {
@Autowired
Environment environment;
@Test
@DisplayName("test")
void contextLoads() {
assertEquals(environment.getProperty("choi.name"),"junwoo2");
}
}
4. 커맨드 라인 아규먼트
mavn package
java -jar target/springinit-0.0.1-SNAPSHOT.jar --choi.name=choijunwoo
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)
랜덤 값 설정하기
- ${random.*}
플레이스 홀더
- name = keesun
- fullName = ${name} baik
src properties에는 값이 있고 test properties에는 값이 없는 경우 대처법
test properties를 지우면 된다.
test의 properties가 없으니 test는 src의 properties만 참조하기 때문이다.
test에서 내가 바꾸고 싶은 값이 너무 많은 경우 대처법
test > resource > test.properties.txt 지정
application.properties 우선순위
높은 게 낮은걸 덮어쓴다.
1. file:./config/
2. file:./
3. classpath:/config/
4. classpath:/
코드 참조
https://github.com/mike6321/Spring/tree/master/SpringBoot/springinit
'Spring > Spring Boot' 카테고리의 다른 글
(SpringBoot) Logging (0) | 2020.01.05 |
---|---|
(SpringBoot) 프로파일 (0) | 2020.01.05 |
(SpringBoot) 외부설정(2) (0) | 2020.01.04 |
(SpringBoot) SpringApplication(2) (0) | 2020.01.03 |
(SpringBoot) SpringApplication(1) (0) | 2020.01.02 |