Spring Boot | 외부 설정 이용 | 프로퍼티 파일(properties)

기본

폴더 구성

|-build.gradle
`-src/main/
  |-java/sample/springboot/
  |  `-Main.java
  `-resources/
    `-application.properties

Main.java

package sample.springboot;

import org.springframework.beans.factory.annotation.Value;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.ConfigurableApplicationContext;

@SpringBootApplication
public class Main {

    public static void main(String[] args) {
        try (ConfigurableApplicationContext ctx = SpringApplication.run(Main.class, args)) {
            Main m = ctx.getBean(Main.class);
            m.hello();
        }
    }

    @Value("${sample.value}")
    private String value;

    public void hello() {
        System.out.println("sample.value = " + this.value);
    }
}

실행 결과

sample.value = Hello Properties File!!
  • 클래스 경로 아래에 application.properties라는 속성 파일을 배치한다.
  • 그러면 Spring Boot가 자동으로 해당 파일을 읽어 준다.
  • 속성 파일의 값은 @Value 애노테이션을 사용하여 Bean에 주입 할 수있다.
  • ${프로퍼티 이름} 형식으로 취득하고자 하는 값을 지정한다.

파일을 두는 위치

속성 파일의 두는 곳은 몇 가지 읽기의 우선 순위가 존재한다.

  1. 시작할 때 –spring.config.location에서 지정한 파일.
  2. 현재 디렉토리 바로 아래의 config 디렉토리에 있는 파일.
  3. 현재 디렉토리에있는 파일.
  4. 클래스 경로 바로 아래의 config 패키지에 있는 파일.
  5. 클래스 경로 바로 아래에 있는 파일.

숫자가 낮을 수록 우선 순위가 높다.
우선 순위가 낮은 설정은 상위의 설정을 덮어 쓴다.

폴더 구성(jar내부)

|-application.properties
|-config/
|  `-application.properties
`-sample/springboot/
   `-Main.class

폴더 구성(실행할 때)

|-application.properties
|-other.properties
|-config/
| `-application.properties
`-build/libs/
  `-spring-boot-sample.jar

other.properties

value5=other

application.properties(현재 디렉토리의 config 디렉토리 아래)

value4=currentdir/config
value5=currentdir/config

application.properties(현재 디렉토리 아래)

value3=currentdir/
value4=currentdir/
value5=currentdir/

application.properties(클래스 경로의 config 패키지 아래)

value2=classpath/config
value3=classpath/config
value4=classpath/config
value5=classpath/config

application.properties(클래스 경로 바로 아래)

value1=classpath/
value2=classpath/
value3=classpath/
value4=classpath/
value5=classpath/

Main.java

package sample.springboot;

import org.springframework.beans.factory.annotation.Value;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.ConfigurableApplicationContext;

@SpringBootApplication
public class Main {

    public static void main(String[] args) {
        try (ConfigurableApplicationContext ctx = SpringApplication.run(Main.class, args)) {
            Main m = ctx.getBean(Main.class);
            m.hello();
        }
    }

    @Value("${value1}") private String value1;
    @Value("${value2}") private String value2;
    @Value("${value3}") private String value3;
    @Value("${value4}") private String value4;
    @Value("${value5}") private String value5;

    public void hello() {
        System.out.println("value1=" + value1);
        System.out.println("value2=" + value2);
        System.out.println("value3=" + value3);
        System.out.println("value4=" + value4);
        System.out.println("value5=" + value5);
    }
}

실행

$ java -jar build/libs/spring-boot-sample.jar --spring.config.location=other.properties

value1=classpath/
value2=classpath/config
value3=currentdir/
value4=currentdir/config
value5=other

우선 순위에 맞게 설정을 덮어 쓰고 있다.

프로파일을 지정

폴더 구성

|-application.properties
|-application-develop.properties
`-build/libs/
   `-spring-boot-sample.jar

application.properties

value=release module

application-develop.properties

value=develop module

실행

$ java -jar build/libs/spring-boot-sample.jar

value=release module

$ java -jar build/libs/spring-boot-sample.jar --spring.profiles.active=develop

value=develop module
  • 프로퍼티 파일을 application-[프로파일 이름].properties 형식으로 작성한다.
  • 커멘트 라인 인수로 spring.profiles.active에 사용하려는 프로파일 이름을 지정한다.    - 커멘드 라인 인수 이외에도 시스템 속성이나 OS의 환경 변수도 지정 가능.
  • 그러면 지정된 프로파일에 해당하는 속성 파일이 읽혀진다.