Microservices Architecture / / 2024. 12. 10. 09:54

12 팩터 앱(12 Factor App)

12 팩터 앱(12 Factor App)클라우드 환경에서 실행되는 현대적인 애플리케이션을 설계하고 배포하기 위한 방법론입니다. Heroku의 개발자들이 정의했으며, 애플리케이션을 유지보수하기 쉽고 확장 가능하게 만드는 12가지 원칙을 제공합니다.


📌 12 Factor App의 개요

  • 목적: 클라우드 네이티브 애플리케이션의 유연성, 확장성, 이식성을 극대화
  • 대상: 마이크로서비스 아키텍처 및 컨테이너 기반 배포에 적합
  • 핵심 가치: 독립적인 구성, 무상태성, 포터블(이식 가능)한 코드베이스

1️⃣ 코드베이스(Codebase)

"코드베이스는 단일 저장소이며 여러 환경에 배포된다."

  • 하나의 코드베이스를 사용하고, 각 배포는 코드베이스의 스냅샷입니다.
  • 버전 관리 시스템(예: Git)으로 관리하며, 여러 배포 환경(개발, 스테이징, 운영 등)은 동일한 코드베이스를 기반으로 실행됩니다.

예시

  • GitHub 저장소: 모든 코드와 의존성을 한 저장소에서 관리합니다.
  • 배포 환경마다 설정값만 달라집니다.

2️⃣ 종속성(Dependencies)

"애플리케이션의 종속성은 명확하게 선언하고 격리한다."

  • 시스템에 의존하지 않고, 명시적으로 선언된 의존성을 관리해야 합니다.
  • 빌드 도구(예: Maven, Gradle, NPM)를 사용해 의존성을 명확히 합니다.

예시

  • Maven의 pom.xml:
     <dependencies>
         <dependency>
             <groupId>org.springframework</groupId>
             <artifactId>spring-context</artifactId>
             <version>5.3.8</version>
         </dependency>
     </dependencies>

3️⃣ 설정(Config)

"설정은 코드와 분리하고 환경 변수로 관리한다."

  • 애플리케이션의 설정값(DB 연결, API 키 등)은 코드와 분리하고, 환경별로 다르게 설정합니다.
  • 설정값은 환경 변수를 통해 주입합니다.

예시

  • Spring Boot application.yml

     spring:
       datasource:
         url: ${DB_URL}
         username: ${DB_USERNAME}
         password: ${DB_PASSWORD}
  • 운영 환경:

     export DB_URL=jdbc:mysql://prod-db:3306/appdb
     export DB_USERNAME=admin
     export DB_PASSWORD=secret

4️⃣ 백킹 서비스(Backing Services)

"외부 서비스는 애플리케이션의 일부분처럼 취급해야 한다."

  • DB, 캐시, 메시지 큐, 파일 스토리지 같은 외부 서비스를 백킹 서비스라고 부릅니다.
  • 백킹 서비스는 애플리케이션과 독립적이며 URL이나 환경 변수로 연결합니다.

예시

  • MySQL 데이터베이스 URL:
     export DATABASE_URL=mysql://username:password@mysqlserver:3306/appdb

5️⃣ 빌드, 릴리스, 실행(Build, Release, Run)

"빌드, 릴리스, 실행 단계는 철저히 분리한다."

  1. 빌드 단계: 코드와 의존성을 묶어 실행 가능한 파일을 생성합니다.
  2. 릴리스 단계: 빌드 결과에 환경 설정을 결합하여 배포할 버전을 생성합니다.
  3. 실행 단계: 릴리스된 버전을 실행합니다.

6️⃣ 프로세스(Processes)

"애플리케이션은 무상태(stateless)이고 공유되지 않는 프로세스로 실행되어야 한다."

  • 애플리케이션은 무상태(stateless) 프로세스로 실행되어야 합니다.
  • 상태 정보는 외부 저장소(예: 데이터베이스, Redis)에 저장해야 합니다.

예시

  • 세션 정보는 애플리케이션 내에 저장하지 않고 Redis와 같은 외부 저장소에 저장합니다.

7️⃣ 포트 바인딩(Port Binding)

"애플리케이션은 자체적으로 포트를 바인딩하여 서비스를 노출해야 한다."

  • 애플리케이션은 내부적으로 포트를 바인딩해 실행되며, 외부에서 접근할 수 있습니다.
  • 웹 서버(예: Tomcat, Netty)를 애플리케이션에 포함시켜 실행합니다.

예시

export PORT=8080
java -jar app.jar --server.port=$PORT

8️⃣ 동시성(Concurrency)

"애플리케이션은 여러 프로세스를 통해 확장해야 한다."

  • 애플리케이션의 작업을 작은 프로세스 단위로 나누어 수평 확장을 가능하게 합니다.
  • 필요한 리소스에 따라 프로세스를 추가하거나 제거합니다.

9️⃣ 폐기 가능(Disposability)

"애플리케이션은 빠르게 시작하고 안전하게 종료되어야 한다."

  • 빠른 시작과 종료를 통해 애플리케이션의 배포와 확장을 유연하게 합니다.
  • SIGTERM 신호를 통해 종료 시 리소스 정리 작업을 수행합니다.

🔟 개발/프로덕션 일치(Dev/Prod Parity)

"개발 환경과 운영 환경은 최대한 유사해야 한다."

  • 개발 환경과 프로덕션 환경을 동일하게 유지합니다.
  • Docker, Kubernetes 등을 사용해 개발 및 운영 환경을 통일합니다.

1️⃣1️⃣ 로그(Log)

"로그는 이벤트 스트림으로 취급해야 한다."

  • 애플리케이션은 로그를 파일로 저장하지 않고 표준 출력(stdout)에 기록합니다.
  • 로그는 ELK 스택, Fluentd와 같은 도구를 통해 수집하고 분석합니다.

1️⃣2️⃣ 관리 프로세스(Admin Processes)

"일회성 관리 작업은 별도의 프로세스로 실행한다."

  • 데이터베이스 마이그레이션이나 스크립트 실행 같은 작업은 애플리케이션 코드와 별도로 실행합니다.

🎯 정리

12 Factor App의 12가지 원칙

  1. 코드베이스: 단일 코드베이스, 여러 배포 환경
  2. 종속성: 의존성 명확히 선언 및 격리
  3. 설정: 설정값은 환경 변수로 분리
  4. 백킹 서비스: 외부 서비스는 URL로 연결
  5. 빌드, 릴리스, 실행: 세 단계 분리
  6. 프로세스: 무상태 프로세스
  7. 포트 바인딩: 자체적으로 포트를 바인딩
  8. 동시성: 여러 프로세스를 통해 확장
  9. 폐기 가능: 빠르게 시작하고 안전하게 종료
  10. 개발/프로덕션 일치: 환경을 최대한 유사하게 유지
  11. 로그: 로그는 이벤트 스트림으로 처리
  12. 관리 프로세스: 일회성 관리 작업은 별도의 프로세스로 실행

'Microservices Architecture' 카테고리의 다른 글

폴백(Fallback)  (0) 2024.12.13
엘라스틱서치(Elasticsearch)  (0) 2024.12.10
스프링 클라우드 패턴  (0) 2024.12.10
Resilience4j  (2) 2024.12.09
온프레미스(On-Premise)  (2) 2024.12.09
  • 네이버 블로그 공유
  • 네이버 밴드 공유
  • 페이스북 공유
  • 카카오스토리 공유