본문 바로가기

Spring/Spring Boot

(SpringBoot) 외부설정(1)

https://docs.spring.io/spring-boot/docs/current/reference/htmlsingle/#boot-features-external-c%20onfig

 

Spring Boot Reference Documentation

This section goes into more detail about how you should use Spring Boot. It covers topics such as build systems, auto-configuration, and how to run your applications. We also cover some Spring Boot best practices. Although there is nothing particularly spe

docs.spring.io

 

 

애플리케이션이 실행될 때 자동으로 로딩

key : value 형태로 저장

 

 


기본적인 사용방법

설정파일에서 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 코드 실행결과 에러 발생

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 지정

test.properties 설정
파일 설정

 

application.properties 우선순위

높은 게 낮은걸 덮어쓴다.

 

1. file:./config/

2. file:./

3. classpath:/config/

4. classpath:/


코드 참조

https://github.com/mike6321/Spring/tree/master/SpringBoot/springinit

 

mike6321/Spring

Contribute to mike6321/Spring development by creating an account on GitHub.

github.com

 

'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