ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [Spring Boot] 추가 설정 파일 사용하기(.properties .yml)
    Spring 2022. 9. 18. 18:05
    반응형

     

    스프링 부트는 설정 파일 형식으로 .properties 또는 .yml(.yaml) 파일 형식으로 설정파일을 작성할 수 있다. 또한 src/main/resources 디렉토리 하위에 있는 application.properties 파일에 있는 설정 값들을 런타임에 불러오기 때문에 별다른 설정 없이 설정 값들을 사용할 수 있다.

    설정파일에 등록된 설정값은 다음과 같이 Bean 내부에서 @Value 어노테이션을 통해 값을 주입받기도 한다.

    @Getter
    @Component
    public class Device {
        private String model;
    
        private Integer serialNo;
        
        public Device(
                @Value("${device.model}") String model,
                @Value("${device.serialNo}") Integer serialNo) {
            this.model = model;
            this.serialNo = serialNo;
        }
    }

    그런데 프로젝트가 커지다보면 필요한 설정 값들이 많아지는데, 유지보수성을 위해 스프링과 관련된 설정들은 application.properties 에, 그 외 프로젝트에 필요한 추가적인 설정 값은 설정 파일을 분리해서 작성하는 경우가 많다.

    위 예시의 경우 application.properties가 위치한 src/main/resources 디렉토리 하위에 device.properties 같은 추가 설정 파일을 생성하고 필요한 설정 값 device.model, device.serialNo 를 작성할 수 있다.

    device.properties

    device.model=MacBook
    device.serialNo=1234

    .yml 형식 설정파일의 경우 다음과 같이 만들 수 있다.

    device.yml

    device:
      model: MacBook
      serialNo: 1234

    하지만 src/main/resources 디렉토리 하위에 파일만 작성해 두는 것으로는, 스프링 부트는 해당 설정 파일에 등록된 설정 값들을 불러오지 않는다. 스프링 부트 2.4 버전을 기준으로 추가 설정 파일에 등록된 설정 값들을 불러오는 방법을 알아보자.

    Spring Boot 2.4 이상

    Spring Boot 2.4 이상에서는 application.properties 또는 application.yml 파일에 spring.config.import 설정값으로 파일 경로를 지정함으로써 추가 설정파일을 불러올 수 있다.

    .properties

    그리고 application.properties 파일에 추가 설정파일을 불러오도록 spring.config.import 값으로 추가 설정 파일의 경로를 지정해줄 수 있다.

    application.properties

    spring.config.import=device.properties

    설정 파일이 여러개일 경우, 여러개를 같이 넘겨줄 수도 있다.

    spring.config.import=device.properties,other.properties

    .yml

    .yml 형식에서는 application.yml 파일에 추가 설정파일을 불러오도록  spring.config.import 값을 다음가 같이 설정해서 사용할 수 있다.

    application.yml

    spring:
      config:
        import: device.yml

    설정 파일이 여러개일 경우, 배열 형식으로 넘겨줄 수 있다.

    spring:
      config:
        import:
          - device.yml
          - other.yml

    Spring Boot 2.4 이전

    .properties

    스프링 부트에게 @PropertySource 어노테이션으로 device.properities 파일의 경로를 알려줘서 설정 값을 불러오라고 알려주어야 스프링 부트가 device.model, device.serialNo 값을 찾아서 해당 값을 필요로 하는 bean에 주입해줄 수 있다.

    @Getter
    @Component
    @PropertySource("classpath:/device.properties")
    public class Device {
        // ...
    }

    또는 어플리케이션의 진입점이 되는 main 메서드가 정의된 SpringBootApplication 클래스에 정의할 수도 있다.

    @SpringBootApplication
    @PropertySource("classpath:/device.properties")
    public class MyApplication {
    
    	public static void main(String[] args) {
    		SpringApplication.run(MyApplication.class, args);
    	}
    }

    만약 추가 설정파일이 여러개일 경우, @PropertySources 어노테이션을 사용해 배열로 묶어서 깔끔하게 정의할 수 있다.

    @SpringBootApplication
    @PropertySources({
        @PropertySource("classpath:/device.properties"),
        @PropertySource("classpath:/other.properties")
    })
    public class MyApplication {
    
    	public static void main(String[] args) {
    		SpringApplication.run(MyApplication.class, args);
    	}
    }

    테스트 코드에서 특정 .properties 설정 파일을 사용하는 경우 @TestPropertySource 어노테이션을 사용할 수 있다.

    @SpringBootTest
    @TestPropertySource("classpath:/device.properties")
    public class DeviceTest {
        // ...
    }

    .yml

    @PropertySource는 .properties 설정 파일을 위한 어노테이션이므로 .yml 설정파일을 불러오는데에는 사용되지 않는다.

    YamlPropertiesFactoryBean을 사용하는 PropertySourceFactory 빈을 구현해서 factory로 넘겨주면, @PropertySource 어노테이션으로 yml 설정파일을 불러와서 사용할 수는 있다.(링크)

    spring.config.location 의 값으로 .yml 파일들의 위치를 콤마(,)로 분리해서 넘겨주면 된다.

    public class MyApplication {
    
        public static void main(String[] args) {
            new SpringApplicationBuilder(Application.class)
                .properties("spring.config.location=classpath:/application.yml,classpath:/device-config.yml")
                .run(args);
    }

    테스트 코드에서는 다음과 같이 @SpringBootTest 어노테이션의 properties에 동일한 값을 넘겨줘서 사용할 수 있다.

    @SpringBootTest(
        properties = "spring.config.location=classpath:/application.yml,classpath:/device-config.yml"
    )
    public class DeviceTest {
        // ...
    }

    References

    반응형

    댓글

Designed by Tistory.