The Twelve-Factor App

3. 설정(Config)

환경 변수에 설정 저장하기

어플리케이션의 설정은 개발, 스테이징, 프로덕션등 다양한 배포 환경에 대해서 유일한 차이에 해당한다. 설정에는 아래와 같은 것들을 포함된다.

때때로 프로그래머들은 어플리케이션 내부에 설정 정보를 저장하기도 한다. 이는 Twelve-Factor에 위배되는 것으로, 설정 정보는 엄격히 코드와 분리되어야한다. 설정은 배포 환경에 따라서 달라지지만 코드는 달라지지 않는다.

어플리케이션에서 설정이 분리되어있는 지 여부를 확인할 수 있는 간단한 방법은, 어플리케이션 내부에 어떠한 인증 정보도 포함시키지 않고 지금 당장 오픈소스로 공개할 수 있는 지 검토해보는 것이다.

여기서 “설정”이라는 단어의 정의는 어플리케이션 자체에 영향을 주는 설정은 포함하지 않는다는 점에 주의할 필요가 있다. 예를 들어 레일스의 config/routes.rb나 스프링의 코드 모듈들이 어떻게 연결되어있는 지는 어플리케이션 내부 설정이다. 이러한 설정들은 배포 환경 사이에 별 차이가 없으므로 코드에 저장하는 게 좋다.

설정을 코드와 분리하기 위해 설정 정보를 담은 파일을 버전 관리에 포함시키지 않는 방법도 있다. 예를 들어 레일스 프로젝트에서는 config/database.yml 파일을 저장소에 포함시키지 않는다. 이 방법은 설정 정보를 버전 관리 시스템에 포함된 파일 내의 상수로 저장하는 것보다는 장족의 발전이지만 여전히 몇 가지 문제를 가지고 있다. 먼저 설정 파일을 버전 관리에 포함시키는 실수를 하기 쉽고, 설정 파일이 서로 다른 장소에 서로 다른 포맷으로 저장될 가능성이 있어, 설정을 같은 위치에서 일괄적으로 관리하기가 어려워진다. 또한 이러한 형식은 여전히 특정 프로그래밍 언어나 특정 프레임워크에 의존적일 수밖에 없다.

Twelve-Factor App에서는 설정을 환경 변수(environment variables)에 저장한다. 환경변수를 사용하면 코드 수정 없이 설정을 쉽게 변경할 수 있다. 설정 파일과는 달리 실수로 저장소에 설정을 포함시킬 가능성도 낮다. 나아가 독자적인 형식의 설정 파일이나 자바 시스템 프로퍼티와 같은 설정 형식과 달리 환경변수는 언어나 OS에 의존하지 않는 표준이다.

설정 관리에서 또 하나 염두해야하는 것은 설정을 모아 그룹화하는 부분이다. 어플리케이션 설정은 이름으로(환경(environment)이라고도 한다)으로 구분되기도 한다. 예를 들어 일반적으로 레일스 어플리케이션에서는 developmenttest, production 환경을 사용한다. 하지만 이는 환경을 확장하는데 적합하지 않다. 이를 테면 어플리케이션 배포가 늘어감에 따라 staging이나 qa와 새로운 이름이 필요해진다. 프로젝트가 커져감에 따라 프로그래머는 joes-staging과 같은 자신만의 환경을 추가하기도 한다. 결과적으로 서로 다른 설정을 가진 환경은 폭발적으로 늘어나며 배포를 관리하는 일은 매우 어려워진다.

Twelve-Factor App의 환경변수들은 세밀하게 관리되며 각각의 환경변수는 서로에 대해 직교한다. 환경변수가 “환경”으로 그룹화되어지지는 않지만 대신에 각 배포에 대해서 독립적으로 관리된다. 환경변수를 통해 설정을 관리하는 방식은 어플리케이션이 더 많은 배포로 확장되어가는 데 있어서 자연스럽게 확장 가능하도록 유도하는 모델이다.