
포스트모템: 장애 후 분석
포스트모템의 목적과 작성 방법

포스트모템의 목적과 작성 방법
로드 밸런싱의 동작 원리와 활용 방법을 프로젝트 경험을 통해 이해한 과정

Terraform의 동작 원리와 활용 방법을 프로젝트 경험을 통해 이해한 과정

Vercel 대신 AWS S3에 정적 배포(Static Export)를 시도했다가 겪은 세 가지 악몽(이미지 최적화, API 라우트, 동적 라우팅)과 그 해결책을 공유합니다. '서버 없는 Next.js'가 어떤 제약이 있는지 확실히 이해하게 될 것입니다.

서비스를 운영하다 보면 장애는 피할 수 없다. 구글의 SRE 책을 읽으면서 '운영'이 단순 노가다가 아니라 고도의 엔지니어링 문제임을 이해했다. SLI, SLO, Error Budget 개념을 통해 소방관에서 건축가로 사고방식이 바뀌는 과정을 정리해본다.

장애가 나면 원인을 찾고 재발을 방지하는 게 중요하다. 그런데 실제로는 "복구했으면 됐지" 하고 넘어가는 경우가 많다. 나도 처음에 그랬다.
Postmortem이라는 문화를 접한 건 구글과 넷플릭스의 엔지니어링 블로그를 읽으면서였다. "장애 후 분석 보고서를 팀 전체에 공개한다"는 내용이 인상적이었다. 실수를 숨기는 게 아니라 오히려 공유해서 조직 전체가 배운다는 접근 방식이 와닿았다.
직접 코드를 짜다 보면 비슷한 실수를 반복하게 된다. DB 커넥션 풀이 고갈되는 건 대표적인 사례다. 커넥션을 제대로 반환하지 않으면 커넥션이 계속 쌓이고 결국 서비스가 멈춘다. 이런 문제는 한 번 겪고 나면 다시는 반복하고 싶지 않다.
그래서 포스트모템을 정리해봤다. 장애 후 분석 보고서를 어떻게 쓰는지, 왜 중요한지.
Postmortem은 직역하면 "사후 검시"입니다. 의학 용어인데, 개발 쪽에서는 장애가 발생한 후에 원인을 분석하고, 재발을 방지하기 위한 문서를 말합니다.
처음엔 "장애 보고서 쓰는 게 뭐가 중요해? 복구했으면 됐지" 하고 생각했다. 그런데 구글 SRE 문서를 읽다 보니 이런 내용이 있었다:
"포스트모템을 작성하지 않으면, 같은 실수를 또 하게 된다. 다음번엔 나 혼자의 문제가 아니라 팀 전체의 문제가 될 수 있다."
그 말이 와닿았다. 직접 겪어봐야 안다는 게 이런 거구나 싶었다.
구글이나 AWS 같은 큰 회사들이 공개한 포스트모템 형식을 참고해서 직접 써봤다. 구성은 이랬다:
가장 먼저 한눈에 보이는 요약을 씁니다:
날짜: 2025-01-15
시간: 03:00 - 05:00 (KST)
지속 시간: 2시간
영향: 전체 사용자 서비스 불가
심각도: Critical
근본 원인: DB 커넥션 풀 고갈
이렇게 쓰고 나니, 장애의 전체 그림이 한눈에 들어오더라고요.
그다음은 시간 순서대로 무슨 일이 있었는지 적습니다. 제 경우는 이랬어요:
03:00 - 모니터링 알람: 응답 시간 5초 초과
03:02 - 로그 확인: "Cannot get connection from pool" 에러 다수 발견
03:05 - DB 커넥션 풀 상태 확인: 100/100 (모두 사용 중)
03:10 - 서비스 재시작 시도 → 실패 (커넥션 여전히 고갈)
03:20 - 코드 리뷰: finally 블록에서 커넥션 반환 누락 발견
03:30 - 핫픽스 배포 시작
04:00 - 배포 완료
04:10 - DB 커넥션 풀 수동 초기화
04:30 - 서비스 정상화 확인
05:00 - 모니터링 정상 수치 확인, 장애 종료 선언
이렇게 쓰면서 느낀 건, 내가 뭘 잘못했는지가 명확히 보인다는 겁니다. 03:10에 서비스 재시작만 하고 끝낼 뻔했는데, 그랬으면 또 터졌을 거예요.
가장 중요한 부분입니다. 왜 이런 일이 발생했는가?
제 경우는 이랬습니다:
// 문제가 있던 코드
async function getUser(userId) {
const connection = await pool.getConnection();
try {
const result = await connection.query('SELECT * FROM users WHERE id = ?', [userId]);
return result[0];
} catch (error) {
console.error(error);
throw error;
}
// 문제: connection.release()를 안 했음!
}
finally 블록에서 connection.release()를 안 해서, 커넥션이 계속 쌓였던 겁니다. 하루에 수천 번 호출되는 함수였는데, 커넥션이 반환 안 되니까 결국 풀이 고갈된 거죠.
이렇게 여러 레벨의 원인을 찾는 게 중요합니다. "코드 실수"로만 끝내면, 또 비슷한 실수를 하거든요.
어떻게 고쳤는지 적습니다:
// 수정된 코드
async function getUser(userId) {
const connection = await pool.getConnection();
try {
const result = await connection.query('SELECT * FROM users WHERE id = ?', [userId]);
return result[0];
} catch (error) {
console.error(error);
throw error;
} finally {
// 추가: 반드시 커넥션 반환
connection.release();
}
}
그리고 더 나아가서, 이런 실수를 방지하는 헬퍼 함수도 만들었습니다:
// 커넥션 관리를 자동화하는 헬퍼
async function withConnection(callback) {
const connection = await pool.getConnection();
try {
return await callback(connection);
} finally {
connection.release(); // 자동으로 반환
}
}
// 사용 예시
async function getUser(userId) {
return withConnection(async (conn) => {
const result = await conn.query('SELECT * FROM users WHERE id = ?', [userId]);
return result[0];
});
}
이제 개발자가 release()를 깜빡해도 괜찮습니다. 자동으로 처리되니까요.
가장 중요한 부분입니다. 재발 방지를 위해 뭘 할 건가?
제 액션 아이템은 이랬어요:
즉시 (1주일 내):finally 블록 추가 (담당: 나, 완료: 1/16)withConnection 헬퍼 함수 도입 (담당: 나, 완료: 1/17)이렇게 담당자와 기한을 명확히 하는 게 중요하다. 안 그러면 "나중에 하자"가 되고, 결국 안 하게 된다.
포스트모템 문화에서 가장 중요하게 강조하는 원칙이 있다. "No Blame Culture" - 비난하지 않기.
처음엔 이해가 안 됐다. "내가 실수했는데, 내 잘못 아닌가?" 근데 구글 SRE 책에서 이런 내용을 읽었다:
"실수한 것은 맞다. 하지만 왜 그 실수를 할 수밖에 없었는지를 생각해봐야 한다. 커넥션 관리를 제대로 배운 적이 있는가? 모니터링이 있었는가? 코드 리뷰에서 누가 잡아줬는가? 문제는 시스템에 있다."
그 말이 와닿았다. 사람을 탓하면, 실수를 숨기게 된다. 그러면 조직 전체가 배울 기회를 잃는다.
포스트모템의 핵심 원칙:
1. 사람이 아닌 시스템을 개선한다처음으로 포스트모템 형식으로 정리해봤을 때, 몇 가지가 달라졌다.
1. 같은 실수를 안 하게 됐다몇 번 포스트모템을 쓰다 보니, 좋은 포스트모템과 나쁜 포스트모템의 차이를 알게 됐습니다.
제목: DB 장애
문제: DB가 다운됐음
원인: 커넥션 문제
해결: 재시작함
재발 방지: 조심하기
이건 아무 도움이 안 됩니다. 구체적이지 않고, 배울 게 없어요.
제목: DB 커넥션 풀 고갈로 인한 2시간 서비스 다운
요약:
- 날짜: 2025-01-15 03:00-05:00
- 영향: 전체 사용자 (약 1,000명)
- 근본 원인: finally 블록에서 커넥션 미반환
타임라인: (상세한 시간대별 기록)
근본 원인 분석:
- 직접 원인: connection.release() 누락
- 시스템 원인: 커넥션 풀 모니터링 부재
- 프로세스 원인: 코드 리뷰에서 리소스 관리 체크 안 함
해결:
- 즉시: finally 블록 추가
- 단기: withConnection 헬퍼 도입
- 장기: ORM 도입 검토
액션 아이템: (담당자, 기한 명시)
배운 점:
- 리소스는 반드시 반환해야 함
- 모니터링이 없으면 문제를 늦게 발견함
- 자동화가 수동 관리보다 안전함
차이가 보이시나요? 좋은 포스트모템은 구체적이고, 실행 가능하고, 배움이 있습니다.
포스트모템은 장애 후 원인을 분석하고 재발을 방지하기 위한 문서입니다. 타임라인, 근본 원인, 해결 방법, 액션 아이템을 구체적으로 작성하고, 사람이 아닌 시스템을 개선하는 데 집중하며, 투명하게 공유하여 조직 전체가 학습합니다. 실수를 숨기지 않고 공개하는 문화가 더 강한 시스템을 만듭니다.