The Tweleve Factor APP ( 12 Factor )

2021. 3. 19. 08:53개발

반응형

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

 

1 2 3 4 5 6 7 8 9 ··· 76