Avatar 창조적이고 생산적이고 싶은 개발자

#1 클라우드 네이티브 자바

12요소 방법론

12요소 방법론(The Twelve-factor Application)이란 헤로쿠(Heroku) 클라우드 플랫폼을 만든 창시자들이 정립한 어플리케이션 개발 원칙 중 유익한 것을 모아 정리한 내용

핵심 사상

선언적 형식으로 설정을 자동화해서 프로젝트에 새로 참여하는 동료가 적응하는 데 필요한 시간과 비용을 최소화한다. 운영체제에 구애받지 않는 투명한 계약을 통해 다양한 실행 환경에서 작동할 수 있도록 이식성을 극대화한다. 현대적인 클라우드 플랫폼 기반 개발을 통해 서버와 시스템 관리에 대한 부담을 줄인다. 개발과 운영의 간극을 최소화해서 지속적 배포(Continuous Deployment)를 가능하게 하고 애자일성을 최대화한다. 도구, 아키텍쳐, 개발 관행을 크게 바꾸지 않아도 서비스 규모 수직적 확장이 가능하다.

실천 방법

코드베이스(Codebase) 버전 관리되는 하나의 코드베이스가 여러번 배포된다.
의존관계(Dependencies) 의존관계는 명시적으로 표시하고 격리한다.
설정(Config) 설정 정보는 실행 환경에 저장한다.
지원 서비스(Backing services) 지원 서비스는 필요에 따라 추가되는 자원으로 취급한다.
빌드, 릴리스, 실행(Build, release, run) 빌드와 릴리스, 실행 단계는 엄격하게 분리한다.
프로세스(Process) 어플리케이션은 하나 이상의 무상태(Stateless) 프로세스를 실행한다.
포트 바인딩(Port binding) 서비스는 포트에 연결해서 외부에 공개한다.
동시성(Concurrency) 프로세스 모델을 통해 수평적으로 확장한다.
처분성(Disposabillity) 빠른 시작과 깔끔한 종료로 견고함을 극대화한다.
개발/운영 짝맞춤(Dev/Prod parity) 개발과 스테이징, 운영은 가능한 한 동일하게 유지한다.
로그(Logs) 로그는 이벤트 스트림으로 취급한다.
관리 프로세스(Admin Process) 관리(admin/management) 작업은 일회성 프로세스로 실행한다.

코드베이스

소스코드 저장소에는 의존관계를 나타내는 매니페스트(manifest)를 가지고 있는 하나의 어플리케이션이 포함되어 있어야 하며, 실행 환경이 달라질 때마다 어플리케이션을 다시 컴파일하거나 패키지 구조를 변경할 필요가 없어야 한다.

의존관계

어플리케이션의 의존관계는 명시적으로 선언되어야 하고, 어플리케이션에 필요한 모든 의존 라이브러리는 아파치 메이븐 같은 의존관계 관리 도구를 써서 라이브러리 저장소에서 내려받을 수 있어야 한다.

설정

어플리케이션 코드는 설정 정보와 엄격하게 분리되어야 한다.
어플리케이션의 설정 정보는 실행 환경에서 읽어올 수 있어야 한다.(어플리케이션의 재배포가 없이)

지원 서비스

지원 서비스(데이터베이스 API, SMTP 서버, FTP 서버 등)은 어플리케이션의 자원으로 간주해야하며 운영되는 동안 추가된다.
소스 코드를 변경하지 않고도 지원 서비스를 교체할 수 있어야 한다.(local : Embedded sql -> prod : MySQL)

빌드 릴리스, 실행

  • 빌드 단계 : 어플리케이션 소스코드를 가져와서 필요하다면 컴파일을 한 후 하나의 패키지로 만든다.
  • 릴리스 단계 : 릴리즈 단계는 빌드에 환경설정 정보를 조합한다.
    실행 환경에서 운영될 수 있는 준비가 완료되어 있으며, 시맨틱 버저닝 또는 타임스탬프를 통해 식별이 가능해야 한다.(릴리스 관리 도구를 통해 이전 버전으로 롤백하는데 사용된다)

프로세스

어플리케이션은 지원 서비스를 통해서만 영속성을 가질 수 있다.
모든 자원은 지원 서비스로서 런타임 시에 어플리케이션에 추가된다.(영속성에 대한 자원을 독자적으로 가지지 않는 무상태 어플리케이션)

포트 바인딩

실행 환경에 웹 서버를 따로 추가해줄 필요 없이 스스로 웹 서버를 포함하고 있어서 완전히 자기 완비적인 형태를 갖춘다. 특정 HTTP 포트에 연결되어 외부에 공개된다.

동시성

필요할 때마다 프로세스나 스레드를 수평적으로 확장해서 병렬로 실행할 수 있어야 한다.
나눌 수 있는 작업은 나눠서 동시에 실행할 수 있어야 한다.

처분성

어플리케이션 프로세스는 쉽게 처분할 수 있어야 한다.
실행 중에 언제든지 중지될 수 있고, 중지될 때 처리되어야 하는 작업을 모두 수행한 다음 깔끔하게 종료될 수 있다.

개발/운영 짝맞춤

개발 환겨오가 운영 환경을 가능한 한 동일하게 유지하는 짝맞춤(Parity)을 통해 분기를 예방할 수 있어야 한다.

  • 시간 차이 : 개발자는 변경 사항을 운영 환경에 빨리 배포해야 한다.
  • 개인 차이 : 코드 변경을 맡은 개발자는 운영 환경으로의 배포 작업까지 할 수 있어야 하고, 변경 반영 후 모니터링 도 할 수 있어야 한다.
  • 도구 차이 : 작은 불일치로 발생하는 예상하지 못한 동작을 미연에 방지하기 위해 각 실행 환경에 사용된 기술이나 프레임워크는 동일하게 구성되어야 한다.

로그

시간에 따른 이벤트로서 stdout에 로그를 남긴다.
어플리케이션은 로그 파일 저장에 관여하지 말아야 한다. 로그 집계와 저장은 어플리케이션이 아니라 실행 환경에 의해 처리되어야 한다.

관리 프로세스

개발자가 시스템 관리 작업을 실행해야 할 때 사용되는 마이그레이션 및 일회성 스크립트 등을 관리 프로세스라고 한다. 관리 프로세스는 어플리케이션의 실행 환경에서 실행되어야 하고, 스크립트는 실행 환경 간 일관성 유지를 위해 소스 코드 저장소에 포함되어야 한다.

정리

MSA 관련 플랫폼 혹은 패턴에 대해서 공부할 때 위에서 설명한 12가지의 요소들에 대해서 이해하고 있다면 해당 기술이 왜 필요한지 이해하는데 크게 도움이 될 것이다.
또한 아키텍쳐를 설계하는데 있어서도 전체적인 흐름을 구상하는데 꼭 필요한 부분인것같다.