Files
ExperionCrawler/카테고리삽입코딩.md
windpacer 302183c97e feat: P&ID 연결 분석, LLM 에이전트 모드, KB 확장, MCP 서버 리팩토링
- P&ID: 연결 분석 API, Prefix 규칙 관리, 카테고리 분류, DXF 그래프 빌드
- LLM: 대화 요약, tool card 영구 보존, 시계열 차트(uPlot), 에이전트 모드
- KB: 청크 미리보기, Field Instrument Inference, 인증/Qdrant 클라이언트
- MCP: 서버 기능 확장, 파이프라인 수정, timeout 개선
- Frontend: P&ID UI, LLM UI, KB UI, OPC UA Write 탭 추가
- 설정: AGENTS.md, plant_context, README, opencode.json 업데이트
- 정리: 진단 체크리스트 문서 삭제
2026-05-21 23:36:57 +09:00

4.7 KiB

카테고리삽입코딩.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)

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

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

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

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

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