티스토리 뷰

PDR Tech log

12 Factors Explanation

PDR 비비로그 2017.10.10 00:21

 12 Factor App 

생소할 수도 있는 12 Factor App에 대해 알아볼까요? 




Twelve-Factor app은 앱을 만들기 위한 방법론으로써, 

소프트웨어 유지비용을 줄이는 법에 집중하여 이상적인 앱 개발 방법을 생각하고 정의하게 된 방법론입니다. 

하나하나 살펴볼까요?


CODEBASE


코드베이스는 버전관리 시스템에서 지속 관리되고 있는 코드를 말하며, 코드베이스와 앱은 항상 1:1 관계가 성립 됩니다.

코드베이스가 여러개라는 말은 단일 App이 아니라 분산 시스템이라고 말할 수 있습니다.

앱 배포는 여러개가 될 수 있는데 앱 배포란 실행중인 인스턴스를 가리킵니다.

즉 운영 사이트, 테스트 사이트, 로컬 개발 환경에서 각각 앱을 실행 하는 것은 배포라고 합니다.


DEPENDENCIES


시스템 내 특정 패키지가 암묵적으로 존재하면 안되며, 모든 종속성을 완전하고 엄격하게 선언해야합니다.

예를들어 npm같은 종속성 관리툴을 사용하여 종속성을 선언 및 분리할 수 있습니다.


CONFIG

앱의 설정은 배포마다 달라지는 값을 의미하는데 이 설정들은 환경 변수로 저장해야 합니다.
설정 관리는 아래와 같은 방법들이 있습니다.

1. 코드에 저장
2. 파일로 저장하고 VCS로 관리
3. 파일로 저장하지만 VCS로 관리하지 않음

민감정보들이 유출되는 단점들을 지양하고 애플리케이션의 재 배포없이 변경사항을 반영하는 구조를 지향해야합니다. 


BACKING SERVICES


백엔드 서비스는 네트워크를 통해 이용하는 서비스를 말합니다.

예를들어 코드 수정 없이 로컬 데이터베이스를 다른 서드파티 데이터베이스로 변경할 수 있어야 한다.

수정하는 것은 설정(환경 변수) 뿐입니다. 즉, 데이터베이스, Amazon S3 모두 하나의 리소스로 취급 합니다.


BUILD, RELEASE, RUN


코드베이스는 3단계를 거쳐 배포됩니다.


1. 빌드단계는 버전(Tag)로 체크아웃하여 지정된 버전을 사용하며, 

TypeScript를 Plain JavaScript로 변환하는 과정이라고 말할 수 있습니다.

2. 릴리즈 단계는 배포의 환경변수를 저장합니다. 

3. 실행(런타임)단계는 애플리케이션을 실행 환경에서 돌아가도록 합니다.


모든 릴리즈는 유니크한 아이디(버전이름)를 지녀야 합니다.

릴리즈는 추가만 될 수 있으며, 만들어진 릴리즈는 변경 될 수 없습니다.


PROCESSES

프로세스는 무상태이며, 메모리, 디스크를 공유하지 않습니다.
자원은 네트워크를 통한 데이터베이스 등 안정된 저장소를 이용합니다.

웹 시스템은 Sticky Session과 같이 유저 세션을 메모리에 저장하는 방법은, 
물리적 문제, 서버 에러, 재 배포 등 여러 요인으로 재 실행되면 메모리도 비워지기 때문에 사용해선 안됩니다.
시작과 끝이 분명한 단일 트랜잭션인 경우 사용해도 됩니다.

PORT BINDING

앱은 독립적으로 동작 해야합니다.
예를들어 PHP는 Apache나 Nginx 웹서버 종류에 상관없이 동작 해야합니다. 
즉, Apache에 의존되는 PHP코드를 작성해서는 안됩니다.

