✅ 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)
"빌드, 릴리스, 실행 단계는 철저히 분리한다."
- 빌드 단계: 코드와 의존성을 묶어 실행 가능한 파일을 생성합니다.
- 릴리스 단계: 빌드 결과에 환경 설정을 결합하여 배포할 버전을 생성합니다.
- 실행 단계: 릴리스된 버전을 실행합니다.
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가지 원칙
- 코드베이스: 단일 코드베이스, 여러 배포 환경
- 종속성: 의존성 명확히 선언 및 격리
- 설정: 설정값은 환경 변수로 분리
- 백킹 서비스: 외부 서비스는 URL로 연결
- 빌드, 릴리스, 실행: 세 단계 분리
- 프로세스: 무상태 프로세스
- 포트 바인딩: 자체적으로 포트를 바인딩
- 동시성: 여러 프로세스를 통해 확장
- 폐기 가능: 빠르게 시작하고 안전하게 종료
- 개발/프로덕션 일치: 환경을 최대한 유사하게 유지
- 로그: 로그는 이벤트 스트림으로 처리
- 관리 프로세스: 일회성 관리 작업은 별도의 프로세스로 실행
'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 |