본문 바로가기

Spring Boot

[SpringBoot] 환경 설정 파일

 

어플리케이션을 실행하면 다음 위치에 있는 application.properties 설정 파일을 읽어들인다.

 

① 현재 디렉토리의 /config 서브 디렉토리
② 현재 디렉토리
③ 클래스 경로의 /config 패키지
④ 클래스 경로의 루트

 

위에서부터 순서대로 우선 순위가 높게 설정되어 있어 여러 설정 파일이 존재하는 경우에는

 

순위가 우선인 설정값으로 덮어 쓰이게 된다.

 

 

설정 파일은 프로파일( profile )이라는 단위로 별도의 설정을 가진다.

 

개발 환경, 프로덕션 환경 등 환경별로 설정을 나누고 싶은 경우에는

 

application-{ profile }.properties의 명명 규칙으로 설정파일을 만든다.

 

예를 들어 프로덕션 환경경의 프로파일명을 production으로 한 경우,

 

application-production.properties라는 설정 파일에 프로덕션 환경 설정을 작성한다.

 

프로파일별 설정은 application.properties 설정을 덮어 쓰기 때문에 모든 설정을

 

프로파일별 설정으로 작성할 필요가 없다.

 

// @File application.properties
// @See application-{ profile }.properties을 기본적인 형식 설정

foo.remote-address=192.168.1.1
foo.security.username=admin

 

설정 파일의 작성은 YAML로도 가능하다.

 

YAML의 경우 아래 예제처럼 이루어져 있어 알아보기 좋고 쉽게 관리할 수 있다.

 

YAML 형식의 설정을 사용하려면 application.properties 대신에 application.yml 파일을 배치하면 자동 로드된다.

 

// @File application.yml
// @See YAML의 형식 설정


foo:
  remote-address : 192.168.1.1
  security :
    username : admin

 

 

설정 파일에 작성한 설정값은 프로그램에서 간단히 이용할 수 있다.

 

프로그램에서 이용하는 방법은 아래 예제처럼 구조화된 설정 클래스로 읽어 들이는 방법과

 

@Value를 사용하여  프로그램에서 클래스의 필드로 설정값을 하나씩 읽어 들이는 방법이 있다.

 

// @File
// @See @ConfigurationProperties를 사용하여 프로그램에서 설정값 이용하기

@Component
@ConfigurationProperties( prefix = "foo" )
@Validated
public class SomePojo {

  @NotNull
  InetAddress remoteAddress;

  @Valid
  Security security = new Security();

  public static class Security {

    @NotEmpty
    String username;

    // 게터( getter )와 세터( setters )
  }
}

 

@Validated 어노테이션을 작성하면 빈 검증( bean validation )으로 속성값을 체크한다.

 

제약 조건을 위반한 값이 설정되면 어플리케이이션 실행 시 예외가 발생하므로 설정이 빠져 있거나

 

설정이 틀린것을 바로 발견할 수 있다.

 

@ConfigurationProperties 어노테이션을 이용하면 느슨한 바인딩( realxed binding )이 이루어지기 때문에

 

다음 예시처럼 클래스의 변수와 설정 파일의 키가 정확히 일치하지 않아도 느슨하게 바인딩 된다.

 

  • foo.remoteAddress
  • foo.remote-address
  • foo.remote_address
  • FOO_REMOTE_ADDRESS

 

// @See @Value를 사용하여 프로그램에서 설정값 사용하기

@Component
public class SomePojo {

  @Value( "${ foo.remote-address }" )
  String remoteAddress;

  @Value( "${ foo.security.username }" )
  String securityUsername;
}

 


 

P.S ) 외부 설정 파일의 종류

 

스프링 부트에서는 명령줄 인수나 환경 변수 등 다양한 외부 설정 파일을 사용할 수 있다.

 

설정이 활성화되면 우선 순위에 따라 순위가 높은 설정 방법의 값이 사용된다.

 

 

ex01) 환경 변수로 설정값 전달하기

$ SPRING_APPLICATION_JSON = '{ "name" : { "name" : "test" } }' java -jar

 

환경 변수로 설정값을 전달하는 경우, 대문자의 스네이크 케이스로 지정한다.

 

 

ex02)  시스템 속성으로 설정값 전달하기

$ java -Dspring.application.json = '{ "name" : "test" }' -jar myapp.jar

 

 

ex03) 명령줄 인수로 설정값 전달하기

$ java -jar myapp.jar --spring.application.json = '{ "name" : "test" }'