로컬 개발 환경에서는 port를 명시적으로 사용합니다.
(http://localhost:5000)
배포에서는 공개된 호스트로 요청하지만 그 호스트는 해당 port로 바인딩됩니다.
(http://test-api => 123.123.123.123:5000)
포트 바인딩을 이용하여 백엔드 서비스간 커뮤니케이션을 합니다.

CONCURRENCY

애플리케이션은 수직, 수평적 확장을 고려해 설계해야 합니다.
수직적 확장은 인스턴스를 추가하거나 제거하는 Scale Out을 의미하며, 
수평적 확장은 다른 일을 하는 프로세스를 추가하거나 제거하는 것이다.
애플리케이션이 Scale Out하는 코드를 가지지 않습니다.

애플리케이션이 무상태인 것은 프로세스간 공유하는 자원이 없기 때문에 동시성 확장하는데 안정적 입니다.
동시성 확장을 고려하면 Docker Clustering을 적용하는데 유리합니다.

DISPOSABILITY

프로세스의 시작과 종료가 빠르게 완료되어야 합니다. 빠른 시작은 프로세스 종료에 빠르게 대응하여 안정성을 높여주기 때문입니다.
프로세스 종료는 현재 요청을 마저 처리 후 종료되어야 합니다. 현재 요청을 처리하는 동안 새로운 요청은 막아야 합니다.
예기치 못한 종료에도 대응할 수 있어야 합니다.

DEV/PROD PARITY

로컬 개발 환경과 운영 환경은 같아야 합니다.
서버는 MySQL, 로컬은 SQLite와 같이 가벼운 서비스를 사용할 수 있으나 이는 운영에서 오류를 야기하기도 합니다.
Homebrew,  Vagrant 등 가상 환경을 사용하여 운영 환경과 같게 유지하는 것은 어렵지 않습니다. 
따라서 같은 패키지에 버전도 동일하게 유지합니다.
코드 작성자가 직접 배포 및 관리 할 수 있어야 하며, 배포 간격은 짧게, 배포는 코드 작성자가, 개발 환경은 운영과 일치해야 합니다.

LOGS

로그를 파일로 저장하는 코드를 작성하지 않고 단순히 console.log를 통해 stdout으로 보냅니다.
실행 환경에서 표준 출력으로 보내진 로그를 파일로 저장합니다. 
표준 출력을 사용하면 다른 로그 라우터를 이용할 수 있이며, 
로컬 개발 시 터미널에 실시간으로 출력된 로그만 확인할 수 있어서 쉽습니다.
로그를 가공하지 않기 때문에 많은 정보를 얻을 수 있습니다.

ADMIN PROCESSES

일회성 처리가 필요한 기능도 코드베이스 함께 관리합니다. 이를 Admin process라 한다.
Admin process는 애플리케이션과 같은 기술, 설정(환경 변수)을 사용합니다.

NodeJS 프로젝트에서 비정기적으로 데이터베이스에 데이터를 입력해야 한다면 해당 기능을 SQL이 아닌 NodeJS로 작성하여 저장합니다.
REPL Shell을 지원하는 언어는 일회성 스크립트를 작성하는데 유리하다.




Twelve-Factor app를 간단하게 살펴보았습니다.

제가 정리한 글은 Twelve-Factor app 홈페이지 내용을 그대로 정리했다기 보다는,

구성원들과 함께 토론하며 작성한 내용들 입니다.

Twelve-Factor app이 말하는 바를 지금의 환경으로 생각해보고 이해해보는 시간을 갖게 되어 좋았습니다.

완벽한 정리는 아니기 때문에 많은 토론을 통해 좀 더 방향으로 갈 수 있도록 정리해 나가면 좋을 것 같습니다.

읽어주셔서 감사합니다.


By. hui

'PDR Tech log' 카테고리의 다른 글

내가 생각하는 애자일  (0) 2017.12.09
Visual Studio Code에서 NodeJS, Javascreipt 타입 힌팅 사용하기  (0) 2017.10.12
12 Factors Explanation  (0) 2017.10.10
CSS - Text 개행 처리  (0) 2017.10.08
MySQL 사용자 계정 관리  (0) 2017.10.02
generator yield*  (0) 2017.09.25
댓글
댓글쓰기 폼