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개(☆표시)만 기억해도 큰 도움.

#원칙중요
1Codebase한 앱 = 한 저장소 = 여러 배포
2Dependencies의존성 명시적 선언·격리 (package.json)
3Config설정은 환경변수로 (코드와 분리)
4Backing ServicesDB·큐·SMTP는 리소스로 다룸(URL 교체 가능)
5Build/Release/Run3단계 엄격 분리
6Processes무상태(stateless), 공유 상태는 외부 저장
7Port Binding앱 자체가 포트 바인딩 (Nginx 의존 X)
8Concurrency프로세스 수평 확장
9Disposability빠른 시작·우아한 종료
10Dev/Prod Parity개발·운영 환경 최대한 같게
11Logsstdout으로 스트림 출력 (수집은 인프라 담당)
12Admin 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에서 서버를 수평 확장 가능하게 만드는 핵심 원칙(한 단어)은?