Files
ExperionCrawler/plans/glm-code-review-task.md

4.9 KiB

ExperionCrawler 코드 분석 및 수정 태스크

Roo Code(GLM-4.7-Flash 모드)에 이 파일 내용을 그대로 붙여넣어 실행


지시사항

당신은 ExperionCrawler (.NET 8 C#, PostgreSQL/TimescaleDB, OPC UA) 프로젝트의 코드 품질 담당 엔지니어입니다. 아래 Phase 순서대로 작업하고, 각 단계 완료 시 task_state.md에 기록하세요.


Phase 1 — 분석: issues.md 생성

1-1. 분석 대상 파일 (우선순위 순)

[HIGH 우선순위]

  • src/Infrastructure/Database/ExperionDbContext.cs
  • src/Infrastructure/OpcUa/ExperionRealtimeService.cs
  • src/Core/Application/Services/TextToSqlService.cs
  • src/Infrastructure/OpcUa/ExperionOpcServerService.cs
  • src/Infrastructure/OpcUa/ExperionOpcServerNodeManager.cs

[MED 우선순위]

  • src/Web/Controllers/ExperionControllers.cs
  • src/Web/Controllers/TextToSqlController.cs
  • src/Core/Application/Services/SqlValidator.cs
  • src/Core/Application/Services/KoreanTimeRangeExtractor.cs
  • src/Infrastructure/OpcUa/ExperionOpcClient.cs

[LOW 우선순위]

  • src/Core/Application/Interfaces/IExperionServices.cs
  • src/Core/Application/DTOs/ExperionDtos.cs
  • src/Core/Application/DTOs/TextToSqlDtos.cs
  • src/Web/Program.cs
  • src/Infrastructure/OpcUa/ExperionHistoryService.cs

1-2. 각 파일에서 확인할 항목

□ null 참조 예외 가능성 (NullReferenceException)
□ async/await 오용 (deadlock, fire-and-forget 미처리)
□ IDisposable 미해제 (DbContext, HttpClient, Connection 등)
□ 예외 삼킴 (catch(Exception){} 빈 블록)
□ CancellationToken 미전파
□ SQL Injection 가능성 (raw string interpolation)
□ 경쟁 조건 (Race condition) — 특히 ConcurrentDictionary, lock 누락
□ 불필요한 await (Task.Result, .Wait() 블로킹)
□ 메모리 누수 (이벤트 핸들러 미구독 해제)
□ 하드코딩된 값 (IP, 포트, 문자열 상수)
□ 도메인 로직 오류 (KST/UTC 변환, OPC UA 상태 코드 처리)

1-3. MCP 도구 활용

각 파일 분석 시 다음을 활용하세요:

search_codebase("파일명 또는 핵심 패턴")  → 관련 구현 컨텍스트 확인
ask_iiot_llm("OPC UA 관련 판단이 필요한 경우")  → 도메인 전문 판단

1-4. 결과물

issues.md 파일을 프로젝트 루트에 생성하세요:

# ExperionCrawler 코드 이슈 목록
> 생성일: YYYY-MM-DD | 분석 모델: GLM-4.7-Flash

## 요약
- HIGH: N건 / MED: N건 / LOW: N건

## 이슈 목록

| # | 파일 | 라인 | 심각도 | 분류 | 문제 설명 | 수정 방향 | 상태 |
|---|------|------|--------|------|-----------|-----------|------|
| 1 | src/.../파일.cs | 42 | HIGH | bug | 설명 | 수정 방향 | pending |
...

Phase 2 — 수정: HIGH → MED → LOW 순서

2-1. 수정 규칙

  1. 한 번에 이슈 1개씩 수정
  2. 수정 전: read_file로 현재 내용 확인
  3. 수정 후: dotnet build src/Web/ExperionCrawler.csproj --no-restore -v q 빌드 확인
  4. 빌드 성공 시: issues.md에서 해당 이슈 상태를 fixed로 변경
  5. 빌드 실패 시: 즉시 원인 분석 후 수정, 다음 이슈로 넘어가지 않음

2-2. 수정 불가 판단 기준

아래 경우 수정하지 말고 issues.mdneeds-review로 표시하세요:

  • 아키텍처 변경이 필요한 경우
  • 비즈니스 로직 판단이 불명확한 경우
  • 테스트 없이 검증 불가한 경우

2-3. 각 이슈 수정 후 커밋

git add [수정된 파일]
git commit -m "fix(#N): [이슈 요약]"

Phase 3 — 검수 요청서 작성

모든 수정 완료 후 REVIEW_REQUEST.md를 생성하세요:

# 클로드 코드 검수 요청

## 작업 요약
- 분석 파일: N개
- 발견 이슈: HIGH N / MED N / LOW N
- 수정 완료: N건
- 검수 필요(needs-review): N건

## 검수 항목

### ✅ 수정 완료 (확인 요청)
| # | 파일:라인 | 수정 내용 | 우려사항 |
|---|-----------|-----------|---------|
...

### ⚠️ 수정 보류 (판단 요청)  
| # | 파일:라인 | 문제 | 보류 이유 |
|---|-----------|------|-----------|
...

## 빌드 상태
- 최종 빌드: ✅ 성공 / ❌ 실패
- 경고: N건

## 검수 방법
\`\`\`bash
git log --oneline  # 수정 커밋 목록
git diff HEAD~N    # 전체 변경사항
\`\`\`

Phase 4 — task_state.md 최신화

작업 중 및 완료 시 task_state.md를 아래 형식으로 유지하세요:

## 작업명: ExperionCrawler 코드 분석 및 수정
## 시작시각: YYYY-MM-DD HH:MM
## 진행 상태: Phase N / 4

### Phase 1 완료 파일
- [x] ExperionDbContext.cs → 이슈 N건 발견
- [x] ExperionRealtimeService.cs → 이슈 N건 발견
- [ ] TextToSqlService.cs

### Phase 2 수정 현황
- [x] #1 (HIGH) ExperionDbContext.cs:42 → fixed
- [ ] #2 (HIGH) ExperionRealtimeService.cs:156 → in-progress

### 발견된 이슈 누적
| # | 파일 | 심각도 | 내용 |
|---|------|--------|------|