본문 바로가기
개발자/실무 개발 현장

배포 후 장애 터졌을 때, 그 긴박했던 밤 이야기

by 나무011 2026. 6. 15.
🚨 개발자 솔직 경험담

금요일 오후 6시 배포, 오후 9시 슬랙 알림, 그리고 새벽 2시까지

2026. 06. 09 · 개발자 경험담 · 읽는 시간 약 9분

금요일 오후 6시는 개발자에게 있어서 묘하게 긴장되는 시간이다. 딱 퇴근하기 전, 배포 하나만 올리면 되는 시간. "이거 금방 끝나, 간단한 거야"라고 스스로를 설득하며 배포 버튼을 눌렀다.

그리고 세 시간 뒤, 슬랙에 알림이 쏟아지기 시작했다.

이 글은 내가 처음으로 프로덕션 장애를 겪었던 그날 밤의 기록이다. 당황했던 것, 실수했던 것, 그리고 결국 복구하면서 배운 것들을 최대한 솔직하게 적었다.

 

배포 후 장애 터졌을 때
배포 후 장애 터졌을 때

 

발단 — "이건 간단한 배포야"

그날 배포는 작은 기능 추가였다. 사용자 프로필 페이지에 최근 활동 탭 하나를 붙이는 작업. 기획서도 간단했고, 코드도 100줄 남짓이었다. 스테이징 환경에서도 잘 돌았다.

퇴근 직전에 배포하는 게 습관적으로 나쁘다는 걸 알면서도, "이거 진짜 간단한 거잖아"라는 생각이 이겼다. Vercel 배포 완료 초록불을 보고 노트북을 닫았다. 그게 실수의 시작이었다.

"스테이징에서 됐으면 프로덕션에서도 된다"는 가정이 얼마나 위험한지, 그날 뼈저리게 배웠다.

그날 밤 — 분 단위 기록

18:02
DEPLOY COMPLETE
배포 완료. Vercel 초록불 확인. 노트북 닫고 퇴근. 편의점에서 맥주 하나 샀다.
21:07
FIRST ALERT
슬랙 알림 첫 번째. 팀장님 DM. "혹시 오늘 배포한 거 확인해봤어요?" 순간 심장이 쿵 내려앉았다.
21:09
INCIDENT CONFIRMED
Sentry 대시보드 열었더니 에러 카운트가 분당 200개. 프로필 페이지 전체가 500 에러. 사용자들이 접근 불가.
21:15
ROOT CAUSE HUNT
에러 로그 확인. 스테이징 DB에는 있는 컬럼이 프로덕션 DB에는 없었다. 마이그레이션을 빠뜨렸다.
21:22
ROLLBACK ATTEMPT
Vercel에서 이전 배포로 롤백 시도. 근데 DB 스키마 문제라 코드 롤백만으로는 해결이 안 된다는 걸 깨달았다.
21:40
HOTFIX BRANCH
팀장님과 영상통화 연결. 핫픽스 브랜치 생성. 프로덕션에 마이그레이션 직접 실행하기로 결정. 손이 떨렸다.
22:18
MIGRATION RUNNING
프로덕션 DB에 마이그레이션 실행. 30초가 1시간 같았다. 터미널 커서만 바라봤다.
22:31
SERVICE RESTORED
Sentry 에러 카운트 0. 프로필 페이지 정상 응답 확인. 슬랙에 "복구 완료" 메시지 전송. 처음으로 숨 쉬었다.
02:00
POST-MORTEM WRITTEN
원인 분석 문서 작성 완료. 재발 방지 대책 3가지 정리. 모니터링 알림 임계값도 조정. 새벽 2시에 잠들었다.

그날 밤 내 감정 그래프

😌
18:02
안도
😨
21:07
불안
😱
21:09
패닉
🤯
21:22
혼란
😤
21:40
집중
😮‍💨
22:31
안도
😶
02:00
멍함

원인 분석 — 결국 체크리스트 문제였다

에러의 직접적인 원인은 단순했다. 프로덕션 DB에 마이그레이션을 실행하지 않은 채로 새 컬럼을 참조하는 코드를 배포한 것. 스테이징과 프로덕션의 DB 스키마가 달랐는데 그걸 확인하지 않았다.

sentry_error_log.txt
ERROR [21:07:43] column "recent_activity" does not exist
at Object.query (/app/node_modules/@prisma/client/runtime/index.js)
at ProfilePage.getServerSideProps (/app/pages/profile/[id].tsx:34:18)
 
