1인 서비스 장애 공지 페이지를 만드는 최소 구성
혼자 운영하는 서비스에서 장애가 나면 코드부터 고치고 싶습니다. 그러나 사용자는 원인이 무엇인지보다 지금 사용할 수 있는지, 언제 다시 확인하면 되는지를 먼저 알고 싶어 합니다. 공지가 늦으면 작은 장애도 불안으로 커집니다.
이번 글에서는 복잡한 상태 페이지 제품이 아니라, 혼자서 실제로 갱신할 수 있는 장애 공지의 최소 구성을 정리합니다. 관측 데이터와 공지 문장을 연결해 사후 회고까지 이어지는 흐름을 목표로 합니다.
장애 공지는 네 가지 사실로 시작합니다
첫 공지에는 원인을 추측해 쓰지 않습니다. 발생 시각, 영향 범위, 현재 조치, 다음 업데이트 시각 네 가지만 적습니다. 원인이 확인되지 않았는데 ‘서버 문제’라고 단정하면 나중에 공지를 다시 고쳐야 합니다.
영향 범위는 모든 사용자가 아니라 특정 기능·지역·계정·파일 유형처럼 확인된 범위로 씁니다. 모르는 것은 모른다고 표시하는 편이 신뢰를 지킵니다.
- 발생 시각: 처음 이상을 확인한 시간과 기준 시간대를 적습니다.
- 영향 범위: 사용할 수 없는 기능과 정상인 기능을 구분합니다.
- 현재 조치: 재시작·롤백·외부 문의처럼 진행 중인 행동을 적습니다.
- 다음 업데이트: 해결이 아니라 다음 공지를 올릴 시각을 약속합니다.
상태 페이지와 원인 분석 문서를 분리합니다
사용자에게 보여 주는 공지는 짧아야 합니다. 로그의 스택 트레이스나 내부 서비스 이름을 모두 공개할 필요는 없습니다. 대신 내부 회고 문서에는 감지·완화·복구·재발 방지의 상세 내용을 남깁니다.
이 둘을 분리하면 공지 작성 때문에 복구가 늦어지지 않고, 사용자는 필요한 정보만 빠르게 확인할 수 있습니다.
문서독자필수 내용
| 장애 공지 | 사용자 | 영향·조치·다음 업데이트 |
| 내부 타임라인 | 운영자 | 알림·명령·결정 시각 |
| 사후 회고 | 미래의 운영자 | 원인·기여 요인·재발 방지 |
관측 데이터가 공지의 근거가 됩니다
OpenTelemetry로 수집한 트레이스·메트릭·로그는 공지 문장을 대신 쓰지 않지만, 영향 범위를 확인하는 근거가 됩니다. 특정 경로의 오류율이 올랐는지, 전체 요청은 정상인지, 외부 의존성에서 지연이 생겼는지 확인할 수 있습니다.
다만 모든 데이터를 모으면 운영자가 더 빨리 판단하는 것은 아닙니다. 장애 시 먼저 볼 대시보드와 알림을 정해 두고, 공지에 쓸 수 있는 숫자는 최소한으로 선택합니다.
- 트레이스: 한 요청이 어느 구간에서 멈추는지 확인합니다.
- 메트릭: 오류율·지연·처리량의 변화를 봅니다.
- 로그: 특정 오류의 상세 조건과 복구 명령을 확인합니다.
해결 공지는 원인보다 사용자 행동을 먼저 말합니다
복구 후에는 ‘해결되었습니다’만 쓰지 않고 사용자가 다시 무엇을 하면 되는지 적습니다. 실패한 업로드를 다시 해야 하는지, 데이터가 중복되지 않았는지, 캐시를 지워야 하는지처럼 직접 영향을 받는 행동을 알려야 합니다.
원인은 확인된 범위에서만 간단히 설명하고, 상세 회고는 별도 문서로 남깁니다. 장애를 숨기지 않되 내부 정보를 무분별하게 공개하지 않는 균형이 필요합니다.
운영 가능한 크기로 줄이는 순서
작은 도구나 서비스의 설계는 기능 목록을 늘리는 일보다 경계를 줄이는 일에 가깝습니다. 저는 먼저 입력과 출력, 실패했을 때 사용자가 되돌릴 수 있는 지점을 적습니다. 그 다음 실제 사용량이나 파일 한두 개로 기준선을 만들고, 가장 비싼 작업과 가장 위험한 작업을 따로 표시합니다. 이 과정을 거치면 ‘있으면 좋은 기능’과 ‘없으면 복구할 수 없는 기능’을 구분할 수 있습니다.
첫 버전은 관찰할 수 있어야 합니다. 요청 수·처리 시간·오류·복구 성공 여부처럼 다음 결정을 돕는 기록을 최소한으로 남깁니다. 자동화나 클라우드 기능을 붙일 때도 기본값과 상한을 먼저 정하고, 테스트용 자원과 운영 자원을 분리합니다. 실패했을 때 원상 복구할 수 없는 기능은 공개 범위를 좁혀 시작하는 편이 안전합니다.
- 경계: 지원하는 입력·사용자·환경과 지원하지 않는 범위를 적습니다.
- 기준선: 정상 입력 하나와 실패 입력 하나를 저장해 반복 테스트합니다.
- 관찰: 비용·지연·오류·복구에 필요한 최소 지표만 수집합니다.
- 되돌리기: 배포·삭제·마이그레이션을 취소하는 절차를 실제로 시험합니다.
다음 작업에서 다시 확인할 항목
한 번 적용한 방법이 언제나 같은 결과를 내는 것은 아닙니다. 사람과 서비스와 원고의 조건이 바뀌면 같은 원칙도 다른 판단을 요구합니다. 그래서 저는 글을 작성한 뒤 결론만 보관하지 않고, 결론이 성립한 조건과 다시 확인해야 할 조건을 함께 적습니다. 이 기록이 있으면 몇 달 뒤 글을 업데이트할 때 당시의 경험을 현재의 사실처럼 착각하지 않을 수 있습니다.
특히 버전·정책·가격·플랫폼 기능처럼 외부에서 바뀌는 내용은 조사한 날짜와 공식 문서의 주소를 남깁니다. 발행 시점에 문서가 달라졌다면 본문에 변경 사실을 표시하고, 직접 확인하지 못한 부분은 독자가 알 수 있도록 범위를 제한합니다. 경험을 공유하는 글도 다른 사람의 환경에 그대로 적용될 수 있으므로, 성공 사례보다 실패 조건을 함께 쓰는 편이 안전합니다.
마지막으로 이 글을 읽은 분이 바로 할 수 있는 행동은 하나로 줄입니다. 모든 항목을 한꺼번에 바꾸기보다 현재 상태를 기록하고, 작은 실험을 한 번 실행하고, 결과를 다시 적는 순서입니다. 그렇게 쌓인 기록이 다음 글의 소재가 되고, 처음의 판단을 더 정확하게 고쳐 쓰는 근거가 됩니다.
- 범위 표시: 이 글의 결론이 적용되는 환경과 적용되지 않는 환경을 구분합니다.
- 날짜 기록: 버전·정책·가격·문서를 확인한 날짜를 남깁니다.
- 실패 조건: 어떤 상황에서는 이 방법을 쓰지 말아야 하는지 적습니다.
- 작은 실행: 독자가 오늘 시도할 수 있는 가장 작은 행동을 고릅니다.
- 후속 기록: 실행 결과와 다음에 바꿀 조건을 별도 메모로 남깁니다.
이 기록을 나중에 다시 읽을 때는 결과만 보지 않고 당시의 조건도 함께 확인합니다. 조건이 달라졌다면 결론을 그대로 복사하지 말고 현재의 입력과 제약을 다시 적습니다. 그 과정을 거쳐야 이 글이 단순한 경험담이 아니라 다음 판단을 돕는 작업 기록으로 남습니다.
마치며
장애 공지의 품질은 문장이 화려한지보다 다음 업데이트 약속을 지켰는지, 사용자가 자신의 상황을 판단할 수 있었는지로 결정됩니다. 운영 중인 서비스에 네 가지 사실을 입력하는 공지 템플릿을 먼저 만들어 두시기 바랍니다.
참고한 문서: OpenTelemetry .NET · GitHub 커뮤니케이션 가이드