문제 발생
↓
원인 분석
↓
수정
↓
검증
↓
문서화
↓
다음에 같은 문제 발생
↓
빠른 재대응
같은 문제를 다시 처음부터 분석함
왜 그렇게 수정했는지 기억이 안 남
AI/Codex가 과거 맥락 없이 다시 잘못 수정할 수 있음
운영 장애 대응 경험이 포트폴리오로 남지 않음
재발 방지 작업이 누락됨
운영 장애
배포 후 오류
DB migration 문제
데이터 정합성 문제
외부 API 장애
알림톡 발송 실패
Webhook 중복/검증 문제
권한/인증 오류
대량 Export 실패
관리자 핵심 UX 오류
보안 관련 문제
단순 문구 오타
작은 CSS 간격 수정
일회성 이미지 교체
원인이 명확한 단순 validation 오류
30분 이상 원인 분석이 필요했는가?
운영에 실제 영향을 줬는가?
같은 문제가 다시 생길 수 있는가?
다른 기능에도 영향을 줄 수 있는가?
해결 과정에서 배울 점이 있었는가?
# Troubleshooting: 상담 상태 변경 후 목록이 갱신되지 않는 문제
## 1. 문제 상황
- 관리자 상담 상세에서 상태를 변경했지만 목록 화면에는 이전 상태가 유지됨
## 2. 발생 조건
- 관리자 상담 상세 → 상태 변경
- 목록으로 돌아왔을 때 재현
- TanStack Query cache 사용 중
## 3. 영향 범위
- 상담 처리 상태 오인 가능
- 관리자 중복 작업 가능
- 운영자가 새로고침해야 정상 상태 확인 가능
## 4. 원인
- 상태 변경 mutation 성공 후 consult list query invalidate가 실행되지 않음
- detail query만 invalidate됨
## 5. 해결 방법
- mutation 성공 후 consult list와 consult detail query를 모두 invalidate
- queryKey 기준 통일
## 6. 검증
- 상태 변경 후 상세 화면 갱신 확인
- 목록으로 이동 후 상태 반영 확인
- 상태 필터별 목록 재조회 확인
- 다른 상담 row 영향 없음 확인
## 7. 재발 방지
- mutation별 invalidate 대상 문서화
- queryKey factory 도입 검토
- 상태 변경 E2E 테스트 추가
## 8. 관련 파일
- update-consult-status.mutation.ts
- consult-query-key.ts
- consult-list.page.tsx
## 9. 관련 커밋
- fix(admin): 상담 상태 변경 후 목록 캐시 갱신
## 10. 배운 점
- 서버 상태 변경 후 화면 일관성을 위해 관련 query cache를 함께 갱신해야 함
문제 상황
발생 조건
영향 범위
원인
해결 방법
검증
재발 방지
관리자 신청 모달에서 드롭다운을 열면 옵션 영역이 모달 하단에 가려져 마지막 항목을 선택할 수 없음
z-index 문제 발생
문제:
실제 증상을 알 수 없음
원인을 미리 단정함
다른 원인이었을 가능성을 놓침
누가:
고객/관리자
어디에서:
페이지/기능
무엇을 했을 때:
행동
무슨 일이 발생했는가:
증상
환경:
운영 / 개발
사용자:
관리자 STAFF 권한
브라우저:
Chrome / Safari
화면:
상담 상세
데이터 조건:
현재 상태 = PENDING
행동:
상태를 CALLING으로 변경
결과:
409 Conflict 발생
1. 관리자 로그인
2. PENDING 상태 상담 상세 진입
3. 상태를 CALLING으로 변경
4. 저장 버튼 클릭
5. 409 에러 발생 확인
누구나 같은 절차로 재현할 수 있어야 함
환경/브라우저/권한 조건 기록
특정 데이터 조건이 있으면 명시
고객 영향
관리자 영향
데이터 영향
매출 영향
보안 영향
외부 API 영향
배포 영향
고객 영향:
없음
관리자 영향:
상담 상태를 정상적으로 변경할 수 없음
데이터 영향:
상태 update는 실패하므로 데이터 오염 없음
운영 영향:
관리자 상담 처리 중단 가능
P0:
서비스 전체 중단, 개인정보/데이터 손실, 치명적 장애
P1:
핵심 기능 장애, 상담/주문 처리 불가
P2:
일부 기능 오류, 우회 가능
P3:
경미한 UI/편의 문제
상태 변경 API에서 새로운 PermissionGuard를 적용한 직후 오류 발생
기존 JWT payload에는 permissions 필드가 없었지만
PermissionGuard가 항상 permissions 배열이 존재한다고 가정함
Trigger:
문제가 드러난 계기
Root Cause:
문제가 발생하게 만든 구조적 원인
문제:
상담 상태 변경이 500 오류 발생
왜?
→ Audit Log insert가 실패함
왜?
→ beforeValue에 Date 객체가 예상 형식과 다르게 들어감
왜?
→ Audit Log Factory 없이 Use Case에서 객체를 직접 생성함
왜?
→ Audit Log payload 표준이 정의되어 있지 않음
근본 원인:
Audit Log 입력 형식과 sanitize 기준이 공통화되어 있지 않음
AuditLogFactory 도입
입력 schema 검증
Integration Test 추가
기존:
Controller에서 상태 update와 history insert를 순차 실행
변경:
UpdateConsultStatusUseCase에서 transaction을 열고
ConsultRepository와 AuditLogRepository에 동일 tx 전달
결과:
상태 변경/이력/Audit Log 중 하나가 실패하면 전체 rollback
코드 수정해서 해결
기존 구조
수정한 구조
왜 이 방법을 선택했는가?
다른 대안은 왜 쓰지 않았는가?
영향 파일은 무엇인가?
정상:
NEW → CALLING 변경 성공
비정상:
CANCELED → CONVERTED 차단
동시성:
다른 관리자가 먼저 수정하면 409
이력:
상태 변경 history 생성
Audit:
CONSULT_STATUS_UPDATE 로그 생성
프론트:
목록과 상세 상태 동기화
NOT_TESTED
MANUAL_TESTED
AUTOMATED_TESTED
DEPLOYED_VERIFIED
로컬에서만 확인:
운영 검증 완료라고 쓰지 않기
Unit Test만 성공:
E2E 검증 완료라고 쓰지 않기
배포만 완료:
문제 해결 완료라고 단정하지 않기
Unit Test 추가
Integration Test 추가
E2E Test 추가
Validation 추가
DB constraint 추가
Monitoring 추가
Alert 추가
Runbook 작성
공통 컴포넌트화
Lint/CI 규칙 추가
권한/Policy 공통화
문제:
상태 변경 이력 누락
재발 방지:
- 상태 변경 Use Case Integration Test 추가
- 상태 update/history/audit transaction 강제
- 현재 상태와 마지막 history 정합성 점검 쿼리 추가
[ ] 상태 변경 Integration Test 추가
[ ] Audit Log Factory 적용
[ ] 관련 Runbook 링크 추가
에러/운영 문제 발생
↓
사용자가 짧은 메모 작성
↓
Git 변경사항 수집
↓
관련 commit/diff 수집
↓
관련 로그/에러 코드 입력
↓
AI 초안 생성
↓
사용자 검토
↓
Markdown 저장
↓
Notion 업로드
현재 브랜치
최근 commit
변경 파일
git diff --stat
수정 시간
관련 test 결과
관련 issue/ticket 번호
실제 증상
운영 영향
재현 절차
근본 원인
왜 해당 해결책을 선택했는지
배포 후 실제 결과
llm-report troubleshoot
llm-report troubleshoot --project togethermall
llm-report troubleshoot --since HEAD~3
llm-report troubleshoot --commit abc123
llm-report troubleshoot --upload-notion
문제 제목:
문제 상황:
영향 범위:
재현 여부:
관련 에러 코드:
원인:
해결 방법:
검증 결과:
재발 방지:
~/shn/daily-report/
togethermall/
troubleshooting/
2026-09/
2026-09-07_consult-status-cache.md
YYYY-MM-DD_<short-slug>.md
---
date: 2026-09-07
project: togethermall
type: troubleshooting
severity: P1
status: resolved
domain:
- consult
- admin
tags:
- bugfix
- transaction
- audit-log
relatedCommits:
- abc123
verification: DEPLOYED_VERIFIED
---
date
project
severity
status
domain
tags
relatedCommits
verification
incidentId
notionPageId
INVESTIGATING
IDENTIFIED
FIXED
TESTED
DEPLOYED
RESOLVED
MONITORING
개발 중 발견된 문제
운영 영향 없는 버그
구조적 문제 분석
성능 저하 원인 분석
운영 서비스 장애
고객 신청 불가
관리자 핵심 기능 중단
데이터 오류
개인정보/보안 문제
대량 알림 실패
Troubleshooting:
기술 해결 기록
Incident:
영향 + 타임라인 + 복구 + 재발 방지까지 포함
# Incident: 상담 신청 API 장애
## 1. 요약
- 상담 신청 API에서 500 오류가 발생해 일정 시간 신규 상담 접수가 불가능했습니다.
## 2. 영향
- 고객 상담 신청 실패
- 영향 시간: 10:20 ~ 10:42
- 관리자 기존 상담 조회에는 영향 없음
## 3. 타임라인
- 10:20 최초 오류 발생
- 10:24 관리자 문의로 인지
- 10:27 로그 확인 시작
- 10:32 Prisma migration 오류 확인
- 10:36 수정 배포
- 10:42 정상화 확인
## 4. 근본 원인
- 신규 필드를 NOT NULL로 추가했지만 기존 데이터 backfill 없이 migration 적용
## 5. 복구
- 필드를 nullable로 수정
- migration 재적용
- 상담 신청 Smoke Test 진행
## 6. 재발 방지
- destructive migration 체크리스트 추가
- staging migration 검증 의무화
- 배포 전 상담 신청 E2E Test 추가
## 7. 관련 자료
- requestId:
- commit:
- migration:
- deploy:
에러 로그 최초 발생 시각
배포 시각
commit 시각
Worker FAILED 증가 시각
API 복구 시각
Smoke Test 완료 시각
09:13 배포 완료
09:15 500 error 최초 감지
09:18 CONSULT_CREATE_FAILED 증가
09:24 hotfix commit 생성
09:29 재배포
09:31 health check 정상
09:34 상담 신청 Smoke Test 정상
자동 수집 시각은 사실 확인 필요
로그 시각 timezone 통일
추정 시각을 실제 사건처럼 쓰지 않기
왜 발견이 늦었는가?
왜 테스트가 못 잡았는가?
왜 배포 단계에서 막히지 않았는가?
왜 장애 영향이 커졌는가?
무엇을 자동화하면 다음에 빨리 막을 수 있는가?
실수로 잘못 배포했다.
다음부터 조심한다.
migration에 기존 데이터 backfill이 필요한 변경이었지만,
배포 체크리스트에 nullable/default 검증 항목이 없어 사전에 발견하지 못했다.
재발 방지를 위해:
- migration checklist에 backfill 검증 추가
- staging migration 테스트 추가
- 상담 신청 E2E Test를 CI 필수 단계로 추가
대규모 장애를 해결해 운영 역량을 증명했습니다.
운영 중 발생한 DB migration 오류를 분석해 복구하고, 이후 staging migration 검증과 배포 체크리스트를 추가해 동일 유형의 장애를 사전에 확인할 수 있는 기준을 마련했습니다.
장애를 자랑하지 않기
문제 해결 과정 강조
재발 방지 개선 강조
운영 책임감과 학습을 보여주기
Troubleshooting
↓
Daily Report:
오늘 해결한 이슈로 링크
Weekly Report:
해결한 주요 이슈로 요약
Monthly Report:
운영 안정성 개선 성과로 변환
## 해결한 이슈
- 상담 상태 변경 후 목록 캐시 미갱신 문제 해결
- 자세한 내용: troubleshooting/2026-09-07_consult-cache.md
이번 주 주요 운영 이슈:
- 상담 상태 변경 후 목록 동기화 문제 해결
- NotificationJob retry 오류 해결
운영 안정성:
- 상태 변경 캐시 동기화 문제와 NotificationJob 재시도 오류를 해결하고 관련 테스트/재발 방지 기준을 추가했습니다.
다음 문제 해결 기록을 바탕으로 트러블슈팅 문서 초안을 작성해줘.
조건:
1. 한국어로 작성
2. 실제 제공된 사실만 사용
3. 원인을 확정할 근거가 부족하면 “추정 원인”으로 표시
4. 문제 상황과 원인을 분리
5. 발생 조건과 재현 절차를 정리
6. 고객/관리자/데이터/운영 영향 범위를 구분
7. Trigger와 Root Cause를 가능하면 구분
8. 해결 방법과 선택 이유를 작성
9. 검증한 항목과 아직 검증하지 않은 항목을 구분
10. 재발 방지 TODO를 작성
11. 관련 커밋과 변경 파일을 정리
12. Secret, 전화번호 원본, 고객 개인정보, DB 접속정보는 포함하지 말 것
입력:
- 문제 제목:
- 문제 상황:
- 발생 환경:
- 재현 절차:
- 에러 코드:
- 관련 로그:
- 관련 커밋:
- 변경 파일:
- 원인 메모:
- 해결 방법:
- 검증 결과:
원인을 임의로 만들어내지 말 것
실제 검증하지 않은 내용을 검증 완료로 쓰지 말 것
배포 여부를 추측하지 말 것
운영 영향을 과장하지 말 것
Authorization header
Cookie
Set-Cookie
JWT
accessToken
refreshToken
DATABASE_URL
AWS Access Key
API Key
Webhook Secret
전화번호
이메일
고객 이름
주소
requestId=req_123
errorCode=CONSULT_STATUS_CONFLICT
consultId=532
statusCode=409
durationMs=145
phone=01012345678
Authorization=Bearer eyJ...
DATABASE_URL=postgresql://...
customerMemo=...
const REDACT_PATTERNS = [
/Bearer\s+[A-Za-z0-9\-._~+/]+=*/gi,
/postgres(?:ql)?:\/\/[^\s]+/gi,
/\b01[016789]-?\d{3,4}-?\d{4}\b/g,
];
export function sanitizeTroubleshootingInput(input: string) {
let result = input;
for (const pattern of REDACT_PATTERNS) {
result = result.replace(pattern, '[REDACTED]');
}
return result;
}
.env 파일 자체 제외
로그 파일 전체 전달 지양
필요한 줄만 추출
secret key 이름 감지
response body 전체 전달 지양
Troubleshooting: 상담 상태 변경 후 목록 캐시 미갱신
Troubleshooting: Prisma migration 이후 상담 신청 500 오류
Troubleshooting: 알림톡 Worker 중복 발송
domain:
consult
product
export
notification
webhook
database
auth
cause:
transaction
cache
migration
permission
timeout
duplicate
race-condition
CONSULT_STATUS_CONFLICT
P2002
NOTIFICATION_PROVIDER_TIMEOUT
WEBHOOK_SIGNATURE_INVALID
기존 llm-report CLI에 트러블슈팅 문서 자동 생성 기능을 추가해줘.
조건:
1. llm-report troubleshoot 명령어를 추가해줘
2. --project, --commit, --since, --upload-notion 옵션을 지원해줘
3. 사용자에게 문제 제목, 문제 상황, 영향 범위, 재현 절차, 원인, 해결 방법, 검증 결과, 재발 방지를 입력받게 해줘
4. Git에서 관련 commit과 변경 파일을 자동 수집해줘
5. 문서는 문제 상황, 발생 조건, 영향 범위, 원인, 해결 방법, 검증, 재발 방지, 관련 파일/커밋, 배운 점 구조로 생성해줘
6. severity는 P0/P1/P2/P3 중 선택할 수 있게 해줘
7. status는 INVESTIGATING, FIXED, TESTED, DEPLOYED, RESOLVED 중 선택할 수 있게 해줘
8. verification 상태를 별도로 저장해줘
9. 결과는 ~/shn/daily-report/<project>/troubleshooting/<YYYY-MM>/에 Markdown으로 저장해줘
10. Secret, DATABASE_URL, Authorization header, JWT, 전화번호, 고객 개인정보는 생성 전에 sanitize 해줘
11. AI가 원인을 확정할 근거가 없으면 추정 원인으로 표시하게 해줘
12. LLM 또는 Notion 업로드 실패 시에도 로컬 Markdown은 남게 해줘
13. 같은 문서를 주간/월간 리포트에서 참조할 수 있도록 frontmatter를 구조화해줘
14. 테스트 방법과 QA 체크리스트를 문서화해줘
문제와 원인을 분리하는가?
원인을 AI가 임의로 확정하지 않는가?
영향 범위/severity가 있는가?
검증 상태를 구분하는가?
관련 commit/file을 자동 수집하는가?
민감정보 sanitize가 먼저 실행되는가?
Notion 실패 시 로컬 파일이 남는가?
주간/월간 리포트와 연결 가능한가?
local-llm-work-report를 한 단계 더 실무적인 도구로 만드는 확장입니다.Node.js CLI와 로컬 LLM을 활용해서 개발/운영 중 발생한 문제를 트러블슈팅 문서와 Incident Postmortem으로 자동 정리하는 시스템을 만들려고 해.
상황:
1. 온라인 휴대폰 판매몰을 1인 개발자로 운영하고 있음
2. NestJS/React/Prisma/PostgreSQL/AWS 기반이며 상담, 관리자, 상품, Export, 알림톡, Webhook 기능이 있음
3. 이미 일일/주간/월간 작업 보고서를 Markdown과 Notion에 정리하는 구조가 있음
4. 운영 장애나 해결이 오래 걸린 버그는 별도 Troubleshooting Markdown으로 남기고 싶음
5. 문제 상황, 발생 조건, 영향 범위, 원인, 해결 방법, 검증, 재발 방지 구조로 작성하고 싶음
6. 실제 운영에 영향을 준 장애는 Incident로 분리해 타임라인과 Postmortem까지 기록하고 싶음
7. Git commit, 변경 파일, 에러 코드, requestId는 자동 수집하고 싶음
8. 원인은 사람이 입력한 내용과 로그를 기반으로 하고, AI가 근거 없이 원인을 확정하면 안 됨
9. Secret, Authorization header, DATABASE_URL, JWT, 전화번호, 고객 개인정보는 AI/Notion에 전달되면 안 됨
10. 트러블슈팅 문서는 주간/월간 리포트와 포트폴리오 성과 후보에도 연결하고 싶음
요청:
- Troubleshooting 문서 템플릿
- Incident/Postmortem 템플릿
- severity/status/verification 상태값
- Git/로그 자동 수집 구조
- Root Cause와 Trigger 구분 기준
- 5 Whys 적용 기준
- 재발 방지 TODO 구조
- sanitize 기준
- CLI 명령어 설계
- Notion 필드 구조
- 주간/월간 리포트 연결 방식
- AI 프롬프트 예시
- 테스트/QA 체크리스트
를 실무 기준으로 정리해줘.
문제 상황과 원인을 구분하는가?
AI가 원인을 근거 없이 만들어내지 않게 하는가?
severity와 영향 범위를 다루는가?
Incident와 일반 Troubleshooting을 구분하는가?
재발 방지를 “다음엔 조심” 수준으로 끝내지 않는가?
테스트/모니터링/체크리스트 개선으로 연결하는가?
민감정보 sanitize를 강하게 다루는가?
기존 일일/주간/월간 자동화와 연결하는가?