# ERROR Manager Data
# Error Manager

ERROR_DATA = {'emoji': '🔥', 'title': 'Error Manager', 'focus': ['에러 패턴', '5 Whys', 'NEVER/ALWAYS 규칙', '예방', '재발 방지'], 'keywords': ['error', '에러', 'exception', '예외', 'bug', '버그', 'crash', 'fail', '실패', 'catch', 'try', 'throw', 'debug', '디버그', 'log', '로그', 'trace', 'fix', '수정'], 'questions': ['이전에 비슷한 에러가 발생한 적이 있나요?', '에러의 근본 원인(Root Cause)은 무엇인가요?', '재발 방지를 위한 규칙이 필요한가요?', '에러 로깅이 적절히 되어 있나요?', '복구 전략은 무엇인가요?'], 'opinions': {'error': '@QA 버그 수정은 5 Whys로 근본 원인부터 찾으세요:\n• **5 Whys 분석**:\n  1. 왜 에러 발생? → 직접적 원인\n  2. 왜 그 원인? → 한 단계 깊이\n  3. 왜? → ...\n  4. 왜? → ...\n  5. 왜? → Root Cause (진짜 원인)\n• **수정 후 필수**:\n  - 회귀 테스트 케이스 추가\n  - NEVER/ALWAYS 규칙 문서화\n  - 비슷한 코드 전체 검색해서 같은 패턴 수정\n• 파일: docs/ERRORS.md에 에러 히스토리 기록', 'auth': '인증 에러 처리 가이드:\n• **명확한 메시지**: "서버 오류" ❌ → "이메일 또는 비밀번호가 일치하지 않습니다" ✅\n• **보안 주의**: 존재하지 않는 계정도 "일치하지 않습니다"로 (계정 존재 유추 방지)\n• **에러 코드 체계**:\n  - AUTH_001: 잘못된 자격 증명\n  - AUTH_002: 토큰 만료\n  - AUTH_003: 권한 없음\n  - AUTH_004: 계정 잠금\n• **복구 전략**: 토큰 만료 시 자동 refresh, 실패 시 로그인 페이지 리다이렉트\n• 파일: src/lib/errors/auth.ts, src/constants/errorCodes.ts', 'api': 'API 에러 응답 표준화:\n• **응답 형식 통일**:\n```json\n{\n  "error": {\n    "code": "VALIDATION_001",\n    "message": "이메일 형식이 올바르지 않습니다",\n    "field": "email",\n    "hint": "example@domain.com 형식으로 입력해주세요"\n  }\n}\n```\n• **HTTP 상태 코드**:\n  - 400: 클라이언트 요청 오류 (검증 실패)\n  - 401: 인증 필요\n  - 403: 권한 없음\n  - 404: 리소스 없음\n  - 500: 서버 오류 (로깅 필수, 상세 정보 숨김)\n• **로깅**: 500 에러는 Sentry/LogRocket으로 자동 수집\n• 파일: src/lib/errors/api.ts, src/lib/errorHandler.ts', 'payment': '@CFO 결제 에러는 돈과 직결됩니다:\n• **재시도 전략**:\n  - 네트워크 에러: 최대 3회 자동 재시도 (exponential backoff)\n  - 카드 거절: 재시도 안 함, 다른 결제 수단 안내\n  - 잔액 부족: 재시도 안 함, 금액 확인 안내\n• **실패 알림**:\n  - 사용자: 즉시 화면에 표시 + 이메일 발송\n  - 운영팀: Slack 알림 (결제 금액 큰 경우)\n• **수동 처리 프로세스**:\n  - 결제 실패 로그 저장\n  - 관리자 대시보드에서 재시도/환불 가능하게\n• **멱등성**: 같은 결제 2번 처리 방지\n• 파일: src/lib/payment/errorHandler.ts, src/app/admin/payments/', 'feature': '새 기능 에러 핸들링 필수 사항:\n• **try-catch 감싸기**: 외부 API 호출, DB 쿼리, 파일 처리\n• **fallback 정의**:\n  - 데이터 로딩 실패 → 캐시 데이터 표시 또는 빈 상태 UI\n  - 외부 서비스 장애 → graceful degradation\n• **사용자 피드백**:\n  - 로딩 중: 스켈레톤 UI\n  - 에러 발생: "다시 시도" 버튼 + 구체적 메시지\n  - 복구됨: 자동 재시도 후 성공 시 토스트\n• **로깅**: 에러 발생 시 컨텍스트 정보 포함 (userId, action, params)\n```typescript\ntry {\n  await doSomething();\n} catch (error) {\n  logger.error(\'doSomething failed\', { userId, action, error });\n  throw new AppError(\'FEATURE_001\', \'작업 실패\');\n}\n```\n• 파일: src/lib/errors/index.ts', 'ui': '@CDO UI 에러 상태 처리:\n• **에러 바운더리**: React Error Boundary로 크래시 방지\n```tsx\n<ErrorBoundary fallback={<ErrorFallback />}>\n  <MyComponent />\n</ErrorBoundary>\n```\n• **상태별 UI**:\n  - 로딩: 스켈레톤 또는 스피너\n  - 빈 상태: 안내 메시지 + CTA\n  - 에러: 에러 메시지 + 재시도 버튼\n  - 부분 에러: 가능한 데이터는 표시, 실패 부분만 에러\n• **폼 에러**: 인라인 표시 (필드 아래), 제출 후 요약 (상단)\n• **토스트**: 성공/실패 알림, 3초 후 자동 사라짐\n• 파일: src/components/ErrorBoundary.tsx, src/hooks/useAsyncData.ts', 'database': 'DB 에러 처리 및 복구:\n• **트랜잭션**: 여러 작업은 트랜잭션으로 묶어서 원자성 보장\n```typescript\nawait prisma.$transaction(async (tx) => {\n  await tx.order.create(data);\n  await tx.inventory.decrement(itemId);\n});\n```\n• **재시도**: 일시적 DB 연결 오류 시 3회 재시도\n• **Deadlock**: 트랜잭션 순서 일관되게, 재시도 로직 구현\n• **마이그레이션 롤백**: 실패 시 down migration 자동 실행\n• **로깅**: 느린 쿼리(>1초) 로깅, 에러 쿼리 저장\n• 파일: src/lib/db/transaction.ts, prisma/migrations/', 'performance': '성능 관련 에러 처리:\n• **Timeout**: API 30초, DB 쿼리 10초 제한\n```typescript\nconst controller = new AbortController();\nsetTimeout(() => controller.abort(), 30000);\n```\n• **Rate Limit 초과**: 429 응답 + Retry-After 헤더\n• **메모리 부족**: 대용량 데이터는 스트리밍/페이지네이션\n• **Circuit Breaker**: 외부 서비스 반복 실패 시 일시 차단\n• 모니터링: 에러율 5% 넘으면 알림 (Datadog, Sentry)', 'launch': '런칭 전 에러 처리 체크:\n• [ ] 모든 API에 try-catch 적용\n• [ ] 에러 바운더리 설정\n• [ ] Sentry/LogRocket 연동\n• [ ] 에러 알림 채널 설정 (Slack/이메일)\n• [ ] 에러 대응 SOP 문서화\n• [ ] 롤백 스크립트 준비\n• [ ] 에러 발생 시 연락처 문서화\n• 파일: docs/INCIDENT_RESPONSE.md, scripts/rollback.sh', 'default': '에러 처리 기본 원칙:\n• **로깅**: 모든 에러 로깅 (severity, timestamp, context)\n• **복구 전략**: 각 에러 타입별 복구 방법 정의\n• **모니터링**: 에러율 대시보드, 알림 설정\n• **문서화**: 발생한 에러 + 해결 방법 기록\n• **예방**: 같은 에러 반복 안 되도록 테스트/규칙 추가\n• **5 Whys**: 표면적 원인이 아닌 근본 원인 해결'}, 'checklist': ['에러 로깅 구현', '에러 복구 전략', '5 Whys 분석', 'NEVER/ALWAYS 규칙 추가', '모니터링 설정'], 'analysis_template': '\n### 🔥 에러 분석 (5 Whys)\n\n**문제**: {problem}\n\n1. Why? →\n2. Why? →\n3. Why? →\n4. Why? →\n5. Why? → (Root Cause)\n\n**예방 규칙**:\n- NEVER:\n- ALWAYS:\n', 'action_templates': [{'trigger': '에러|error|버그|bug|예외|exception', 'actions': [{'id': 'err-1', 'action': '에러 재현 및 로그 수집', 'depends': [], 'verify': '에러 재현 가능', 'phase': '준비'}, {'id': 'err-2', 'action': '5 Whys 분석 수행', 'depends': ['err-1'], 'verify': 'Root Cause 식별됨', 'phase': '설계'}, {'id': 'err-3', 'action': 'NEVER/ALWAYS 규칙 정의', 'depends': ['err-2'], 'verify': '예방 규칙 문서화됨', 'phase': '설계'}, {'id': 'err-4', 'action': '에러 복구 전략 구현', 'depends': ['err-2'], 'verify': '복구 전략 구현됨', 'phase': '구현'}, {'id': 'err-5', 'action': '에러 로깅 및 모니터링 설정', 'depends': [], 'verify': '모니터링 설정됨', 'phase': '검증'}]}]}
