# 카테고리삽입코딩.md

## 1. 개요 (Context)
현재 P&ID 엑셀 내보내기 로직에서 카테고리 분류가 부족하며, 시트 순서가 고정되어 있습니다. 사용자가 검토하기 용이하도록 `Pipings` 카테고리를 추가하고, 분류되지 않은 항목(`Unmatched`)을 항상 시트의 마지막에 배치하여 데이터의 가독성과 정렬 규칙을 확립합니다.

## 2. 변경 목표 (Objectives)
- `PidEquipment` 도메인 모델에 `Pipings` 카테고리 상수 추가.
- `PidExtractorService`의 엑셀 생성 로직에서 시트 생성 순서 및 명칭 조정.
- `Unmatched` 항목이 항상 엑셀의 가장 마지막 시트로 출력되도록 보장.

## 3. 상세 구현 계획 (Implementation Plan)

### 🛠 STEP 1: 도메인 모델 수정
**대상 파일**: `src/Core/Domain/Entities/PidEquipment.cs`
- `CategoryPipings` 상수 추가: `public const string CategoryPipings = "pipings";`
- `AllCategories` 배열에 신규 상수 포함.

### 🛠 STEP 2: 서비스 로직 수정
**대상 파일**: `src/Core/Application/Services/PidExtractorService.cs`
- `sheetOrder` 배열 수정:
  - 기존: `[Instrument, Power, Storage, Process, Utility, "__unmatched__"]`
  - 변경: `[Instrument, Power, Storage, Process, Utility, "pipings", "__unmatched__"]`
- `sheetNames` 딕셔너리 수정:
  - `[PidEquipment.CategoryPipings] = "Pipings"` 추가.

### 🛠 STEP 3: 검증 (Verification)
- `dotnet test`를 실행하여 엑셀 생성 관련 유닛 테스트가 통과하는지 확인.
- (필요 시) 엑셀 파일 생성 테스트 코드를 추가하여 시트 순서(Sheet Index)를 검증.

## 4. `diagnosis-checklist.md` 준수 사항 (Quality Assurance)

| 체크 항목 | 준수 계획 |
| :--- | :--- |
| **동시성 / 비동기** | `ExportToExcelAsync`가 이미 `Task.Run`으로 오프로드되어 있으므로, 기존의 비동기 흐름을 깨뜨리지 않고 상수 추가만 수행하여 이벤트 루프 블로킹 방지. |
| **에러 처리** | 새로운 카테고리 추가 시 `null` 또는 `empty` 카테고리에 대한 예외 처리가 기존 `__unmatched__` 로직을 통해 안전하게 처리됨을 확인. |
| **리소스 관리** | `using var package` 블록 내에서 모든 시트 생성이 완료되므로 메모리 누수 없음. |
| **코드 구조** | 하드코딩된 문자열 대신 `PidEquipment`에 정의된 `const`를 사용하여 유지보수성 확보. |

## 5. 영향도 분석 (Impact Analysis)
- **DB**: `category` 컬럼은 `string` 타입이므로 새로운 값(`pipings`) 저장에 영향 없음.
- **UI**: 기존 UI는 카테고리 값에 의존하지 않고 엑셀을 다운로드하므로 하위 호환성 유지됨.

## 6. 진단 결과 (Diagnosis) — diagnosis-checklist.md 기준

### [1]. `PidEquipment.CategoryPipings` 상수 누락 (HIGH)

**문제**: `CategoryPipings` 상수가 정의되지 않아 Prefix Rule 생성 시 `pipings` 카테고리를 선택하면 Controller에서 validation 실패 (`AllCategories`에 없음).
**근거**: `src/Core/Domain/Entities/PidEquipment.cs:54-62` — 상수 및 `AllCategories` 배열에 `pipings` 없음
**영향**: 운전원이 `pipings` 카테고리를 가진 Prefix Rule을 생성하면 HTTP 400 BadRequest 반환
**수정**: 상수 추가 + `AllCategories` 배열에 포함

### [2]. Excel Export 시트 누락 (MED)

**문제**: `sheetOrder`와 `sheetNames`에 `pipings`가 없어 Excel 내보내기 시 piping 항목이 `Unmatched` 시트로 섞임.
**근거**: `src/Core/Application/Services/PidExtractorService.cs:345-363` — `sheetOrder` 배열과 `sheetNames` 딕셔너리에 `pipings` 누락
**영향**: Excel에서 `pipings` 항목이 별도의 시트로 분리되지 않고 `Unmatched`에 포함됨
**수정**: `sheetOrder`에 `PidEquipment.CategoryPipings` 추가, `sheetNames`에 `[PidEquipment.CategoryPipings] = "Pipings"` 추가

### [3]. Frontend `CATEGORY_META` / `CATEGORY_ORDER` 누락 (MED)

**문제**: JS 측 `CATEGORY_META`와 `CATEGORY_ORDER`에 `pipings`가 없어 UI에서 필터링·정렬·badge 표시가 깨짐.
**근거**: `src/Web/wwwroot/js/app.js:3268-3275` — `CATEGORY_META`와 `CATEGORY_ORDER`에 `pipings` 누락
**영향**: `pipings` 카테고리 항목의 badge가 빈 문자열로 렌더링, 카테고리 순서가 무작위
**수정**: `CATEGORY_META`에 `pipings` 항목 추가, `CATEGORY_ORDER` 배열에 포함

### [4]. `PidController` validation — 교차 검증 결과 (Q2 통과)

**문제**: `PidController.cs:266-279`에서 `AllCategories`로 category 유효성 검증
**교차 검증 Q2**: 다른 레이어에서 처리되는가? → `AllCategories` 배열에 `CategoryPipings` 포함 시 Controller 검증도 자동으로 통과하므로 별도 수정 불필요
**결론**: [1]에서 `AllCategories` 수정 시 함께 해결됨
