외부설정

김수정·2020년 7월 13일
0

스프링/스프링부트

목록 보기
9/11

application.properties

애플리케이션 관련 설정 파일들을 코드 안 또는 밖에다가 정의해 놓는 것입니다.

  • 스프링 부트가 애플리케이션을 구동할 때 자동으로 로딩합니다.
  • key, value 형태로 값을 정의할 수 있습니다.

프로퍼티 우선순위

프로퍼티를 정의할 수 있는 방법이 워낙 많고, 우선순위가 정해져 있습니다.
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 우선순위

application.properties도 여러 곳에서 만들 수 있기 때문에 이들간의 우선순위가 있습니다.

1) file:./config/
2) file:./
3) classpath:/config/
4) classpath:/

server.port=${random.int}가 아닌 server.port=0으로 설정해야 합니다.
random.int는 사용하면 안되는 포트 번호를 알지 못하기 때문입니다.

오버라이딩 피하기

같은 파일이면 전부 오버라이딩 되어서 만일 소스에서는 있었던 프로퍼티가 테스트 설정 파일에서는 없다면 오류가 납니다.
이를 방지하기 위해 이름을 달리하고 그 이름을 어노테이션에 location으로 경로를 지정해줍니다. 그러면 중복되는 키 값만 오버라이딩됩니다.

class로 properties만들기

큰 의미는 아니지만 타입세이프 하다는 장점이 있습니다.

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("===================");
    }
}
profile
정리하는 개발자

0개의 댓글