PHP 시니어 배포·운영 기술면접

PHP 시니어 (7년+) 배포 · 운영 5문항 조회수 31 · 2026-08-04 (화) 14:27:31
1 CI/CD 파이프라인
Hard

Q. PHP 애플리케이션의 GitLab CI/CD 파이프라인을 설계할 때 Build, Test, Deploy 단계를 어떻게 구성하고, 각 단계에서 실행해야 할 작업들을 설명해주세요. 또한 Docker 멀티 스테이지 빌드를 활용한 이미지 최적화 전략과 프로덕션 배포 전 Blue-Green 환경에서 Smoke Test를 수행하는 방법을 실무 관점에서 설명해주세요.

각 단계의 목적과 산출물을 먼저 정의하고, 파이프라인 실패 시 롤백 전략도 함께 고려해보세요.

A. 모범답안

Build 단계에서는 Composer 의존성 설치, 환경별 .env 파일 생성, 프론트엔드 에셋 빌드를 수행하고 Docker 멀티 스테이지 빌드로 개발 의존성을 제외한 경량 이미지를 생성합니다. Test 단계에서는 PHPUnit 단위 테스트, PHPStan 정적 분석, PHP-CS-Fixer 코드 스타일 검사를 병렬로 실행하고 코드 커버리지를 측정합니다. Deploy 단계에서는 Blue-Green 배포를 위해 새 컨테이너를 Green 환경에 배포한 후 헬스체크 엔드포인트로 Smoke Test를 실행하고, 성공 시 로드밸런서 트래픽을 전환합니다. Docker 멀티 스테이지 빌드에서는 첫 번째 스테이지에서 Composer install --no-dev로 프로덕션 의존성만 설치하고, 두 번째 스테이지에서 필요한 파일만 복사하여 이미지 크기를 최소화합니다. Smoke Test는 critical path API 엔드포인트 호출, 데이터베이스 연결 확인, 캐시 서버 응답 검증을 포함하며, 실패 시 자동으로 이전 버전으로 롤백됩니다.

핵심 포인트
  • • Build-Test-Deploy 단계별 명확한 책임 분리
  • • Docker 멀티 스테이지 빌드로 프로덕션 이미지 최적화
  • • Blue-Green 배포와 자동화된 Smoke Test
  • • 파이프라인 실패 시 자동 롤백 메커니즘
답변에 넣으면 좋은 키워드
GitLab CI/CD Docker 멀티 스테이지 Blue-Green 배포 Smoke Test 헬스체크 롤백
실무에서는

대규모 서비스에서 하루 수십 번의 배포를 안전하게 자동화하고 배포 실패 시 즉시 복구할 수 있습니다.

Follow-up 질문

Canary 배포와 Blue-Green 배포의 차이점을 설명하고, 각각 어떤 상황에서 적합한지 설명해주세요.

2 컨테이너 오케스트레이션
Hard

Q. Kubernetes 환경에서 PHP-FPM 애플리케이션을 운영할 때 Deployment, Service, Ingress, ConfigMap, Secret 리소스를 어떻게 구성해야 하는지 설명하고, Horizontal Pod Autoscaler(HPA)를 설정하여 CPU와 메모리 기반 오토스케일링을 구현하는 방법을 설명해주세요. 또한 Rolling Update 배포 중 zero-downtime을 보장하기 위한 readinessProbe와 livenessProbe 설정 전략을 실무 관점에서 설명해주세요.

Pod의 생명주기와 트래픽 라우팅 타이밍을 고려하여 각 Probe의 역할과 설정값을 구분해보세요.

A. 모범답안

Deployment에서는 replicas를 최소 3개로 설정하고 RollingUpdate 전략으로 maxSurge 1, maxUnavailable 0을 지정하여 항상 최소 replica 수를 유지합니다. Service는 ClusterIP 타입으로 Pod selector를 통해 트래픽을 분산하고, Ingress에서 TLS 종료와 도메인 라우팅을 처리합니다. ConfigMap에는 php.ini, php-fpm.conf 설정을 저장하고, Secret에는 데이터베이스 자격증명과 API 키를 암호화하여 저장한 후 환경변수로 주입합니다. HPA는 CPU 사용률 70%, 메모리 사용률 80%를 임계값으로 설정하고 minReplicas 3, maxReplicas 10으로 지정하여 트래픽에 따라 자동 확장합니다. readinessProbe는 HTTP GET /health로 애플리케이션이 트래픽을 받을 준비가 되었는지 확인하며 initialDelaySeconds 10, periodSeconds 5로 설정하고, livenessProbe는 애플리케이션 응답 불능 상태를 감지하여 Pod를 재시작하며 initialDelaySeconds 30, periodSeconds 10으로 설정합니다. Rolling Update 시 새 Pod의 readinessProbe가 성공해야만 Service 엔드포인트에 추가되고 이전 Pod가 제거되어 무중단 배포가 보장됩니다.

