12-Factor App
12-Factor App은 웹 애플리케이션 또는 서비스형 소프트웨어(SaaS)를 구축하기 위한 아키텍처 방법론이다. 클라우드 플랫폼 제공업체 Heroku의 공동 창립자 Adam Wiggins가 수백만 개의 애플리케이션을 개발, 배포, 운영한 경험을 바탕으로 제안했다. 이 방법론은 클라우드 네이티브 애플리케이션의 자동화, 이식성, 복원력, 확장성을 극대화하는 데 목적이 있다.
12-Factor 방법론은 다음 12가지 원칙으로 구성된다.
- 코드베이스 (Codebase): 버전 관리 시스템(Git, Subversion 등)으로 추적되는 단일 코드베이스를 유지한다. 하나의 코드베이스를 바탕으로 개발, 스테이징, 프로덕션 등 다수의 환경에 배포한다.
- 종속성 (Dependencies): 시스템 전체에 설치된 패키지에 암묵적으로 의존하지 않는다. 모든 종속성은 매니페스트를 통해 명시적으로 선언하고, 종속성 격리 도구를 사용하여 캡슐화한다.
- 설정 (Config): 데이터베이스 연결 정보, 외부 API 키 등 배포 환경에 따라 달라지는 모든 설정은 코드에서 분리한다. 설정 데이터는 환경 변수(Environment Variables)를 통해 주입한다.
- 백엔드 서비스 (Backing Services): 데이터베이스, 메시지 큐, 캐시 시스템 등의 백엔드 서비스는 로컬 서비스와 서드파티 서비스를 구분하지 않고 모두 네트워크를 통해 연결되는 자원으로 취급한다.
- 빌드, 릴리즈, 실행 (Build, release, run): 소프트웨어 배포 과정을 세 단계로 엄격하게 분리한다. 코드를 패키징하는 ‘빌드’, 빌드 결과물에 환경별 설정을 결합하는 ‘릴리즈’, 실제 런타임에서 애플리케이션을 구동하는 ‘실행’으로 나눈다.
- 프로세스 (Processes): 애플리케이션은 하나 이상의 상태 비저장(Stateless) 프로세스로 실행한다. 영구적으로 유지되어야 하는 모든 데이터는 데이터베이스와 같은 상태 저장(Stateful) 백엔드 서비스에 저장한다.
- 포트 바인딩 (Port binding): 애플리케이션은 외부 웹 서버 컨테이너(Tomcat, Apache 등)에 의존하지 않는다. 서비스 자체를 특정 포트에 바인딩하여 HTTP 등의 요청을 직접 수신하고 처리한다.
- 동시성 (Concurrency): 애플리케이션의 확장은 개별 프로세스의 크기를 키우는 방식(Scale-up)이 아닌, 프로세스 모델을 통한 수평적 확장(Scale-out)에 의존한다. 작업 유형에 따라 프로세스를 나누어 동시성을 관리한다.
- 폐기 가능성 (Disposability): 프로세스는 즉시 시작 가능해야 하며, 종료 신호(SIGTERM 등)를 받았을 때 처리 중인 작업을 안전하게 마무리하고 정상 종료(Graceful shutdown)되어야 한다. 이를 통해 탄력적인 확장과 신속한 시스템 복구가 가능하다.
- 개발/프로덕션 환경 일치 (Dev/prod parity): 개발, 스테이징, 프로덕션 환경 간의 차이(시간적, 인적, 도구적 차이)를 최소화한다. 개발자가 작성한 코드는 가능한 한 빨리 프로덕션에 배포되어야 한다.
- 로그 (Logs): 애플리케이션은 내부에서 로그 파일의 생성 및 관리를 직접 처리하지 않는다. 로그를 시간순으로 정렬된 이벤트 스트림으로 취급하여 표준 출력(stdout)으로 내보내고, 수집 및 보관은 별도의 인프라(로그 라우터 등)가 담당하게 한다.
- 관리 프로세스 (Admin processes): 데이터베이스 마이그레이션, 일회성 관리 스크립트 실행 등의 작업은 일반 애플리케이션 프로세스와 동일한 환경(동일한 릴리즈 및 코드베이스)에서 일회성 프로세스로 실행한다.
Sources:
- Wiggins, Adam. “The Twelve-Factor App”. https://12factor.net/
- Red Hat. “What is a 12-factor app?”. https://www.redhat.com/en/topics/cloud-native-apps/what-is-twelve-factor-app
- Amazon Web Services. “Twelve-Factor App methodology - AWS Well-Architected Framework”. https://docs.aws.amazon.com/wellarchitected/latest/serverless-applications-lens/twelve-factor-app-methodology.html