문제 발생
↓
장애 감지
↓
영향 범위 파악
↓
긴급 복구
↓
원인 분석
↓
재발 방지
↓
문서화
나쁜 대응:
일단 서버 재시작
↓
잠깐 정상화
↓
원인 기록 없음
↓
며칠 뒤 같은 문제 반복
| 구분 | 의미 | 예시 |
|---|---|---|
| 버그 | 기능이 의도와 다르게 동작 | 버튼 문구 오류 |
| 장애 | 서비스 운영에 영향 발생 | 상담 신청 API 500 오류 |
| 보안 사고 | 민감정보/권한 문제 | 개인정보 로그 노출 |
| 데이터 사고 | 데이터 손실/불일치 | 주문 상태와 결제 상태 불일치 |
단순 UI 문구 오류:
버그
고객이 신청을 못함:
장애
관리자 엑셀 다운로드가 실패:
운영 장애
결제 완료인데 주문 상태가 미결제:
데이터 장애
전화번호가 로그에 그대로 노출:
보안 사고 가능성
| 등급 | 기준 | 예시 | 대응 |
|---|---|---|---|
| P0 | 서비스 핵심 기능 전체 중단 | 상담 신청 전체 실패, 서버 다운 | 즉시 복구/롤백 |
| P1 | 핵심 기능 일부 장애 | 관리자 로그인 불가, 주문 상태 변경 실패 | 최우선 수정 |
| P2 | 운영 기능 장애 | 엑셀 다운로드 실패, 알림톡 실패 일부 | 빠른 수정/재처리 |
| P3 | 낮은 영향도 | 일부 문구/스타일 오류 | 일반 수정 |
| Security | 보안/개인정보 이슈 | 권한 우회, 개인정보 노출 | 즉시 차단/조사 |
장애 발생
↓
등급 판단
↓
복구 방식 결정
P0:
롤백 우선
P2:
원인 파악 후 핫픽스 가능
CloudWatch/Sentry 에러 알림
API health check 실패
Nginx 502/504 증가
PM2 프로세스 down
Queue failed Job 증가
BatchJobLog FAILED
WebhookEvent FAILED
관리자 문의
고객 상담 문의
| 지표 | 위험 신호 |
|---|---|
| API 500 | 10분 내 5건 이상 |
| 상담 신청 수 | 평소 대비 급감 |
| Queue waiting | 계속 증가 |
| ExportJob | PROCESSING 30분 이상 |
| 알림톡 실패 | 1시간 내 10건 이상 |
| RDS CPU | 80% 이상 지속 |
| 디스크 사용량 | 90% 이상 |
| Nginx error.log | 502/504 반복 |
1. 고객 화면이 열리는가?
2. 상담 신청이 되는가?
3. 관리자 로그인이 되는가?
4. 주요 API가 500을 반환하는가?
5. DB 연결이 정상인가?
6. 최근 배포가 있었는가?
7. 외부 API 장애인가?
8. Queue/Worker가 밀리고 있는가?
에러 발생
↓
원인 모름
↓
일단 여러 파일 수정
↓
재배포
↓
문제 악화
에러 발생
↓
로그 확인
↓
영향 범위 파악
↓
최근 변경사항 확인
↓
롤백/핫픽스 판단
↓
복구 후 원인 분석
문제 제보 또는 알림 수신
↓
실제로 재현되는지 확인
↓
한 명만의 문제인지 전체 문제인지 확인
확인 예시:
curl -i https://api.example.com/health
sudo tail -n 100 /var/log/nginx/error.log
고객 화면 전체 문제인가?
특정 API만 문제인가?
관리자만 문제인가?
외부 API만 문제인가?
데이터 저장 실패인가?
최근 배포 커밋
DB migration
환경변수 변경
Nginx 설정 변경
외부 API 키 변경
Queue Worker 배포
Batch 스케줄 변경
롤백:
핵심 기능 장애, 원인 불명, 빠른 복구 필요
핫픽스:
원인이 명확하고 수정 범위가 작음
재시작:
메모리 누수, 프로세스 멈춤, 일시적 장애
재처리:
Queue/Webhook/Batch 실패 작업
수동 보정:
데이터 정합성 문제
health check 정상
주요 API 정상
관리자 기능 정상
로그 에러 감소
Queue 적체 해소
데이터 정합성 확인
장애 유형:
API 502 발생
확인 순서:
1. PM2 상태 확인
2. API 로그 확인
3. Nginx 로그 확인
4. DB 연결 확인
5. 최근 배포 확인
복구:
PM2 reload 또는 이전 버전 롤백
## Runbook: API 502 오류 대응
### 증상
- 고객 화면 또는 관리자 화면에서 API 요청 실패
- Nginx에서 502 Bad Gateway 발생
### 영향 범위
- 고객 상담 신청 실패 가능
- 관리자 API 호출 실패 가능
### 우선순위
- P0 또는 P1
### 확인 순서
1. API 서버 프로세스 상태 확인
2. Nginx error.log 확인
3. API 서버 로그 확인
4. DB/Redis 연결 확인
5. 최근 배포 여부 확인
### 확인 명령어
```bash
pm2 list
pm2 logs togethermall-api --lines 100
sudo tail -n 100 /var/log/nginx/error.log
curl -i http://localhost:3000/health
* Runbook은 완벽할 필요는 없습니다.
* 자주 터지는 장애부터 하나씩 만들면 됩니다.
---
### ✅ 9. 장애 유형별 Runbook 후보
#### ➕ 9-1. 서버/API 장애
```txt id="server-runbook-list"
API 502/504 오류
API 500 급증
PM2 프로세스 down
서버 디스크 용량 부족
메모리 사용량 급증
Nginx 설정 오류
SSL 인증서 만료
RDS 연결 실패
DB CPU 급증
느린 쿼리 발생
migration 실패
DB connection pool 부족
중복 데이터 발생
데이터 정합성 불일치
Worker 프로세스 down
Redis 연결 실패
Queue waiting 급증
failed Job 급증
ExportJob PROCESSING 장기 지속
알림톡 발송 Job 실패
알림톡 API timeout
SMS 발송 실패
결제 Webhook 실패
Webhook 서명 검증 실패
CRM 연동 실패
외부 API rate limit 발생
배포 후 API 500
환경변수 누락
Prisma migration 실패
프론트/백엔드 응답 구조 불일치
Worker jobName 불일치
CloudFront 캐시 문제
CloudWatch/Sentry에서 API 500 에러 증가
관리자 화면 일부 API 실패
고객 신청 실패 가능성
pm2 logs togethermall-api --lines 200
sudo tail -n 100 /var/log/nginx/error.log
curl -i https://api.example.com/health
확인할 것:
최근 배포 여부
특정 API만 실패하는지
DB 연결 오류인지
환경변수 누락인지
Prisma 에러인지
외부 API timeout인지
최근 배포 직후 전체 500:
즉시 롤백 우선
특정 API에서만 500:
해당 API 핫픽스 또는 기능 플래그 OFF
DB 연결 오류:
DB 상태와 connection pool 확인
환경변수 누락:
운영 env 반영 후 reload
PrismaClientInitializationError
Can't reach database server
API 500 증가
관리자 목록 조회 실패
pm2 logs togethermall-api --lines 100
echo $DATABASE_URL
nc -zv <rds-endpoint> 5432
확인할 것:
RDS가 running 상태인가?
보안 그룹에서 EC2 접근 허용인가?
DATABASE_URL이 올바른가?
비밀번호/포트/DB명이 맞는가?
connection limit에 도달했는가?
최근 RDS 변경이 있었는가?
환경변수 오류:
DATABASE_URL 수정 후 reload
보안 그룹 오류:
EC2 → RDS 5432 허용 확인
RDS 장애:
AWS 콘솔 상태 확인
connection 과다:
PM2 인스턴스/Prisma connection 관리 확인
상담 신청은 되지만 알림톡이 안 감
엑셀 Export가 계속 처리 중
Webhook 후속 작업이 밀림
Queue waiting count 증가
pm2 list
pm2 logs togethermall-worker --lines 200
docker compose logs -f worker
docker compose logs -f redis
확인할 것:
Worker 프로세스가 online인가?
Redis 연결이 정상인가?
failed Job이 급증했는가?
특정 jobName에서만 실패하는가?
외부 API timeout이 증가했는가?
Worker 배포 후 Unknown job name이 있는가?
Worker down:
Worker 재시작
Redis 연결 실패:
Redis 상태 확인
외부 API 장애:
재시도 간격 조정, 일시 중단 검토
Unknown job name:
Worker/API 버전 호환 확인 후 재배포
대량 적체:
concurrency 조정 또는 Worker 추가 검토
관리자 엑셀 다운로드가 계속 처리 중
ExportJob.status = PROCESSING
startedAt이 오래됨
S3 fileKey 없음
SELECT id, status, "startedAt", "updatedAt", "errorMessage"
FROM "ExportJob"
WHERE status = 'PROCESSING'
AND "startedAt" < NOW() - INTERVAL '30 minutes';
Worker가 실행 중인가?
Export Worker 로그에 에러가 있는가?
DB 조회가 너무 오래 걸리는가?
S3 업로드 실패인가?
메모리 부족으로 Worker가 죽었는가?
1. 해당 ExportJob을 FAILED로 변경
2. errorMessage에 사유 기록
3. 관리자에게 재시도 버튼 제공
4. 대용량 조건이면 기간 제한 안내
5. Worker 메모리/쿼리 최적화
WebhookEvent.status = FAILED
외부 결제/인증/알림 결과가 반영되지 않음
같은 eventId가 반복 수신됨
SELECT id, provider, "eventId", "eventType", status, "errorMessage", "receivedAt"
FROM "WebhookEvent"
WHERE status = 'FAILED'
ORDER BY "receivedAt" DESC
LIMIT 50;
서명 검증 실패인가?
payload 구조가 변경되었는가?
연관 orderId/consultId가 존재하는가?
상태 전이 불가인가?
중복 이벤트인가?
처리 중 DB 오류가 있었는가?
서명 실패:
Secret/Raw Body 설정 확인
payload 변경:
DTO/normalize 로직 수정
연관 데이터 없음:
외부 ID 매핑 확인
상태 전이 불가:
수동 확인 후 처리 여부 결정
일시적 DB 오류:
재처리 Queue 등록
배포 직후 API 500 증가
PM2 프로세스 재시작 반복
health check 실패
관리자 화면 오류
Worker Job 실패 증가
최근 배포 커밋
환경변수 추가 여부
migration 성공 여부
build 결과
PM2 logs
Worker logs
프론트/백엔드 API 응답 호환성
핵심 기능 장애:
즉시 이전 버전 롤백
환경변수 누락:
env 추가 후 reload
migration 실패:
DB 상태 확인 후 중단/복구
응답 구조 불일치:
프론트 또는 백엔드 빠른 호환 패치
Worker jobName 오류:
Worker 먼저 호환 배포
git checkout <previous-release-tag>
npm ci
npm run build
npx prisma migrate deploy
pm2 reload togethermall-api
## 장애 기록: 2026-07-12 상담 신청 API 500 오류
### 1. 개요
- 발생 시간:
- 복구 시간:
- 장애 등급:
- 영향 범위:
### 2. 증상
- 고객 상담 신청 API에서 500 오류 발생
- 관리자 상담 목록 일부 조회 실패
### 3. 원인
- 최근 배포에서 새 환경변수 누락
- NotificationQueue 초기화 중 오류 발생
### 4. 대응 과정
- 10:05 장애 감지
- 10:08 API 로그 확인
- 10:12 환경변수 누락 확인
- 10:15 운영 env 반영
- 10:17 PM2 reload
- 10:20 상담 신청 정상 확인
### 5. 영향
- 약 15분간 상담 신청 실패 가능
- 실패 요청 8건 확인
### 6. 복구 확인
- /health 정상
- 상담 신청 테스트 정상
- 관리자 목록 정상
- Queue Worker 정상
### 7. 재발 방지
- 배포 전 환경변수 체크리스트 추가
- 서버 시작 시 필수 env validation 적용
- 배포 후 상담 신청 smoke test 추가
무슨 일이 있었는가?
언제 발생했는가?
누가/어떻게 감지했는가?
사용자 영향은 무엇인가?
근본 원인은 무엇인가?
대응 과정은 어땠는가?
잘한 점은 무엇인가?
부족한 점은 무엇인가?
재발 방지 액션은 무엇인가?
나쁜 재발 방지:
다음부터 조심한다
좋은 재발 방지:
필수 환경변수 validation을 추가하고,
GitHub Actions 배포 전 env 체크 스크립트를 실행한다
| 장애 원인 | 재발 방지 |
|---|---|
| 환경변수 누락 | Config validation 추가 |
| DB migration 실패 | 배포 전 migration dry-run/checklist |
| Worker down 미감지 | Worker health 알림 추가 |
| Queue 적체 | waiting count 모니터링 |
| Export 메모리 부족 | streaming/chunk 처리 |
| Webhook 중복 처리 오류 | eventId unique 제약 |
| 상태 이력 누락 | 상태 변경 트랜잭션 강제 |
| Nginx 502 | PM2 health check와 자동 restart |
문제:
환경변수 누락으로 서버 시작 실패
액션:
ConfigService validationSchema에 필수 env 검증 추가
완료 기준:
필수 env가 없으면 서버가 시작되지 않고 명확한 에러 출력
우선순위:
P1
기한:
이번 주 내
관리자 상담/주문 시스템 운영 중 발생 가능한 장애 유형을 기준으로
API, DB, Queue, Webhook, Batch Runbook을 정리하고,
장애 발생 시 확인 명령어, 영향 범위, 복구 절차, 재발 방지 항목을 문서화하여
1인 개발 환경에서도 운영 대응 속도와 서비스 안정성을 개선했습니다.
단순 기능 개발을 넘어, 배포/장애/데이터 정합성/외부 API 실패 대응까지
운영 관점의 대응 체계를 구축했습니다.
특히 상담 신청, 알림톡, 엑셀 Export, Webhook, Batch 작업에 대해
장애 원인 추적과 재처리 가능한 구조를 정리해 운영 리스크를 낮췄습니다.
NestJS + Prisma + PostgreSQL + Redis + BullMQ + PM2 + Nginx 구조에서 장애 대응 Runbook을 만들고 싶어.
상황:
1. 백엔드는 EC2에서 PM2로 실행 중
2. Nginx가 api.example.com 요청을 localhost:3000으로 proxy_pass함
3. DB는 AWS RDS PostgreSQL
4. Redis는 Queue와 Rate Limit에 사용함
5. Worker는 알림톡, 엑셀 Export, Webhook 후속 처리를 담당함
6. 주요 기능은 상담 신청, 관리자 상담 목록, 엑셀 다운로드, 알림톡 발송임
7. 장애 유형별로 확인 명령어와 복구 절차를 정리하고 싶음
8. 장애 후 재발 방지 문서까지 남기고 싶음
요청:
- API 502 Runbook
- API 500 급증 Runbook
- DB 연결 실패 Runbook
- Queue 적체 Runbook
- ExportJob 장기 PROCESSING Runbook
- Webhook 실패 Runbook
- 배포 실패 롤백 Runbook
- 장애 기록 템플릿
- 재발 방지 액션 예시
를 실무 기준으로 정리해줘.