핵심 포인트
  • • Deployment RollingUpdate 전략으로 무중단 배포
  • • ConfigMap/Secret으로 설정과 민감정보 분리
  • • HPA로 CPU/메모리 기반 자동 스케일링
  • • readinessProbe와 livenessProbe의 명확한 역할 구분
답변에 넣으면 좋은 키워드
Kubernetes HPA RollingUpdate readinessProbe livenessProbe ConfigMap Secret
실무에서는

트래픽 급증 시 자동으로 Pod를 확장하고 배포 중에도 서비스 중단 없이 새 버전을 롤아웃할 수 있습니다.

Follow-up 질문

StatefulSet과 Deployment의 차이점을 설명하고, PHP 세션을 Redis에 저장하는 환경에서 어떤 것을 선택해야 하는지 설명해주세요.

3 무중단 배포
Hard

Q. PHP 애플리케이션에서 데이터베이스 스키마 변경이 포함된 배포를 무중단으로 수행하기 위한 전략을 설명해주세요. 특히 컬럼 추가, 컬럼 삭제, 컬럼 타입 변경 시나리오에서 Backward Compatibility를 유지하면서 단계적으로 배포하는 방법과 각 단계에서 애플리케이션 코드와 마이그레이션을 어떻게 조정해야 하는지 실무 관점에서 설명해주세요.

스키마 변경과 애플리케이션 배포를 분리하고, 구버전과 신버전이 동시에 실행되는 상황을 고려해보세요.

A. 모범답안

컬럼 추가 시에는 1단계에서 NULL 허용 컬럼을 추가하고, 2단계에서 신규 컬럼을 사용하는 애플리케이션 코드를 배포하며, 3단계에서 기존 데이터를 마이그레이션한 후 4단계에서 NOT NULL 제약조건을 추가합니다. 컬럼 삭제 시에는 1단계에서 애플리케이션 코드에서 해당 컬럼 사용을 제거하고, 2단계에서 충분한 시간이 지난 후 실제 컬럼을 DROP하여 구버전 코드가 모두 종료된 것을 보장합니다. 컬럼 타입 변경 시에는 1단계에서 새 타입의 임시 컬럼을 추가하고, 2단계에서 양쪽 컬럼을 모두 읽고 쓰는 Dual Write 로직을 배포하며, 3단계에서 기존 데이터를 마이그레이션하고, 4단계에서 기존 컬럼 읽기를 중단한 후, 5단계에서 기존 컬럼을 삭제하고 새 컬럼 이름을 변경합니다. 각 단계 사이에는 모든 인스턴스가 새 코드로 교체될 충분한 시간을 두고, 롤백 가능성을 고려하여 데이터 손실이 없도록 설계합니다. Feature Flag를 활용하면 코드는 배포하되 기능은 점진적으로 활성화할 수 있어 더 안전합니다.

핵심 포인트
  • • 스키마 변경을 여러 단계로 분리하여 Backward Compatibility 보장
  • • Dual Write 패턴으로 구버전과 신버전 동시 지원
  • • 각 단계 사이 충분한 대기 시간 확보
  • • Feature Flag로 배포와 기능 활성화 분리
답변에 넣으면 좋은 키워드
무중단 배포 스키마 마이그레이션 Backward Compatibility Dual Write Feature Flag
실무에서는

서비스 중단 없이 데이터베이스 스키마를 변경하고 문제 발생 시 안전하게 롤백할 수 있습니다.

Follow-up 질문

대용량 테이블에서 인덱스를 추가할 때 락을 최소화하는 방법과 pt-online-schema-change 같은 도구의 동작 원리를 설명해주세요.

4 모니터링 및 알림
Medium

Q. 프로덕션 PHP 애플리케이션의 종합적인 모니터링 시스템을 구축할 때 Application Performance Monitoring(APM), Infrastructure Monitoring, Log Aggregation을 어떻게 통합하여 운영해야 하는지 설명해주세요. 또한 New Relic이나 Datadog 같은 APM 도구에서 수집해야 할 핵심 메트릭과 알림 임계값 설정 전략, 그리고 장애 발생 시 MTTD(Mean Time To Detect)와 MTTR(Mean Time To Resolve)을 단축하기 위한 대시보드 구성 방법을 실무 관점에서 설명해주세요.

각 모니터링 계층이 제공하는 정보를 통합하여 장애의 원인을 빠르게 파악할 수 있는 구조를 생각해보세요.

A. 모범답안

