12 Factor App은 Heroku라는 관리형 컨테이너 시스템을 기반으로 하는 서비스형 플랫폼에서 운영되는 SaaS 앱들을 관찰하면서 이상적인 앱을 구축하기 위한 가이드라인을 제시하고 있다.

사이트를 방문하면 한글 버전의 내용이 제공되지만 영어 원문 자체도 어렵고, 한글로 번역하면서 의미 전달이 더 어려워 진 것 같아 나름대로 내용을 의역하여 정리 해 보려고 한다.

요즘은 12 Factor app을 8개나 5개 줄여서 간단하게 정리하고 있는곳도 있는데, 내 블로그에서는 모든 항목들을 다루지만 각 항목에 대해 간단하게 설명 하도록 하겠다.

1. Code base

버전 관리되는 하나의 코드베이스와 다양한 배포

Code base는 하나의 앱은 하나의 코드 저장소에서 관리 해야 한다는 말이다. 

일단 전제조건으로 소스코드 저장소를 사용 하는것을 전제로 하고 있다. 중앙집중식인 Subversion을 사용하던 분산 버전관리 툴인Git을 사용하던 특정 소스코드 관리도구를 사용 하도록 가이드 하고 있지는 않으나, 개인적인 의견으로는 특별히 Subversion의 기능이 필요한 프로젝트 환경이 아니라면 Git의 사용을 권장 한다.

하나의 앱과 코드 저장소는 1:1관계가 가 성립해야 한다. 만약 하나의 앱이 다른 저장소에 각각 관리가 된다면, 이는 두개의 분산 시스템으로 간주 해야 한다. 이럴 경우 각각 저장소를 하나의 앱으로 간주하여 관리 해야 한다. 

12 factor app이 아무래도 클라우드 서비스에서의 상황을 다루다 보니 MSA와 많이 연관이 있는데, MSA 상황에서는 여러 앱들이 상호작용 하면서 하나의 큰 시스템을 구축하게 된다. 이 때, 하나의 서비스(앱)가 많은 다른 서비스(앱)들과 연관관계를 가지고 있어서 하나의 저장소로 분리 하기가 힘들다면, 이는 라이브러리화 하고, 참조 하는 서비스들에 종속성을 명시하는 방법으로 연관성을 분리 해야 한다. 

저장소는 하나이지만, 배포는 여러 환경에 할 수 있다. 보통은 개발을 하고 있는 개발자의 로컬 환경, 개발서버, Stage서버, 운영서버에 각각 배포를 할 수 있다. 이때 환경 관련 정보는 소스코드 저장소에 저장하면 안되는데, 이는 뒤에 설정 부분에서 자세히 설명 하도록 하겠다.