테크레터

테크레터 2편. Twelve Factor App 들어본 사람?!🖐️

chandlerxx 2023. 12. 14. 18:52

오늘의 주제는 Twelve Factor App(SaaS앱을 구축하기 위한 방법론 중 하나)입니다. (원론적인 이야기로 노잼일 수 있겠네요^^;;)

 

요즘은 XaaS형태로 클라우드 기반의 서비스가 많이 개발되고 보편화되었지만 과거엔 어떻게 시작했을지(태동기)가 궁금해지더라고요. 개발 지식을 쌓는데 도움이 되길 바라면서 테크레터 2편 시작해볼게요.

 

우선 XaaS부터 가볍게 익히시죠.

 

1. XaaS : 클라우드 등 네트워크 기술을 기반으로 서비스 제공


기본 개념이지만,Twelve Factor App을 통해 현재 완성된 서비스들입니다. 최종 산출물에 해당되는 부분!

  • 종류 : 

    1) IaaS(infra) : AWS, Microsoft Azure, Google Cloud
    ㄴ 디지털 서비스 구현에 필요한 네트워크 자원을 클라우드 상에서 임대하는 형태로, 클라우드 산업의 근간을 이루는 서비스
    ㄴ 시장조사업체 카날리스에 따르면 2019년 전 세계 IaaS 시장 규모는 약 127조 원 정도로 추산

    ㄴ 시장점유율 : 아마존(32%) / 마이크로소프트(17%)

    2) PaaS(platform)
    ㄴ 인프라를 포함한 개발 플랫폼을 하나의 패키지로 서비스하는 형태 (고객 맞춤형 또는 최적화)
    ㄴ 예시로는 AWS Elastic Beanstalk, Heroku, 오픈소스로는 OpenShift 정도.


    3) SaaS(software)
    ㄴ 보편적인 형태의 클라우드 서비스이며, 모든 애플리케이션은 제공업체가 관리하며 웹 브라우저를 통해 제공됨
    ㄴ 예시로는 Dropbox, Salesforce, Google Apps(Google Drive, Gmail), 네이버 N클라우드 등

Source : https://www.redhat.com/ko/topics/cloud-computing/iaas-vs-paas-vs-saas

 

 

 

 

이제 다시 Twelve-Factor App으로 돌아와서..

2. Twelve-Factor App 등장하게 된 배경


Best Practices for Cloud-Native Applications라곤 하는데..찾아보니 당연한 얘기네요.

 

  • 개념 : 클라우드 시대에 적합한 애플리케이션 개발과 배포 방법에 맞는 12가지 원칙(Twelve Factor)을 개념화한 것
  • 등장배경
    1) 애플리케이션은 OCP 원칙을 준수해야함 (객체지향이랑 연결됨)
    2) 개발과 운영환경 간 차이를 최소화하고 지속적인 개발사이클 지향(개발 → 테스트 → 배포)
    3) 개발도구, 아키텍처, 개발 방식 변화 없이 서비스를 확장하기 위함

3. 12가지 원칙 


요약만 할게요. 궁금하신 부분은 구글링해보세요.


1. CodeBase

하나의 코드베이스로 버전 관리가 되는게 핵심이며,GitHub로 개발/운영서버가 관리/배포되는 개념

source : https://medium.com/@tech_18484

 

2. Dependencies

앱 구동시 필요한 라이브러리가 해당 시스템에 설치되어 있다는 가정을 해서는 안된다.
ㄴ 파이썬의 Virtualenv가 좋은 예로 앱과 함께 앱 구동에 필요한 라이브러리나 스크립트도 같이 배포
ㄴ 스프링 부트의 경우, 뷰 템플릿 엔진을 활용하려면 Thymeleaf 라이브러리를 별도 추가 필요

 

3. Config

데이터베이스, 스토리지 등 백엔드 서비스에 대한 연결 정보를 코드에서 제거해야 한다.

ㄴ 필요한 정보는 해당 앱을 구동하는 프로세스의 환경변수에서 조회 가능

4. Backing Services

경우에 따라 백엔드 서비스를 교체 하거나 변경할 수 있어야 한다.

source : https://medium.com/@tech_18484

 

5. Build, Release, Run

빌드, 릴리즈, 실행 단계를 엄격히 구분하여 실행 중에 발견된 문제를 실행 단계 코드에서 수정하여 적용해서는 안되며 코드 수정을 할 경우 빌드, 릴리즈, 실행 단계를 거쳐야 한다. 

 

6. Processes

어플리케이션을 구동하는 프로세스는 상태를 가져서는 안되며 영속적으로 저장, 관리 해야 하는 정보는 DB나 스토리지 같은 백엔드 서비스를 활용해야 한다.

 

7. Port Binding

앱은 포트를 통해 백엔드 서비스와 통신하며 앱 자체도 포트를 통해 다른 앱에 서비스를 제공할 수 있어야 합니다.

 

8. Concurrency

앱은 하나 또는 다수의 프로세스로 동작 할 수 있으며 확장이 필요한 경우 앱 프로세스를 추가하는 것으로 동시성 문제를 해결한다. 

 

9. Disposability

앱은 언제나 종료 될 수 있어야 하며 종료시 수행 중이던 작업을 모두 마치고 종료할 수 있게 graceful shutdown을 제공해야 한다.

 

10. Dev/Prod Parity
개발 환경과 프로덕션 환경의 차를 최소화 해야 하며 ORM이 SQLite를 사용하는 개발 환경과 RDBMS를 사용하는 운영 환경의 차이를 해소해 줄 것이라 믿어서는 안 된다.

11. Logs

로그는 스트림으로 처리 돼야 하며 각각의 프로세스가 생성하는 로그는 취합하여 최종 로그 관리/처리 시스템으로 전달 될 수 있어야 한다.

 

12. Admin Processes

관리를 위한 작업은 일회성 프로세스로 실행할 수 있어야 한다. 운영 환경 배포시 필요한 마이그레이션이나 변경 작업은 코드화 되어 실행돼야 하며 해당 코드는 코드 저장소에서 관리돼야 한다.

 

 

4. 마치며 


실무 가이드라인 수준인 것 같네요. 12가지 원칙 외 회사마다 디테일한 정책이 추가될 것 같아요. 아울러 개발부서별로 단위, 시스템레벨에서 검토도 병행되어야 하고요. 그만큼 개발자는 책임감을 가지고 서비스를 개발해야한다..라는 결론입니다^^..

 

 

[출처]