2 분 소요


The Twelve-Factor App을 번역하여 정리한 글입니다.




12-요소 앱

소개

요즘 소프트웨어는 일반적으로 서비스로 제공됩니다:
이를 웹 앱이나 서비스로서의-소프트웨어(software-as-a-service)라고 합니다.

12-요소 앱은 다음과 같은 서비스로서의-소프트웨어 앱을 구축하기 위한 방법론입니다:

  • 설정 자동화를 위해 선언적인(declarative) 형식을 사용하여 새로 프로젝트에
    참여하는 개발자가 적응하는데 시간과 비용을 최소화합니다;
  • 기본 운영 체제와 깨끗한 계약(clean contract) 을 맺고 실행 환경 간
    최대한의 이식성을 제공합니다;
  • 최신 클라우드 플랫폼 에 배포하기 적합하므로 서버 및 시스템 관리가
    필요하지 않습니다;
  • 개발과 생산 사이의 차이를 최소화 하여 민첩성을 극대화하기위한
    지속적인 배포 를 가능하게 합니다;
  • 또한 도구, 아키텍처 또는 개발 업무(development practices)를
    크게 변경하지 않고 확장 할 수 있습니다.

12 단계 방법론은 작성된 프로그래밍 언어에 관계없고 백엔드 서비스
(데이터베이스, 큐, 메모리 캐시 등)의 조합을 사용하는 앱에 적용할 수 있습니다.



배경

이 문서의 기고자는 수백 개의 앱 개발 및 배포에 직접 참여했으며
Heroku 플랫폼 에서의 작업을 통해 수 십만 개의 앱을 개발, 운영 및
확장하는 것을 간접적으로 목격했습니다.

이 문서는 실무에서의 다양한 SaaS(Software-as-a-Service) 앱에 대한 모든 경험과 관찰을
정리했습니다. 앱 개발을 위한 이상적인 실무에 대한 삼각 측량으로,

  • 지속적으로 앱이 자체 성장하는 원동력,
  • 앱의 코드베이스로 작업하는 개발자 간의 협업에 대한 원동력,
  • 그리고 소프트웨어 침식 비용을 방지하는 것에

특히 주의를 기울여야 합니다.

우리의 목표는 현대 앱 개발의 몇 가지 시스템 문제에 대한 인식을 높이고,
논의하기 위한 공유된 용어를 제공하며, 관련 용어와 함께 이런 문제에 대한
광범위하고 개념적인 솔루션을 제공하는 것입니다.

이 형식은 Martin Fowler의 책 Patterns of Enterprise Application Architecture and
Refactoring
에서 영감을 받았습니다.



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

서비스로 실행되는 앱을 구축하는 모든 개발자.
이러한 앱을 배포하거나 관리하는 운영 엔지니어입니다.




12-요소(The Twelve Factors)

12-요소에 대해 간단히 소개합니다.
자세한 설명은 링크를 참고하세요


I. 코드베이스(Codebase)

리비전 컨트롤로 관리되는 코드베이스는 하나지만, 배포(deploy)는 여러 개입니다.
배포란 앱의 인스턴스입니다.
여러 배포들은 서로 다른 버전일 수도 있지만, 모든 배포의 코드베이스는 하나입니다.

II. 종속성(Dependencies)

시스템 전체에 적용되는 패키지가 설치되어 있다고 전제하지 않습니다.
종속성을 명시적으로 선언하고 격리(Isolate)합니다.

III. 설정(Config)

앱 설정은 다양한 배포 환경에서 유일하게 다른 요소입니다.
앱 내부에 설정 정보가 저장하는 것은 12-요소에 위배됩니다.
코드 수정없이 쉽게 적용하기 위해 환경(Environment)에 설정을 저장합니다.

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

백엔드 서비스란 앱이 실행하면서 네트워크를 통해 사용할 수 있는 모든 서비스를 의미합니다.
백엔드 서비스를 연결된 리소스로 다루어 언제든지 쉽게 붙이거나 떼어낼 수 있습니다.

V. 빌드, 릴리즈, 실행(Build, release, run)

빌드와 실행 단계를 엄격하게 분리합니다.
예를 들어, 런타임에서 변경한 코드를 빌드 스테이지에 역전파할 수 있는 방법은 없으며,
이러한 코드 수정은 불가능합니다.

VI. 프로세스(Processes)

앱을 하나 이상의 상태없는 프로세스로 실행합니다.
프로세스들은 상태가 없고 아무것도 공유하지 않습니다(share-nothing).
오래 보존되어야하는 모든 데이터는 데이터베이스와 같은 백엔드 서비스에 저장합니다.

VII. 포트 바인딩(Port binding)

앱은 완전히 자급자족(self-contained)하여 포트 바인딩으로 서비스를 공개합니다.
포트 바인딩으로 특정 앱이 다른 앱에 대한 백엔드 서비스가 됩니다.

VIII. 동시성(Concurrency)

12-요소 앱에서 프로세스는 일급 시민(first class citizen)에 해당합니다.
서로 다른 종류의 작업을 프로세스 타입에 따라 나누는 방식으로 앱이 다양한 작업을
처리하도록 설계할 수 있습니다. 프로세스 모델을 사용하여 쉽게 확장(Scale-out)할 수 있습니다.

IX. 일회용(Disposability)

프로세스들은 버려질 수 있습니다. 즉 바로 실행하거나 종료할 수 있습니다.
개발자는 항상 프로세스의 기동 시간을 최소화하는 것이 좋습니다.
빠른 시작과 정상 종료를 통해 견고성(Robustness)을 최대화합니다.
앱은 예상할 수 없는 비정상적인 종료에 대응해야 합니다.

X. 개발/프로덕션 일치(Dev/prod parity)

앱은 지속적인 배포(continuous deployment)가 실현 가능하도록 설계해야 합니다. 개발, 스테이징, 그리고 프로덕션을 최대한 동일하게 유지합니다.

XI. 로그(Logs)

앱의 출력 스트림의 목적지나 저장소를 신경쓰지 않습니다.
각 프로세스는 로그를 이벤트 스트림으로 버퍼없이 stdout 에 출력합니다.

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

관리 작업을 일회용 프로세스로 실행합니다.
관리 프로세스들은 장시간에 걸쳐 실행되는 프로세스들과 같은 환경에서 실행되어야 합니다.
이런 프로세스는 특정 릴리스에 맞게 실행되어야 합니다.




참고자료

댓글남기기