# InsuRo 소식지 멀티 업로드 에러 수정

## 작업 레벨: Lv.1

## 프로젝트
- InsuRo: `/home/jay/projects/InsuRo`

## 버그 설명
소식지 관리에서 여러 파일을 한번에 업로드하면 첫 번째만 처리되고 나머지는 에러.

## 원인 분석 (아누 확인 완료)
`src/pages/AdminNewsletters.tsx` 라인 104~134의 `handleUpload` 함수:

```tsx
for (const file of files) {
  // ...
  if (!resp.ok) {
    throw new Error(data.detail || "업로드 실패");  // ← 1개 실패 시 전체 중단
  }
}
```

1개 파일이라도 실패하면 throw → catch로 빠져서 나머지 파일 처리가 중단됨.
또한 Vision AI 파싱이 오래 걸리면 (sonnet/opus) 순차 처리 시 후속 파일 타임아웃 가능.

## 수정 방법

### handleUpload 함수 수정
개별 파일 실패를 try-catch로 감싸서 나머지 파일은 계속 처리:

```tsx
for (const file of files) {
  try {
    const formData = new FormData();
    // ... formData 구성
    
    const resp = await fetch(...);
    const data = await resp.json();
    
    if (!resp.ok) {
      failedFiles.push({ name: file.name, error: data.detail || "업로드 실패" });
      continue;  // 실패해도 다음 파일 계속
    }
    
    successCount++;
    // toast 표시
  } catch (err) {
    failedFiles.push({ name: file.name, error: err instanceof Error ? err.message : "알 수 없는 오류" });
  }
}

// 최종 결과 표시
if (failedFiles.length > 0) {
  toast({ 
    title: `${successCount}개 성공, ${failedFiles.length}개 실패`,
    description: failedFiles.map(f => f.name).join(", "),
    variant: failedFiles.length === files.length ? "destructive" : "default"
  });
} else {
  toast({ title: "업로드 완료", description: `${successCount}개 소식지 등록 완료` });
}
```

### 추가: 업로드 진행 상태 표시
- 현재 몇 번째 파일을 처리 중인지 표시 (예: "2/5 업로드 중...")
- 개별 파일별 성공/실패 상태 표시

## affected_files
- `src/pages/AdminNewsletters.tsx` (수정 — handleUpload 개별 에러 핸들링 + 진행 표시)

## 검증 시나리오
1. 파일 3개 업로드 → 전부 성공 → "3개 소식지 등록 완료" 표시
2. 파일 3개 중 1개 실패 → 나머지 2개는 정상 처리 → "2개 성공, 1개 실패" 표시
3. 업로드 중 진행 상태 표시 (N/M 업로드 중...)
4. npm run build 성공
