Files
ExperionCrawler/dxf-graph/dxf-graph-code-update-r2.md
windpacer 7330711499 chore: 프로젝트 파일 구조 정리 - 루트 파일 폴더별 이동, 테스트/구버전 삭제
루트 파일 정리:
- DXF/P&ID 관련 → dxf-graph/
- fastTable 관련 → fastTable/
- plan/ → plans/ 통합 (최신 버전 유지)
- 테스트 출력 파일, 구버전 프로젝트 삭제
- 불필요한 루트 문서 삭제
2026-05-10 17:39:58 +09:00

4.5 KiB

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

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

🎯 목표

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

🛠 작업 상세 내역 (Todo List)

Step 1. 상태 저장소 구현 (Persistence)

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

Step 2. 워커 종료 메커니즘 개선 (Graceful Shutdown)

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

Step 3. 도면별 병렬 처리 구현 (Granular Locking)

  • 3.1 server.py_pid_sem 사용 지점 전수 조사
    • mcp-server/server.py 내 모든 P&ID 관련 도구(parse_pid_dxf, build_pid_graph_parallel 등)가 전역 세마포어 _pid_sem을 사용하고 있음을 확인.
  • 3.2 파일/ID 기반 LockManager 구현
    • ProcessManager 내에 _pid_locks: Dict[str, asyncio.Lock] 추가.
  • 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. 프론트엔드 상태 관리 개선

  • 5.1 pid-viewer.js 상태 관리 변수 추가
    • currentGraphId 변수 추가하여 현재 로드된 도면 식별자 관리.
  • 5.2 도면 로드 시 graphId 저장 로직 추가
    • pidLoadDrawing 함수에서 topoData 로드 시 currentGraphId에 저장하도록 수정.
  • 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 일관된 에러 표시 검증