PrismaClientKnownRequestError: Invalid `prisma.user.findUnique()` invocation
Raw query failed. Code: `42703`
 
→ 원인: production DB에 migration 미실행
→ 영향: 프로필 페이지 전체 500 에러 (약 1시간 24분)

근본 원인은 더 깊은 곳에 있었다. 우리 팀에 배포 전 체크리스트가 없었다. "이건 간단한 배포니까 괜찮겠지"라는 암묵적 판단이 반복되면서 마이그레이션 확인 같은 기본 절차가 생략된 거다.

🚨 핵심 실수

스테이징 환경과 프로덕션 환경의 DB 스키마 동기화 상태를 배포 전에 한 번도 확인하지 않았다. 간단한 배포일수록 체크리스트는 더 무시되기 쉽다.

복구 과정 — 패닉 속에서 배운 것들

장애 대응에서 가장 힘들었던 건 기술적인 부분이 아니었다. 패닉 상태에서 침착하게 판단하는 것이 제일 어려웠다. 처음에 Vercel 롤백을 먼저 했는데, 그게 의미 없다는 걸 15분 후에야 깨달았다. 허둥대지 않고 원인부터 파악했어야 했다.

팀장님이 영상통화에서 한 말이 기억에 남는다. "일단 숨 한번 쉬고, 로그부터 봐요." 그 말이 없었으면 더 오래 걸렸을 것 같다.

💡 INSIGHT

장애 대응은 빠름보다 침착함이 먼저다. 패닉 상태에서 내린 결정은 대부분 상황을 더 복잡하게 만든다. 로그를 읽고 원인을 파악하는 데 10분을 더 쓰는 게 잘못된 롤백으로 30분을 낭비하는 것보다 낫다.

그 후 — 재발 방지 체크리스트

새벽에 포스트모템을 쓰면서 팀 전체가 쓸 수 있는 배포 전 체크리스트를 만들었다. 지금도 쓰고 있다.

✅ 배포 전 필수 체크리스트 (우리 팀 버전)
  •  
    스테이징 DB와 프로덕션 DB 스키마 diff 확인
  •  
    마이그레이션 파일 존재 여부 및 실행 순서 검토
  •  
    배포 후 즉시 확인할 핵심 페이지 목록 준비
  •  
    Sentry / 모니터링 대시보드 배포 전후 비교 준비
  •  
    롤백 시나리오 사전 정의 (코드 롤백만으로 충분한지 여부)
  •  
    금요일 오후 5시 이후 배포 금지 (진심)

장애가 남긴 4가지 교훈

01
간단한 배포가 더 위험하다 큰 배포는 다들 긴장해서 꼼꼼히 확인한다. 작은 배포일수록 방심하게 되고, 그게 장애의 씨앗이 된다.
02
로그는 거짓말을 안 한다 패닉 상태에서 본능적으로 이것저것 건드리고 싶어진다. 하지만 로그를 먼저 읽으면 원인이 보인다.
03
혼자 대응하지 마라 장애 대응은 팀 스포츠다. 혼자 끌어안고 있으면 판단이 흐려진다. 빨리 보고하고 같이 대응하는 게 맞다.
04
포스트모템이 진짜 자산이다 장애가 끝난 뒤 쓰는 원인 분석 문서. 귀찮아도 써야 한다. 6개월 뒤 같은 실수를 막아주는 유일한 방패다.

그래서 지금은?

그날 이후로 나는 배포 버튼 앞에서 딱 10초를 더 멈춘다. 체크리스트를 한 번 더 읽는 10초. 귀찮지만, 그 10초가 새벽 2시까지 버티는 밤을 막아준다는 걸 이제는 안다.

그리고 솔직히 말하면, 그 장애가 없었다면 지금의 내가 없었을지도 모른다. 책으로는 절대 못 배우는 것들 — 프로덕션 DB 앞에서의 손 떨림, 팀장님의 "숨 한번 쉬고" 한마디, 에러 카운트가 0이 됐을 때의 그 안도감. 그게 나를 더 조심스럽고 더 꼼꼼한 개발자로 만들어줬다.

금요일 오후에 배포하지 마세요. 진심으로.

혹시 비슷한 경험이 있으신가요?

처음 프로덕션 장애를 겪었을 때 어떻게 대응하셨나요?
댓글로 경험 나눠주세요 👇


소개 및 문의 · 개인정보처리방침 · 면책조항

© 2026 나무핀