con un clic
troubleshooting
Agent 기능 트러블슈팅 스킬. 빌드 에러, 이미지 업로드 실패, SSE 연결 문제 등 실전 문제 해결 가이드.
Instalar con Codex o Claude Copia este prompt, pégalo en Codex, Claude u otro asistente, y deja que revise la página de la skill y la instale por ti.
Menú
Agent 기능 트러블슈팅 스킬. 빌드 에러, 이미지 업로드 실패, SSE 연결 문제 등 실전 문제 해결 가이드.
Instalar con Codex o Claude Copia este prompt, pégalo en Codex, Claude u otro asistente, y deja que revise la página de la skill y la instale por ti.
Basado en la clasificación ocupacional SOC
코드 품질 관리 스킬. Prettier/ESLint/TypeScript 컨벤션, Agent Skills 활용 패턴, 코드 리뷰 체크리스트.
Guide for the Map page feature (Kakao Maps integration, location search, store category filtering). Use when working on map components, search bar, bottom sheet, detail sheet, store/pickup filters, or Kakao Map API integration. Triggers on "map", "kakao map", "location search", "store category", "bottom sheet", "map marker", "nearby", "autocomplete", "suggest".
Agent 채팅 데이터 무결성 관리 스킬. IndexedDB v3 스키마, Optimistic Updates, Eventual Consistency 패턴 구현 시 사용.
Vercel 공식 React 성능 최적화 스킬. AI 에이전트를 위한 40+ 규칙 (waterfalls 제거, 번들 크기 최적화 등).
Agent 페이지 구현 스킬. SSE 토큰 스트리밍, 사이드바, 마크다운 렌더링, 메시지 액션을 포함한 AI 챗봇 인터페이스 구현 시 사용. React 19 + TypeScript + TailwindCSS 기반.
| name | troubleshooting |
| description | Agent 기능 트러블슈팅 스킬. 빌드 에러, 이미지 업로드 실패, SSE 연결 문제 등 실전 문제 해결 가이드. |
Agent 기능 구현 중 발생하는 일반적인 문제와 해결 방법
Agent 기능 개발 중 발생 가능한 문제를 빠르게 진단하고 해결하는 가이드입니다. 각 문제는 증상 → 원인 → 해결 순서로 정리되어 있습니다.
문제 발생
│
├─ 빌드 에러?
│ ├─ TypeScript 타입 에러 → references/build-errors.md §1
│ ├─ ESLint 경고/에러 → references/build-errors.md §2
│ └─ Vercel 배포 실패 → references/build-errors.md §3
│
├─ 이미지 업로드 실패?
│ ├─ 400 Bad Request → references/image-upload-fix.md §1
│ ├─ 403 Forbidden → references/image-upload-fix.md §2
│ └─ CORS 에러 → references/image-upload-fix.md §3
│
├─ SSE 연결 문제?
│ ├─ 타임아웃 발생 → §3.1
│ ├─ 메시지 중복 수신 → §3.2
│ └─ 연결 끊김 → §3.3
│
└─ IndexedDB 문제?
├─ Quota 초과 → §4.1
├─ 마이그레이션 실패 → §4.2
└─ 데이터 유실 → §4.3
증상:
[ERROR] 서버 응답 타임아웃
SSE connection timeout after 60s
원인:
해결:
// useAgentSSE.ts
es.addEventListener('keepalive', () => {
resetEventTimeout(); // ✅ 타임아웃 리셋
});
증상:
원인:
해결:
// Backend: Stream ID 주입
event["stream_id"] = msg_id; // Redis Stream ID
// Frontend: 중복 필터링 (이미 구현됨)
if (last_stream_id >= new_stream_id) return; // Skip
증상:
EventSource connection closed unexpectedly
원인:
해결:
// 자동 재연결 (exponential backoff)
es.addEventListener('error', () => {
if (reconnectAttempt < MAX_RETRIES) {
const delay = 1000 * Math.pow(2, reconnectAttempt);
setTimeout(() => createEventSource(jobId), delay);
}
});
증상:
QuotaExceededError: The quota has been exceeded
원인:
해결:
// 주기적 cleanup (1분마다)
setInterval(() => {
messageDB.cleanup(userId, sessionId, {
committedRetentionMs: 30000, // 30초
ttlMs: 7 * 24 * 60 * 60 * 1000, // 7일
});
}, 60000);
증상:
[MessageDB] Upgrade blocked - close other tabs
원인:
해결:
// DevTools Console
indexedDB.deleteDatabase('agent-chat-db');
증상:
원인:
saveMessages 호출 누락beforeunload 핸들러 미실행해결:
// useMessagePersistence.ts
// 1. Pending 메시지 즉시 저장
useEffect(() => {
const pending = messages.filter(m => m.status === 'pending');
if (pending.length > 0) {
messageDB.saveMessages(userId, sessionId, pending);
}
}, [messages]);
// 2. beforeunload 핸들러
useEffect(() => {
const handler = () => {
messageDB.saveMessages(userId, sessionId, messages);
};
window.addEventListener('beforeunload', handler);
return () => window.removeEventListener('beforeunload', handler);
}, []);
권장 패턴:
try {
await riskyOperation();
} catch (err) {
console.error('[Context] Operation failed:', {
error: err,
context: { userId, sessionId },
timestamp: Date.now(),
});
// User-friendly 에러 메시지
setError(err instanceof Error ? err : new Error('Unknown error'));
}
문제:
// ❌ 중복 전송 가능
const sendMessage = async (msg) => {
await api.post('/messages', msg);
};
해결:
// ✅ Flag로 방지
const isSendingRef = useRef(false);
const sendMessage = async (msg) => {
if (isSendingRef.current) return;
isSendingRef.current = true;
try {
await api.post('/messages', msg);
} finally {
isSendingRef.current = false;
}
};
문제:
// ❌ Cleanup 누락
useEffect(() => {
const es = new EventSource(url);
es.addEventListener('message', handler);
}, []);
해결:
// ✅ Cleanup 함수
useEffect(() => {
const es = new EventSource(url);
es.addEventListener('message', handler);
return () => {
es.close(); // ✅ 명시적 cleanup
};
}, []);
| 파일 | 내용 |
|---|---|
references/image-upload-fix.md | 이미지 업로드 400 에러 진단 및 해결 |
references/build-errors.md | TypeScript/ESLint/Vercel 빌드 에러 |
// 모든 이벤트 로깅
es.onmessage = (e) => {
console.log('[SSE]', e.type, JSON.parse(e.data));
};
// Network 탭에서 확인
// - EventStream 탭에서 실시간 이벤트 보기
// - Headers에서 쿠키 확인
// DevTools > Application > IndexedDB
// - agent-chat-db > messages 테이블 확인
// - user_id, session_id 필터링
// 프로그래밍 방식 조회
const stats = await messageDB.getStats();
console.log(stats);
// { totalMessages: 42, unsyncedMessages: 3, ... }
// useAgentChat 상태 확인
// - messages (pending/committed 구분)
// - isStreaming
// - currentChat
// 컴포넌트 리렌더링 추적
// Profiler > Record > 느린 렌더링 찾기
// DevTools Console
await messageDB.clear();
localStorage.clear();
sessionStorage.clear();
location.reload();
await messageDB.deleteChat(sessionId);
// 로컬 데이터 버리고 서버에서 재로드
await messageDB.clear();
const serverMessages = await getChatDetail(sessionId);
setMessages(serverMessages);
문제 발생 시:
[ ] 1. 에러 메시지 전문 복사
[ ] 2. Console/Network 탭 캡처
[ ] 3. 재현 시나리오 정리
[ ] 4. IndexedDB 상태 확인
[ ] 5. SSE 연결 상태 확인
[ ] 6. 관련 references 문서 참조
[ ] 7. 임시 해결 후 근본 원인 분석
/Users/mango/workspace/SeSACTHON/backend-event-router-improvement/docs/reports/../agent-feature/SKILL.md../data-integrity/SKILL.md