# 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` 파일을 프로젝트 루트에 생성하세요:

```markdown
# 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.md`에 `needs-review`로 표시하세요:
- 아키텍처 변경이 필요한 경우
- 비즈니스 로직 판단이 불명확한 경우
- 테스트 없이 검증 불가한 경우

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

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

---

## Phase 3 — 검수 요청서 작성

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

```markdown
# 클로드 코드 검수 요청

## 작업 요약
- 분석 파일: 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`를 아래 형식으로 유지하세요:

```markdown
## 작업명: 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

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