티스토리 뷰
12 Factor APP을 하는 이유
최근 소프트웨어 서비스가 클라우드 서비스로 많이 바뀌게 되면서, 12 Factor는 확장성 좋은 SaaS 앱을 만들기 위한 방법론이다.
- 설정을 자동화 할수 있다.
- OS 따라 달라지는 부분이 명확하고, 이식성이 좋다.
- 클라우드 환경에 적합하다
- CI / DI 에 용이하다.
- 툴, 아키텍쳐, 개발방식을 바꾸지 않아도 Scale up이 용이하다.
12 Factor
1. 코드 베이스 (Code Base)
애플리케이션(이하 앱)은 한 개의 코드 베이스 (Git, SVN)를 통해 관리하며, 동일한 코드로 운영/개발에 배포하여야 한다.
- 앱은 1개의 코드 베이스로 1:1 관계다.
- 앱은 1개의 코드 베이스로 운영/개발 등등에 배포된다.
- 코드베이스 전략은 다른 11가지 전략의 기본이 됨으로 반듯이 준수해야 한다.
중요도 : Required
2. 종속성 (Dependencies)
앱은 모든 종속성을 명시적으로 선언하여 사용하여야 한다. 필요한 라이브러리를 dependency manifest (pom, package.json 등등) 파일에 선언
- dependency manifest에 버전을 명시한다.
- 필요 라이브러리를 버전을 명시하고, 빌드 명령 시 실행.
중요도 : High
3. 설정 (Config)
모든 설정 정보는 분리된 공간에 저장되어야 하고, 런타임 때에 코드에 의해 읽혀야 합니다. 반듯이 분리되어야 항목들은 아래와 같습니다.
- 디비나 다른 백업 서비스를 처리하는 리소스
- 외부 리소스 (S3, Redis 등 )의 인증 정보
- 각 배포마다 달라지는 값 ( hostname 등 )
- dev, test, stage, prod 배포마다 달라지는 값
이러한 설정들은 절대로 아래와 같이 저장하면 안 됩니다.
- code
- properties file
- build file
- app server
그럼 어디에?
- 배포 환경 (개발/운영)용 설정 파일을 작성 ( ex dotenv, docker 설정파일 )
- spring cloude config
중요도 : Medium
4. 백엔드 서비스 (Backing Sservices)
백엔드 서비스를 연결된 리소스로 취급한다. SaaS의 리소스는 자유롭게 배포, 연결, 분리하고, 수정 없이 전환이 가능해야 한다.
백엔드 서비스란?
- 네트워크를 통한 통해 이용되는 모든 서비스
- DB, Cache, SMTP, Messaging, Queue
중요도 : High
5. 빌드, 릴리즈, 실행 (Build, Release, Run)
코드 베이스는 빌드 > 릴리즈 > 실행 단계를 거쳐 배포하여야 하며, 그 사이에를 엄격히 구분되어야 한다.
- 빌드 : 개발자에 의해 실행
- 릴리즈 : 빌드 + config
- 실행 : 릴리즈를 실행한 것으로 반듯이 Unique ID를 가져야 한다 (롤백에 용이)
실행은 복잡하지 않도록 하여 빠르게 실행되고 빠르게 종료될 수 있어야 한다.
중요도 : Conceptual
6. 프로세스 (Process)
앱은 하나이상의 프로세스로 실행되며 각 프로세스는 stateless로 아무것도 공유하지 않는다. SaaS는 여러 개의 인스턴스로 배포됨으로, 메모리, 파일 등을 공유하지 않으며, 인스턴스가 재기동될 때 local file 및 session 등이 모두 초기화된다.
- session, file 등은 모두 외부자원을 사용한다 (S3, redis 등등)
중요도 : High
7. 포트 바인딩 (Port Binding)
배포된 앱은 타 앱이 접근할 수 있도록 포트를 바인딩하여 서비스를 공개한다.
- 모든 요청은 직접 파일을 실행하는 것이 아니라 포트를 통해서 공개된 서비스로 실행한다.
- Factor4 (Backing Service)가 이에 적용된다.
중요도 : Medium
8. 동시성 (Concurrency)
앱은 수평적으로 확장할 수 있어야 한다. Factor6 (Processes)에 의해 동시성을 높일 수 있다.
- 모든 것을 처리하는 앱이 아닌 기능별로 분리된 앱을 만들면 좋다 ( micro service )
- 프로세스는 Demon 이 아니여야 한다.
중요도 : Low
9. 폐기 가능 (Disposability)
프로세스는 Shut Down 명령을 받았을 때 Graceful shut down을 해야 한다. SaaS의 는 scale up / down이 빈번히 발생하므로, 이에 안정성을 확보하며 종료되어야 한다. (Queue 및 db 작업 중 강제 shut down 되면 문제라 발생된다 )
중요도 : Medium
10. 개발, 프로덕션 일치 (Dev/Prod Parity)
개발환경, 스테이징, 실서비스 환경을 최대한 비슷하게 유지해야 한다. 그 차이를 작게 유지할 수록 예상치 못한 버그 및 장애에 대응하기 쉽다.
중요도 : Medium
11. 로그 (Logs)
로그를 Event Stream 으로 취급하여 로컬에 저장하지 않는다. SaaS는 언제든지 생성/삭제 될수 있음으로 로컬에 저장하지 않는다. 또한 로컬에 저장시 기타 에러를 발생할수 있다 (폴더권한 및 저장공간)
중요도 : Low
12. 어드민 프로세스 (Admin Proccess)
admin / maintenace 작업을 일회성 프로세스로 실행하여야 한다.
일회성 프로세스의 종류
- 데이터베이스 마이그레이션
- 일회성 스크립트
중요도 : High
'개발' 카테고리의 다른 글
깃 alias (0) | 2021.11.16 |
---|---|
jetbrain(PHPSTORM) tool 테스트 코드 한글 method 밑줄 없애기 (0) | 2021.04.14 |
nGrinder 란 무엇인가 ? (사용 후기) (0) | 2020.12.29 |
초기설정 (0) | 2020.12.07 |
코딩, 어떤 언어로 시작하지? (0) | 2020.11.09 |