# P&ID 그래프 파이프라인 고도화 작업 내역 (r2)

이 문서는 `dxf-graph-checkby-gemma4.md`의 [추가 진단] 항목에 따른 수정 사항을 추적하고 기록합니다.

## 🎯 목표
- 서버 재시작 시에도 작업 상태 유지 (Persistence)
- 워커 프로세스 종료 시 응답 유실 방지 (Graceful Shutdown)
- 도면별 병렬 처리 허용 (Granular Locking)
- 실시간 상태 업데이트 최적화 (SSE)
- 프론트엔드 상태 관리 및 응답 형식 통일

---

## 🛠 작업 상세 내역 (Todo List)

### Step 1. 상태 저장소 구현 (Persistence)
- [x] **1.1 상태 저장 인터페이스 정의 (`IStatusStore`)**
    - `src/Core/Application/Interfaces/IStatusStore.cs` 생성.
    - `GetStatusAsync`, `UpdateStatusAsync` 메서드 정의.
- [x] **1.2 DB 기반 상태 저장소 구현 (`PidGraphStatus` 테이블 및 `DbStatusStore`)**
    - `ExperionDbContext`에 `PidGraphStatus` 엔티티 및 DbSet 추가.
    - `src/Infrastructure/Database/DbStatusStore.cs` 구현.
- [x] **1.3 `PidGraphController`에 `IStatusStore` 적용**
    - `Program.cs`에 `IStatusStore` 서비스 등록.
    - `PidGraphController`에서 인메모리 `ConcurrentDictionary`를 제거하고 `IStatusStore`를 통해 상태를 읽고 쓰도록 수정.
- [ ] **1.4 서버 재시작 후 상태 복구 검증**
    - 작업: 서버 재시작 후 `GET /api/pidgraph/status/{taskId}` 호출 시 DB에서 상태가 정상적으로 복구되는지 확인.

### Step 2. 워커 종료 메커니즘 개선 (Graceful Shutdown)
- [x] **2.1 `pid_worker.py` 종료 메커니즘 분석**
    - `_schedule_shutdown` 함수가 `os.kill`을 사용하여 즉시 종료하는 구조임을 확인.
- [x] **2.2 종료 지연 로직 수정 (`BackgroundTasks` 적용)**
    - `mcp-server/worker/pid_worker.py` 수정.
    - `FastAPI`의 `BackgroundTasks`를 사용하여 응답 전송이 완전히 완료된 후 `_schedule_shutdown`이 실행되도록 변경.
    - 종료 전 대기 시간을 0.5초 $\rightarrow$ 1.0초로 늘려 네트워크 버퍼 전송 시간 확보.
- [ ] **2.3 대용량 응답 시 Connection Reset 검증**
    - 작업: 대용량 그래프 결과 반환 시 클라이언트가 `Connection Reset` 없이 데이터를 모두 수신하는지 확인.

### Step 3. 도면별 병렬 처리 구현 (Granular Locking)
- [x] **3.1 `server.py` 내 `_pid_sem` 사용 지점 전수 조사**
    - `mcp-server/server.py` 내 모든 P&ID 관련 도구(`parse_pid_dxf`, `build_pid_graph_parallel` 등)가 전역 세마포어 `_pid_sem`을 사용하고 있음을 확인.
- [x] **3.2 파일/ID 기반 `LockManager` 구현**
    - `ProcessManager` 내에 `_pid_locks: Dict[str, asyncio.Lock]` 추가.
- [x] **3.3 전역 세마포어를 `LockManager`로 교체**
    - `mcp-server/server.py` 수정.
    - `_pid_sem` (전역 1개) $\rightarrow$ `_pid_locks[lock_key]` (파일/ID별 개별 Lock)로 교체.
    - 동일 파일에 대한 중복 요청은 막되, 서로 다른 파일은 병렬로 워커를 띄워 처리 가능하게 변경.
- [ ] **3.4 도면별 병렬 처리 검증**
    - 작업: 서로 다른 두 개의 DXF 파일을 동시에 빌드 요청했을 때, 두 개의 워커 프로세스가 각각 생성되어 병렬로 동작하는지 확인.

### Step 4. 실시간 상태 업데이트 최적화 (SSE)
- [ ] **4.1 SSE 구현 설계 (`PidGraphController`)**
- [ ] **4.2 서버측 이벤트 브로드캐스터 구현**
- [ ] **4.3 `pid-viewer.js` 폴링 $\rightarrow$ SSE 교체**
- [ ] **4.4 SSE 상태 업데이트 검증**

### Step 5. 프론트엔드 상태 관리 개선
- [x] **5.1 `pid-viewer.js` 상태 관리 변수 추가**
    - `currentGraphId` 변수 추가하여 현재 로드된 도면 식별자 관리.
- [x] **5.2 도면 로드 시 `graphId` 저장 로직 추가**
    - `pidLoadDrawing` 함수에서 `topoData` 로드 시 `currentGraphId`에 저장하도록 수정.
- [x] **5.3 영향도 분석 요청 시 저장된 `graphId` 사용**
    - `pidRequestImpactAnalysis` 함수에서 하드코딩된 ID 대신 `currentGraphId`를 사용하도록 수정.
- [ ] **5.4 도면별 영향도 분석 결과 검증**
    - 작업: 여러 도면을 번갈아 로드하며 각 도면에 맞는 영향도 분석 결과가 나오는지 확인.

### Step 6. 응답 형식 통일 및 에러 처리
- [ ] **6.1 공통 응답 DTO 정의 (C# `PidResponse`, Python `StandardResponse`)**
- [ ] **6.2 `PidGraphController` 응답 형식 통일**
- [ ] **6.3 MCP 서버/워커 응답 형식 검토 및 수정**
- [ ] **6.4 `pid-viewer.js` 에러 처리 로직 단일화**
- [ ] **6.5 일관된 에러 표시 검증**
