THE TWELVE-FACTOR APPLICATION

최근 SaaS(Software as a Service)형태의 어플리케이션 개발이 증가하면서 관련 방법론 또한 새롭게 조명을 받고있습니다.  Heroku 개발자들은 이와 같은 형태의 앱 개발 및 배포, 운영을 지켜보면서 다음과 같은 12가지의 앱 개발 방법론을 수립하였습니다.


 

1. 코드베이스

개발 서버나 운영 서버에 다양한 버전의 앱의 배포되더라도 코드 베이스는 한 개여야 합니다. 운영환경에서 배포를 위해 수정한 코드일지라도 코드 베이스에 통합되어 관리 되야합니다.

 

2. 종속성

앱 구동시 필요한 라이브러리가 해당 시스템에 설치되어 있다는 가정을 해서는 안됩니다. 파이썬의 Virtualenv가 좋은 예로 앱과 함께 앱 구동에 필요한 라이브러리나 스크립트도 같이 배포 되야 합니다.

 

3. 설정

데이터베이스, 스토리지 등 백엔드 서비스에 대한 연결 정보를 코드에서 제거해야 한다. 필요한 정보는 해당 앱을 구동하는 프로세스의 환경변수에서 조회 가능 하고 손쉽게 변경 가능해야 하며 관련 정보가 코드 저장소에 등록되어서는 안됩니다.

 

4. 백엔드 서비스

로컬과 원격에서 실행되는 백엔드 서비스를 구분하지 말고 하나의 사용 가능한 자원으로 생각하며 경우에 따라 백엔드 서비스를 교체 하거나 변경할 수 있어야 합니다.

 

5. 빌드, 릴리즈, 실행

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

 

6. 프로세스

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

 

7. 포트 바인딩

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

 

8. 동시성

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

 

9. 폐기 가능(Disposability)

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

 

10. 개발/프로덕션 환경 일치

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

 

11. 로그

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

 

12. Admin 프로세스

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

 

 

이 12가지 요소를 갖춰야만 SaaS인 것은 아닙니다. 다만 클라우드 환경에서 좀더 유연하고 높은 이식성과 코드로 관리되는 서비스를 제공할 수 있다는 점에서 충분히 검토해 볼 필요가 있다고 생각합니다.

 

참고자료

THE TWELVE-FACTOR APP