The Twelve-Factor App

시작하며

최근에는 일반적으로 소프트웨어가 서비스로서 제공되며 웹 어플리케이션(web app)이나 서비스로서의 소프트웨어(software-as-a-service)라고 불린다. Twelve-Factor App은 아래와 같은 “서비스로서의 소프트웨어”를 만드는 방법론이다.

Twelve-Factor App 방법론은 어떤 프로그래밍 언어로 만들어진 어플리케이션에도 적용할 수 있다. 또한 어떤 백엔드 서비스(데이터베이스, 큐, 메모리 캐시 등등)에도 적용할 수 있다.

배경

이 문서의 저자는 수백개 어플리케이션의 개발과 배포에 직접적으로 관여했으며, 히로쿠(Heroku) 플랫폼에서 일하면서 수천개 어플리케이션의 개발(development), 운용(operation), 확장(scaling)에 간접적으로 참여했다.

이 문서는 실무에서 다양하게 사용되는 “서비스로서의 소프트웨어” 어플리케이션들에 대한 우리의 모든 경험과 관찰을 집약한 책이다. 이는 어플리케이션 개발의 이상적인 프렉티스에 대한 삼각측량과 같다. 여기서는 특히 시간에 따른 어플리케이션의 유기적 성장에 대한 역학, 어플리케이션의 코드베이스를 둘러썬 프로그래머 간 협업의 역학, 그리고 소프트웨어 부패에 대한 비용 회피에 주목하고 있다.

이 책을 집필한 동기는, 우리가 모던한 어플리케이션 개발에서 부딪혀온 특정한 종류의 시스템 문제에 대한 관심을 높이고자함이다. 나아가 이러한 문제를 논의 하기 위한 어휘를 제공하고, 이 문제에 대한 넓고 개념적인 해결책을 전문용어와 함께 제공하는 것이다. 이 책의 형식은 Martin Fowler의 서적 Patterns of Enterprise Application ArchitectureRefactoring의 영향을 받았다.

누가 이 문서를 읽어야 하나요?

서비스로서 작동하는 어플리케이션을 개발하는 모든 프로그래머. 이러한 어플리케이션을 배포하고 관리하는 Ops 엔지니어(서버 관리자)

The Twelve Factors

1. 코드베이스(Codebase)

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

2. 의존성(Dependencies)

명시적인 의존성 선언과 분리

3. 설정(Config)

환경변수에 설정 저장하기

4. 백엔드 서비스(Backing Services)

백엔드 서비스를 어플리케이션에 붙여진 리소스(attched resources)로 다루기

5. 빌드(Build), 릴리스(Release), 실행(Run)

빌드와 실행 단계 엄밀하게 분리하기

6. 프로세스(Processes)

어플리케이션을 하나나 다수의 상태 없는 프로세스로 실행하기

7. 포트 바인딩(Port binding)

포트 바인딩으로 서비스 공개하기

8. 병행성(Concurrency)

스케일 아웃을 위한 프로세스 모델

9. 일회용성(Disposability)

빠른 실행과 정상적 종료를 통해 견고성 최대화하기

10. 개발 / 프로덕션 일치(Dev/Prod parity)

개발, 스테이징, 프로덕션 환경을 최대한 일치시키기

11. 로그(Logs)

로그를 이벤트 스트림으로 다루기

12. 관리 프로세스(Admin processes)

관리 작업을 일회용 프로세스로 실행하기