topic★★★★★난이도 · 약 20분
DevOps 철학 · 12-Factor App
Dev↔Ops 경계 붕괴 · 12가지 배포 친화 원칙 — 프로덕션에 올리기 쉬운 앱의 체크리스트.
#DevOps#12-factor#Stateless#Config
왜 배우는가
"내 컴퓨터에서는 됐는데"를 종결시키는 원칙 모음. 특히 환경변수·무상태·로그 stdout 3개만 지켜도 배포가 확 수월해진다.
DevOps는 도구가 아니라 문화. 개발팀(Dev)과 운영팀(Ops)이 따로 놀던 시대를 끝내고 "빌드한 사람이 운영한다(You build it, you run it)"로 간다. CI/CD·모니터링·IaC가 이 문화의 기술적 결과물.
12-Factor App(Heroku, 2011)은 클라우드 친화 앱의 체크리스트. 낡아 보여도 2026년에도 유효. 바이브코더는 최소 6개(☆표시)만 기억해도 큰 도움.
| # | 원칙 | 뜻 | 중요 |
|---|---|---|---|
| 1 | Codebase | 한 앱 = 한 저장소 = 여러 배포 | |
| 2 | Dependencies | 의존성 명시적 선언·격리 (package.json) | |
| 3 | Config | 설정은 환경변수로 (코드와 분리) | ☆ |
| 4 | Backing Services | DB·큐·SMTP는 리소스로 다룸(URL 교체 가능) | ☆ |
| 5 | Build/Release/Run | 3단계 엄격 분리 | |
| 6 | Processes | 무상태(stateless), 공유 상태는 외부 저장 | ☆ |
| 7 | Port Binding | 앱 자체가 포트 바인딩 (Nginx 의존 X) | ☆ |
| 8 | Concurrency | 프로세스 수평 확장 | |
| 9 | Disposability | 빠른 시작·우아한 종료 | |
| 10 | Dev/Prod Parity | 개발·운영 환경 최대한 같게 | ☆ |
| 11 | Logs | stdout으로 스트림 출력 (수집은 인프라 담당) | ☆ |
| 12 | Admin Processes | 마이그레이션은 일회성 프로세스 |
typescript
// ━━━ 3번 Config — 환경변수 ━━━
// ❌ 하드코딩
const db = new Pool({ host: "prod.example.com", password: "xxx" });
// ✅ 환경변수
const db = new Pool({ connectionString: process.env.DATABASE_URL });
// ━━━ 6번 Stateless ━━━
// ❌ 메모리에 세션 저장 (서버 재시작 시 로그아웃)
const sessions = new Map();
// ✅ Redis·DB에 세션 저장
await redis.set(`sess:${sid}`, JSON.stringify(data));
// ━━━ 11번 Logs to stdout ━━━
// ❌ 파일로 직접
fs.appendFileSync("app.log", JSON.stringify(event));
// ✅ stdout (인프라가 수집)
console.log(JSON.stringify({ ts: Date.now(), level: "info", msg: "..." }));
// Vercel·Railway·Docker가 이걸 수집해 CloudWatch·Datadog로 전송이 3가지만 지키면 Vercel·Railway·Fly.io·Docker 어디든 무수정 배포 가능. 바이브코더가 가장 많이 어기는 부분.
현대 변주 — 15-Factor. 2010년대 후반 관측성(Observability)·보안·API-first·원격 인증을 추가한 15-Factor도 있음(Kevin Hoffman). "12F는 기본, 그 위에 관측성·API-first"로 이해하면 충분.
실기 드릴 2문항
check_circle실기 드릴 · OX
12-Factor App에서는 DB 비밀번호를 코드에 직접 넣는 것이 권장된다.
edit실기 드릴 · 단답형
12-Factor에서 서버를 수평 확장 가능하게 만드는 핵심 원칙(한 단어)은?