The Twelve Factor App

원본 : https://12factor.net/ko/ 과 자체적인 해석을 곁들여(?) 작성하였습니다.

SaaS (Software As A Service)란 소프트웨어를 서비스 형태로 제공하는 형태를 말한다. 그리고 Twelve-Factor App은 이러한 소프트웨어를 만들기 위한 방법론 중 하나이다.

  • 설정 자동화를 위한 절차를 체계화하여 개발 환경을 쉽게 꾸릴 수 있도록 만든다.
  • OS에 따라 달라지는 부분을 명확히 하고, 실행 환경 사이의 이식성을 극대화한다.
  • 클라우드 플랫폼을 통해 서버와 시스템의 관리를 줄인다.
  • 개발 환경과 운영 환경의 차이를 최소화하고, 민첩성을 극대화시킨다.
  • 쉽게 확장할 수 있게 한다.

1. 코드베이스

  • 버전 컨트롤 시스템을 이용하여 코드를 관리해야다.
  • 코드베이스와 앱은 항상 일대일 관계가 성립되야한다.
  • 여러 개의 코드베이스가 있고 이들이 코드를 공유하고 있는 상황이라면 공유하는 코드를 라이브러리화 시키고, 이를 종속성 매니저로 관리해야 한다. (보통 프로젝트의 common 라이브러리 정도인가?)
  • 프로그램과 프로세스의 차이처럼 앱과 배포는 일대다의 관계이다. (배포 = 실행중인 앱)

2. 종속성

  • 전체 시스템에 특정 패키지가 암묵적으로 존재하면 안되고 종속성 분리 툴을 이용하여 패키지 명시적으로 선언되어 있어야 한다
  • 그레이들, 메이븐 같은 툴에서 디펜던시를 설정하는 것을 말하는 것이 아닐까?

3. 설정

  • 애플리케이션의 설정이란 배포마다 달라질 수 있는 모든 것을 말한다.

  • 프로덕션 데이터베이스, 개발용 데이터베이스, 레디스 등의 리소스
  • 설정을 코드에서 분리해야 한다. = application.yml에 리소스 이름이나 패스워드 등등의 정보가 그대로 쓰여져 있으면 안된다
  • AWS System Manager 의 파라미터 스토어?

4. 백엔드 서비스

  • 데이터베이스, 메시지 큐, STMP 서비스, 캐시 시스템 모두 백엔드 서비스이며 Twelve-Factor App 애플리케이션에게는 모두 연결된 리소스라고 취급한다.
  • 리소스는 자유롭게 배포에 연결되거나 분리될 수 있어야한다. 예를 들면 연결된 데이터베이스의 문제가 생겼을 경우 코드를 직접 수정하지 않고 이를 간단하게 다른 리소스로 연결할 수 있어야 한다.

5. 빌드, 릴리즈, 실행

  • 코드베이스에서 배포까지 총 3단계(빌드, 릴리즈, 실행)를 거치게 된다.
    • 빌드 : 저장소에 저장된 코드를 실행 가능한 형식으로 변환시키는 단계
    • 릴리즈 : 빌드 단계에서 만들어진 결과물과 설정을 결합하는 단계
    • 실행 : 애플리케이션이 실행
  • 빌드는 새로운 코드가 배포 될 때마다 개발자에 의해 시작된다. 반면 실행 단계는 문제가 있을 경우 자동으로 실행 될 수 있어야 한다. 따라서 실행 이전까지의 단계는 복잡해도 좋지만 실행 단계는 복잡하면 안된다.

6. 프로세스

  • 애플리케이션을 하나 혹은 여러개의 무상태 프로세스로 실행
  • 각 인스턴스는 메모리나 디스크에 저장된 내용을 공유하지 않아야 한다.