APM에서는 응답 시간(p50, p95, p99), 처리량(throughput), 에러율, 데이터베이스 쿼리 성능, 외부 API 호출 시간을 추적하고 트랜잭션별 분산 추적(distributed tracing)으로 병목 지점을 식별합니다. Infrastructure Monitoring에서는 Prometheus와 Grafana로 CPU, 메모리, 디스크 I/O, 네트워크 트래픽을 수집하고 PHP-FPM 프로세스 수, OPcache 히트율을 모니터링합니다. Log Aggregation은 ELK Stack이나 Loki로 애플리케이션 로그, 웹 서버 액세스 로그, 에러 로그를 중앙 집중화하고 구조화된 로그 형식(JSON)으로 검색과 분석을 용이하게 합니다. 알림 임계값은 p95 응답 시간 1초 초과, 에러율 1% 초과, CPU 사용률 80% 지속 5분 등으로 설정하고 PagerDuty나 Slack으로 즉시 통보합니다. 대시보드는 비즈니스 메트릭(주문 수, 결제 성공률)을 상단에 배치하고 애플리케이션 메트릭, 인프라 메트릭 순으로 구성하여 장애 영향도를 먼저 파악한 후 원인을 드릴다운할 수 있게 합니다. 각 계층의 메트릭을 correlation ID로 연결하여 특정 요청의 전체 흐름을 추적할 수 있어 MTTD와 MTTR을 크게 단축할 수 있습니다.

핵심 포인트
  • • APM, Infrastructure, Log 세 계층의 통합 모니터링
  • • p95/p99 같은 percentile 기반 성능 메트릭 추적
  • • 비즈니스 메트릭 중심의 대시보드 구성
  • • correlation ID로 분산 추적 구현
답변에 넣으면 좋은 키워드
APM Prometheus Grafana ELK Stack distributed tracing MTTD MTTR
실무에서는

장애 발생 시 몇 분 내에 원인을 파악하고 복구하여 서비스 다운타임을 최소화할 수 있습니다.

Follow-up 질문

SLA(Service Level Agreement)와 SLO(Service Level Objective)의 차이를 설명하고, Error Budget 개념을 활용한 배포 의사결정 방법을 설명해주세요.

5 배포 롤백 전략
Hard

Q. 프로덕션 환경에서 PHP 애플리케이션 배포 후 심각한 버그가 발견되었을 때 즉시 롤백하는 전략을 설명해주세요. 특히 데이터베이스 마이그레이션이 포함된 경우 Forward-only Migration과 Rollback Migration의 장단점을 비교하고, 애플리케이션 코드 롤백과 데이터 정합성을 동시에 보장하는 방법을 설명해주세요. 또한 Feature Flag를 활용한 Kill Switch 패턴과 Database Migration Versioning 전략을 실무 관점에서 설명해주세요.

코드 롤백은 즉시 가능하지만 데이터 변경은 되돌리기 어렵다는 점을 고려하여 각 계층의 롤백 전략을 분리해보세요.

A. 모범답안

애플리케이션 코드 롤백은 Kubernetes에서 kubectl rollout undo 명령이나 이전 Docker 이미지 태그로 즉시 전환할 수 있지만, 데이터베이스 마이그레이션은 신중하게 처리해야 합니다. Forward-only Migration 전략에서는 마이그레이션을 절대 롤백하지 않고 새로운 마이그레이션으로 문제를 수정하며, 이는 데이터 손실 위험이 없고 여러 환경에서 일관성을 유지할 수 있지만 즉시 롤백이 불가능합니다. Rollback Migration 전략은 down() 메서드로 스키마 변경을 되돌릴 수 있지만 데이터 손실 가능성과 복잡한 마이그레이션에서 완벽한 롤백이 어렵다는 단점이 있습니다. 실무에서는 Feature Flag로 새 기능을 코드에는 배포하되 비활성화 상태로 유지하고, 문제 발생 시 Kill Switch로 즉시 기능을 끌 수 있어 코드 롤백 없이 대응할 수 있습니다. Database Migration Versioning은 마이그레이션 파일에 타임스탬프를 포함하고 migrations 테이블로 실행 이력을 추적하며, 각 마이그레이션이 멱등성을 보장하도록 설계합니다. 데이터 변경이 포함된 경우 별도의 데이터 마이그레이션 스크립트를 작성하고 dry-run 모드로 충분히 테스트한 후 단계적으로 실행하며, 백업을 선행하여 최악의 경우 Point-in-Time Recovery로 복구합니다.

핵심 포인트
  • • 애플리케이션 코드와 데이터베이스 마이그레이션의 롤백 전략 분리
  • • Forward-only Migration으로 데이터 정합성 보장
  • • Feature Flag와 Kill Switch로 즉시 기능 비활성화
  • • 마이그레이션 멱등성 보장과 백업 선행
답변에 넣으면 좋은 키워드
롤백 Forward-only Migration Feature Flag Kill Switch 멱등성 Point-in-Time Recovery
실무에서는

배포 후 치명적인 버그 발견 시 몇 분 내에 안전하게 이전 버전으로 복구하여 사용자 영향을 최소화할 수 있습니다.

Follow-up 질문

Canary 배포 중 문제가 발견되었을 때 자동 롤백을 트리거하는 메트릭 기반 의사결정 시스템을 어떻게 구현할 수 있는지 설명해주세요.

댓글 0

로그인 후 댓글을 작성할 수 있습니다.

아직 댓글이 없습니다. 첫 번째 댓글을 남겨보세요!