12요소 (twelve factors) 애플리케이션
- Development/SW Engineering
- 2021. 7. 29.
개요
본 포스트에서는 Heroku 플랫폼을 통해 소개된 개념인 12-Factor 애플리케이션 요소에 대해 정리한다. SaaS(Software As A Service) 개발 방법론 관점에서 고안해 낸 개념인데, 어떤 애플리케이션이 Cloud 환경에서 잘 동작할 수 있으려면 아래의 12가지 규칙을 잘 준수해야 한다고 하는 것이다.
12요소 (twelve factors)
- 코드베이스(codebase)
- 의존성(dependencies)
- 설정(config)
- 백엔드 서비스(backing services)
- 빌드, 릴리즈, 실행(build, release, run)
- 프로세스(processes)
- 포트 바인딩(port binding)
- 동시성(concurrency)
- 폐기가능(disposability)
- 개발/프로덕션 환경 동일화(dev/prod parity)
- 로그(logs)
- 어드민 프로세스(admin process)
1. 코드베이스
- 코드베이스는 버전 컨트롤하여 관리한다.
- 하나의 동일한 코드 베이스로부터 develop, stage, production 등의 환경에 배포할 수 있다.
2. 의존성
- 의존성 선언: 의존성을 엄격하게 선언함
- 의존성 분리: 실행시 의존성의 바운더리를 정하여, 실행되는 환경의 의존성이 독립적으로 보장되도록 보장
3. 설정
- 배포 환경(develop, stage, production)에 따라 달라질 수 있는 것들
- 데이터베이스, cache 서버 등 리소스 주소
- 외부 인증 정보
- 설정을 환경변수에 저장함
4. 백엔드 서비스
- DB, Cache, Messaging System 등과 같은 백엔드 서비스를 연결된 리소스로 취급함
- 백엔드 서비스의 URL 등을 설정으로 빼놓고, 코드상에서는 설정을 참조하여 백엔드 리소스에 접근한다.
- 애플리케이션 코드를 수정하지 않고, 설정에 있는 리소스 핸들만 변경할 수 있어야 한다.
- 즉, 백엔드 서비스들과 느슨하게 결합되어야 한다.
5. 빌드, 릴리즈, 실행
- 배포 절차를 빌드/릴리즈/실행의 세 단계로 명확히 분리한다.
- 빌드: 소스 코드 repository로부터 실행 가능한 artifact로 만듬
- 릴리즈: 코드가 빌드되면, 배포의 설정을 적용함. 릴리즈가 완료되면 실행할 준비가 완료됨.
- 실행: 실제 실행할 환경(runtime)에서 프로그램을 동작시킴
6. 프로세스
- 한 개 혹은 여러 개의 stateless 프로세스로 구성됨
- stateless이며, 아무 것도 공유하지 않음. 유지되어야 하는 데이터는 DB 등과 같은 백엔드 서비스를 활용한다.
- stateless 여야 확장 가능함.
7. 포트 바인딩
- 어떤 서비스나 애플리케이션을 네트워크 포트 번호로 구별할 수 있어야 함.
- DNS 이름보다는 오히려 포트 번호를 기준으로 특정 서비스를 구별할 수 있도록 하는 것이 보다 정확할 것임.
- 예)
- HTTP: 80
- HTTPS: 443
- SSH: 22
- MySQL: 3306
반응형
8. 동시성 (Concurrency)
- stateless 프로세스로 만들어야 함
- 절대 대몬화하지 말 것
9. 폐기 가능 (Disposability)
- 빠른 시작(fast stratup)과 점진적인 종료(graceful shutdown)
10. 개발/ 프로덕션 환경 일치
- 개발/스테이지/운영 환경을 최대한 비슷하게 유지
- 시간 차이: 개발자가 작성한 코드가 몇 분~ 몇 시간 내 배포될 수 있음
- 담당자의 차이: 개발자가 작성한 코드를 시스템 엔지니어가 배포
- 툴의 차이: 개발환경(혹은 개발자)과 실제 운영환경상 시스템 불일치
11. 로그
- 로그를 이벤트 스트림처럼 처리하자.
- 로그는 로컬에 저장하지 않고, 별도의 저장소에 보관한다.
12. 어드민 프로세스
- admin/maintenance 작업을 일회성 프로세스로 실행해야 함
- 일회성 관리/ 유지보수 작업 지원 필요
- 데이터 마이그레이션 실행시
- 일회성 스크립트 실행시
'Development > SW Engineering' 카테고리의 다른 글
소프트웨어와 깨진 유리창의 법칙 (0) | 2021.12.27 |
---|---|
Law of Demeter - 디미터 (데메테르) 법칙 (0) | 2021.08.18 |
콘웨이 법칙 (Conway's Law), 역 콘웨이 법칙(Inverse Conway's Law) (0) | 2021.07.19 |
캐시(Cache) 적용 패턴 및 관리 전략 (0) | 2021.04.29 |
Strangler Fig Application Pattern - 교살자 무화과나무 패턴 (0) | 2021.04.18 |
PlantUML - 코드로 시퀀스다이어그램 그리기 (0) | 2021.04.07 |
VS Code에서 PlantUML 사용설정 (0) | 2021.03.31 |
Syntax Highlighter로 인용할 때 괄호 오류 보정하려면 (0) | 2010.07.17 |