일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |
- 포트바인딩
- 티어구조
- 레이어패턴
- java17
- 3티어아키텍처
- 티스토리챌린지
- chatGPT
- OpenAI
- 블루그린배포
- DALL-E
- 웹크롤링
- web crowling
- MSA
- 무상태
- chaosengineering
- JSON
- temurin
- AI
- ci_cd
- xmlschema
- 웨크롤링
- WSL
- Python
- API
- 카나리배포
- 오블완
- 클라우드네이티브
- 쳇지피티
- 12factorapp
- 책임분리
- Today
- Total
Nacho
[SSAFY] 12-Factor App 본문
**필기를 기반으로 GPT가 작성한 글입니다.**
12-Factor App 원칙: 클라우드 네이티브 애플리케이션 설계의 기준
현대 소프트웨어 개발에서 12-Factor App 원칙은 클라우드 환경에서 안정적이고 확장 가능한 애플리케이션을 개발하기 위한 필수 지침으로 자리 잡았습니다.
이 글에서는 12가지 원칙을 하나씩 설명하며, 각각의 원칙이 어떤 목적을 가지고 있으며, 실무에서 어떻게 적용되는지 살펴보겠습니다.
1. 코드베이스 (Codebase)
원칙:
하나의 애플리케이션은 반드시 하나의 코드베이스를 사용해야 하며, 이 코드베이스는 하나의 버전 관리 시스템에서 관리됩니다.
목적:
- 모든 배포 환경(개발, 스테이징, 프로덕션)에서 동일한 코드 기반으로 작업하여 일관성을 유지.
- 팀이 서로 다른 코드베이스를 관리하지 않아도 되므로 협업 생산성이 높아짐.
실무 적용:
- Git, SVN과 같은 버전 관리 시스템에서 애플리케이션 코드를 관리.
- 브랜치 전략을 활용해 환경별 코드 분리를 간소화.
- 예: main 브랜치(프로덕션), dev 브랜치(개발), staging 브랜치(스테이징).
2. 종속성 (Dependencies)
원칙:
애플리케이션이 필요로 하는 모든 라이브러리와 패키지는 명시적으로 선언되어야 하며, 실행 환경에 독립적으로 관리되어야 합니다.
목적:
- 환경 종속성 제거: 외부 종속성이 누락되거나 충돌하지 않도록 보장.
- 예측 가능한 빌드: 동일한 환경에서 항상 동일하게 실행되도록 설계.
실무 적용:
- 의존성 관리 도구 사용:
- Java: Maven, Gradle
- Python: pip, Poetry
- Node.js: npm, yarn
- 컨테이너화:
- Docker 이미지를 활용해 애플리케이션과 모든 종속성을 함께 패키징.
3. 설정 (Config)
원칙:
애플리케이션 설정(예: API 키, 데이터베이스 URL 등)은 코드베이스에서 분리되어 환경 변수로 관리되어야 합니다.
목적:
- 환경별로 애플리케이션의 동작을 변경할 수 있도록 설계.
- 민감한 정보를 코드에서 분리해 보안을 강화.
실무 적용:
- 환경 변수 관리 도구:
- Docker Compose의 .env 파일.
- Kubernetes의 ConfigMap 또는 Secrets.
- 예시:
DATABASE_URL=postgresql://username:password@host:port/database_name API_KEY=your_secret_api_key
4. 백엔드 서비스 (Backing Services)
원칙:
데이터베이스, 캐시, 메시지 큐 등은 외부 자원으로 간주하며, 애플리케이션에 연결된 리소스처럼 취급해야 합니다.
목적:
- 백엔드 서비스의 독립성을 유지해 교체 및 확장이 용이.
- 애플리케이션과 백엔드 서비스를 느슨하게 결합.
실무 적용:
- 데이터베이스를 변경하더라도 코드 수정이 최소화되도록 설계.
- 예: PostgreSQL에서 MySQL로 변경.
- 클라우드 서비스 활용:
- AWS RDS, Google Cloud Pub/Sub, Redis Labs 등.
5. 빌드, 릴리스, 실행 (Build, Release, Run)
원칙:
애플리케이션 배포는 세 가지 독립된 단계로 구성됩니다.
- 빌드: 소스 코드를 실행 가능한 바이너리로 컴파일.
- 릴리스: 빌드된 바이너리와 설정 정보를 조합.
- 실행: 실행 환경에서 애플리케이션을 실행.
목적:
- 배포 프로세스의 명확한 분리로 안정성을 확보.
- 반복 가능한 빌드와 릴리스 과정.
실무 적용:
- CI/CD 도구 사용:
- Jenkins, GitHub Actions, GitLab CI/CD.
- Docker 이미지를 빌드한 후 Kubernetes로 배포:
docker build -t my-app:1.0 . kubectl apply -f deployment.yaml
6. 프로세스 (Processes)
원칙:
애플리케이션은 하나 이상의 무상태 프로세스로 실행되어야 하며, 데이터는 외부 저장소에 보관해야 합니다.
목적:
- 확장성: 무상태 프로세스는 클러스터에서 쉽게 확장 가능.
- 신뢰성: 프로세스가 중단되어도 외부 저장소에 데이터가 유지됨.
실무 적용:
- 상태 저장 데이터는 Redis, AWS S3, PostgreSQL 등 외부 저장소 사용.
- Kubernetes에서 프로세스 확장:
kubectl scale deployment my-app --replicas=5
7. 포트 바인딩 (Port Binding)
원칙:
애플리케이션은 특정 포트를 통해 서비스를 노출하여 자체적으로 실행 가능해야 합니다.
목적:
- 외부에서 애플리케이션을 호출할 수 있도록 설계.
- 프로세스와 포트를 명확히 분리해 통합 및 배포를 간소화.
실무 적용:
- Express.js와 같은 웹 프레임워크에서 포트 설정:
const app = require('express')(); app.listen(process.env.PORT || 3000);
8. 동시성 (Concurrency)
원칙:
애플리케이션은 여러 무상태 프로세스 인스턴스를 실행하여 확장성을 확보해야 합니다.
목적:
- 다양한 워크로드를 처리할 수 있도록 유연한 설계.
실무 적용:
- 워크로드 분리:
- API 요청 처리는 웹 프로세스, 데이터 처리 작업은 워크 프로세스로 분리.
- Horizontal Scaling:
- Kubernetes와 Docker Swarm으로 인스턴스를 동적으로 확장.
9. 폐기 가능성 (Disposability)
원칙:
프로세스는 빠르게 시작되고, 우아하게 종료될 수 있도록 설계해야 합니다.
목적:
- 배포, 확장, 장애 복구를 신속하게 처리.
실무 적용:
- Kubernetes에서 livenessProbe와 readinessProbe 설정.
- SIGTERM 신호를 처리해 우아하게 종료:
process.on('SIGTERM', () => { console.log('Gracefully shutting down'); process.exit(); });
10. 개발/운영 환경 일치 (Dev/prod Parity)
원칙:
개발, 스테이징, 운영 환경을 최대한 비슷하게 유지해야 합니다.
목적:
- 환경 차이로 인해 발생하는 버그를 방지.
실무 적용:
- Docker를 사용해 동일한 컨테이너 환경 유지.
- 환경 구성 관리 도구:
- Terraform, Ansible.
11. 로그 (Logs)
원칙:
애플리케이션은 로그를 이벤트 스트림으로 취급하고, 중앙화된 로깅 서비스에 전달해야 합니다.
목적:
- 디버깅, 모니터링, 분석을 간소화.
- 로그 데이터의 실시간 활용.
실무 적용:
- 로깅 도구:
- ELK Stack(Elasticsearch, Logstash, Kibana), Grafana Loki.
- 로그를 표준 출력으로 출력:
console.log('Application started');
12. 관리 프로세스 (Admin Processes)
원칙:
관리 작업(예: 데이터베이스 마이그레이션)은 1회성 프로세스로 실행해야 합니다.
목적:
- 애플리케이션 실행과 관리 작업을 분리하여 안정성을 확보.
실무 적용:
- 데이터베이스 마이그레이션 도구:
- Flyway, Liquibase.
인증(Authentication)
개념:
12-Factor App 원칙에서는 명시적으로 다루지 않지만, 현대 애플리케이션 설계에서 중요한 보안 요소입니다.
주요 실무 적용:
- 환경 변수로 민감 정보 관리:
- API 키, OAuth 토큰은 환경 변수로 관리.
- JWT 또는 OAuth 사용:
- 사용자 인증 및 권한 부여를 처리.
- 보안 강화:
- HTTPS, TLS를 사용해 데이터 전송 암호화.
12-Factor App 원칙은 클라우드 환경에서 확장성 있고, 유지보수가 쉬운 애플리케이션을 설계하기 위한 실용적인 가이드입니다.
각 원칙을 적용함으로써 배포 주기의 단축, 운영 효율성 강화, 그리고 안정성 높은 애플리케이션 개발이 가능합니다.
'Java' 카테고리의 다른 글
[SSAFY] XML (0) | 2025.01.19 |
---|---|
[SSAFY] 레이어 패턴과 티어(Tier), 레이어(Layer) (0) | 2025.01.19 |
[SSAFY] Distributed Architecture (0) | 2025.01.19 |
(mac) Homebrew로 JAVA 17 JDK (8, 11, 17, 20) 설치하기. (0) | 2024.02.25 |