루트 파일 정리: - DXF/P&ID 관련 → dxf-graph/ - fastTable 관련 → fastTable/ - plan/ → plans/ 통합 (최신 버전 유지) - 테스트 출력 파일, 구버전 프로젝트 삭제 - 불필요한 루트 문서 삭제
4.5 KiB
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)ExperionDbContext에PidGraphStatus엔티티 및 DbSet 추가.src/Infrastructure/Database/DbStatusStore.cs구현.
- 1.3
PidGraphController에IStatusStore적용Program.cs에IStatusStore서비스 등록.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수정.FastAPI의BackgroundTasks를 사용하여 응답 전송이 완전히 완료된 후_schedule_shutdown이 실행되도록 변경.- 종료 전 대기 시간을 0.5초
\rightarrow1.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폴링\rightarrowSSE 교체 - 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, PythonStandardResponse) - 6.2
PidGraphController응답 형식 통일 - 6.3 MCP 서버/워커 응답 형식 검토 및 수정
- 6.4
pid-viewer.js에러 처리 로직 단일화 - 6.5 일관된 에러 표시 검증