개요

스프링부트는 어플리케이션 코드의 변경을 최소화하기 위하여 설정파일, CLI Argument 등 다양한 방법으로 외부 설정을 주입받습니다.

그리고 이러한 외부 설정은 운영, 테스트, 개발 등 실행환경에 따라 달라지게 됩니다. 이를 위해 프로필 별 설정(Profile-specific Properties)이 필요하게 됩니다. 대개 프로필 별 설정파일을 통해 관리하게 됩니다.

스프링부트 공식 문서에서는 설정 파일을 이용할 때 두 가지 방법을 권장합니다. 첫 번째로는 전통적인 방식으로 properties를 이용하는 방법과 두 번째로는 yaml 파일을 이용하는 방법입니다. 공식 문서의 예제 코드 또한 위 두 가지 방법으로 제공됩니다.

properties 예시

spring.application.name=cruncher
spring.datasource.driver-class-name=com.mysql.jdbc.Driver
spring.datasource.url=jdbc:mysql://localhost/test
server.port=9000

yaml 예시

spring:
  application:
    name: "cruncher"
  datasource:
    driver-class-name: "com.mysql.jdbc.Driver"
    url: "jdbc:mysql://localhost/test"
server:
  port: 9000

yaml 파일로 설정 시 장점과 단점은 다음과 같습니다.

장점

1. 계층적 표현 가능

계층적 표현을 통해 코드의 응집도와 가독성이 증가합니다. 같은 계층의 설정이라면 한 곳에 모아서 관리하기에 용이하며 각 설정의 구조도 한 눈에 파악할 수 있습니다. 여러 번 반복해 쓸 필요 없이 하위의 각 설정으로 들여쓰기를 이용하여 추가할 수 있습니다. 특히 어플리케이션이 커지고 설정이 복잡해진 경우 더욱 편리합니다.

2. 중복코드 줄여줌

properties로 설정 시 모든 프로필에 동일한 설정이 적용될 경우 각 파일에 반복된 코드를 모두 넣어줘야 합니다. 하지만 yaml을 이용하면 같은 파일에 --- 구분자를 넣어 각 프로필을 설정할 수 있습니다. 프로필이 없는 설정, 즉 디폴트 설정은 모든 프로필에 동일하게 적용됩니다. 아래 예제와 같이 공통으로 관리하는 설정과 각 프로필 별로 달라지는 설정을 나누어 관리할 수 있습니다.

#공통 환경 설정
server:
  shutdown: graceful
  servlet:
    jsp:
      init-parameters:
        mappedfile: false
  jsp-servlet:
    init-parameters:
      development: true
  max-http-header-size: 2MB

spring:
  datasource:
    hikari:
      max-lifetime: 180000
      maximum-pool-size: 1
      minimum-idle: 1
      idle-timeout: 600000
      pool-name: Logos-pi
      connection-test-query: "select 1+1"
  mvc:
    view:
      prefix: /WEB-INF/jsp/
      suffix: .jsp
  application:
    name: ui
  devtools:
    livereload:
      enabled: true

--- #local 환경 설정

spring:
  profiles:
    active: local
  datasource:
    hikari:
      jdbc-url: "jdbc:mariadb://127.0.0.1:3306/local?useUnicode=true&characterEncoding=utf8"
  tomcat:
    maxActive: 5

server:
  port: 8011

--- #stg 환경 설정
spring:
  profiles: stg
  server:
    port: 8011
    
--- #prd 환경 설정

server:
  port: 80

spring:
  profiles: prd
  datasource:
    tomcat:
      maxActive: 50000
    hikari:
      jdbc-url: "jdbc:mariadb://199.999.99.999:3306/prd?useUnicode=true&characterEncoding=utf8"

3. 기타 유용한 장점

- yml 문법 사용 가능

yml은 xml, json처럼 데이터를 표현하는 양식이지만 문법은 상대적으로 이해하기 쉽고, 가독성이 좋도록 디자인 되었습니다. 또 모든 데이터를 리스트, 해쉬, 스칼라 데이터의 조합으로 적절히 표현할 수 있다는 믿음을 가지고 만들어졌습니다.

위키피디아에서 yaml 설명 보기 이러한 yml의 문법은 스프링부트의 설정문서에서도 사용할 수 있습니다.

배열을 예로 들자면 properties 에서는 아래와 같이 표현하던 것들을

my.servers[0]=dev.example.com
my.servers[1]=another.example.com

yaml에서는 아래와 같이 -를 사용하거나

my:
servers:
	- dev.example.com
	- another.example.com

또는 이렇게 한 줄로 표현합니다.

my:
  servers: [dev.example.com, another.example.com]

자세한 문법은 yaml 공식문서또는 구글 검색을 통해 참고 바랍니다.

- UIF-8 인코딩 지원

properties파일에 한글을 쓰면 인식을 못하여 글자가 깨지게 됩니다. IDE에서 설정하여 깨지지 않도록 하는 방법도 있지만 한 번 깨진 글자를 복구할 순 없습니다. yaml은 UTF-8 인코딩을 지원하므로 깨질 걱정 없이 한글로 주석 등을 달 수 있어 편리합니다.

단점

1. @PropertySource 애너테이션 사용 불가능

스프링부트 공식문서에 나와있는 yaml의 단점입니다. 하지만 @Value 애너테이션으로 대체할 수 있으며 설정파일 내 placeholder(${...}) 등 기본적인 사용 방식은 기존 properties와 동일합니다.

2. 문법이 다소 엄격

개행, 들여쓰기, 띄어쓰기 등을 철저하게 지켜야 합니다. 특히 특수문자 같은 경우 url 등 일정 형식이 아닌 리터럴(ex. 비밀번호, 이메일)의 경우 리터럴"" 표시를 확실히 해주어야 합니다. boolean, integer, float 등 기본적인 타입은 모두 인식 가능합니다. 상식 선에서 따라할 수 있는 것들로 몇 번 작성하면 금방 익숙해질만한 것들입니다.