# fastSession 오류 수정 문서

## 개요
프론트엔드 fastSession 모달에서 시작 버튼을 누르면 `localhost:5000`에서 오류가 발생했습니다.

**오류 메시지:**
```
An error occured while saving the entity changes. See the inner exception for details
```

## 문제 분석

### 1. 오류 발생 경로
1. 프론트엔드 (`app.js:2102`) - `fastStart()` 함수 호출
2. API 요청: `POST /api/fast/start`
3. 컨트롤러 (`ExperionControllers.cs:672`) - `ExperionFastController.Start()`
4. 서비스 (`ExperionFastService.cs:68`) - `StartSessionAsync()`
5. DB 서비스 (`ExperionDbContext.cs:732`) - `CreateFastSessionAsync()`
6. DB 업데이트 (`ExperionDbContext.cs:751`) - `UpdateFastSessionStatusAsync()`

### 2. 근본 원인

`CreateFastSessionAsync` 메서드에서 `Status`를 `"Pending"`으로 설정하고, 이후 `UpdateFastSessionStatusAsync`를 호출하여 `"Running"`으로 변경하면서 EF Core의 변경 감지가 충돌을 일으켰습니다.

**기존 코드 흐름:**
```csharp
// CreateFastSessionAsync - Status: "Pending"
var session = new FastSession
{
    Status = "Pending",  // ← Pending으로 설정
    // ...
};
_ctx.FastSessions.Add(session);
await _ctx.SaveChangesAsync();  // ← 첫 번째 SaveChanges

// 이후 StartSessionAsync에서
await db.UpdateFastSessionStatusAsync(session.Id, "Running");  // ← 두 번째 SaveChanges
```

이 과정에서 EF Core가 동일한 엔티티에 대해 두 번의 `SaveChangesAsync`를 호출하면서 엔티티 상태 관리에 문제가 발생했습니다.

## 수정 내용

### 1. ExperionDbContext.cs (`src/Infrastructure/Database/ExperionDbContext.cs:741`)

**변경 전:**
```csharp
public async Task<FastSession> CreateFastSessionAsync(FastSessionCreateRequest request)
{
    var session = new FastSession
    {
        Name          = request.Name,
        SamplingMs    = request.SamplingMs,
        DurationSec   = request.DurationSec,
        TagList       = JsonSerializer.Serialize(request.TagList),
        StartedAt     = DateTime.UtcNow,
        Status        = "Pending",  // ❌ Pending으로 설정
        RowCount      = 0,
        RetentionDays = request.RetentionDays,
        Pinned        = false
    };
    _ctx.FastSessions.Add(session);
    await _ctx.SaveChangesAsync();
    return session;
}
```

**변경 후:**
```csharp
public async Task<FastSession> CreateFastSessionAsync(FastSessionCreateRequest request)
{
    var session = new FastSession
    {
        Name          = request.Name,
        SamplingMs    = request.SamplingMs,
        DurationSec   = request.DurationSec,
        TagList       = JsonSerializer.Serialize(request.TagList),
        StartedAt     = DateTime.UtcNow,
        Status        = "Running",  // ✅ Running으로 설정
        RowCount      = 0,
        RetentionDays = request.RetentionDays,
        Pinned        = false
    };
    _ctx.FastSessions.Add(session);
    await _ctx.SaveChangesAsync();
    return session;
}
```

### 2. ExperionFastService.cs (`src/Infrastructure/OpcUa/ExperionFastService.cs:111`)

**변경 전:**
```csharp
_sessions[session.Id] = ctx;
await db.UpdateFastSessionStatusAsync(session.Id, "Running");  // ❌ 중복 호출

_logger.LogInformation("[Fast] 세션 {Id} 시작 — 태그 {Count}개, {Ms}ms, {Sec}s",
    session.Id, request.TagList.Length, request.SamplingMs, request.DurationSec);
```

**변경 후:**
```csharp
_sessions[session.Id] = ctx;

_logger.LogInformation("[Fast] 세션 {Id} 시작 — 태그 {Count}개, {Ms}ms, {Sec}s",
    session.Id, request.TagList.Length, request.SamplingMs, request.DurationSec);
```

## 검증

### 빌드 검증
```bash
dotnet build src/Web/ExperionCrawler.csproj --no-restore -v q
```
- **결과:** Build succeeded (0 Error, 9 Warning)
- **Warning:** null reference 관련 경고 (기존 코드)

### 커밋
```
fix: fastSession 시작 시 엔티티 변경 오류 수정 - CreateFastSessionAsync에서 Status를 Pending에서 Running으로 변경
```
- 커밋 해시: `6689612`
- 변경 파일: `ExperionDbContext.cs`, `ExperionFastService.cs`

## 영향 범위

### 수정된 파일
1. [`src/Infrastructure/Database/ExperionDbContext.cs`](src/Infrastructure/Database/ExperionDbContext.cs:732)
2. [`src/Infrastructure/OpcUa/ExperionFastService.cs`](src/Infrastructure/OpcUa/ExperionFastService.cs:68)

### 영향을 받는 기능
- fastSession 신규 생성
- fastSession 시작
- fastSession 목록 조회

## 참고 사항

### Status 허용값
`FastSession.Status` 필드는 다음 값만 허용합니다:
- `Pending` - 대기 중
- `Running` - 실행 중
- `Completed` - 완료
- `Cancelled` - 취소
- `Failed` - 실패
- `RowLimitReached` - 행 제한 도달

### 왜 "Running"으로 변경했는가?
`CreateFastSessionAsync`는 세션을 생성하고 즉시 실행 상태로 만들기 때문에 `Status`를 `"Running"`으로 설정했습니다. `ExperionFastService.StartSessionAsync`에서 이미 `UpdateFastSessionStatusAsync`를 호출하여 `"Running"`으로 변경하는 로직이 있었기 때문에, 이를 `CreateFastSessionAsync`로 이동시켜 중복 호출을 제거했습니다.

## 관련 문서
- [`ExperionEntities.cs`](src/Core/Domain/Entities/ExperionEntities.cs:101) - FastSession 엔티티 정의
- [`ExperionControllers.cs`](src/Web/Controllers/ExperionControllers.cs:672) - fastSession API 컨트롤러
- [`app.js`](src/Web/wwwroot/js/app.js:2102) - 프론트엔드 fastStart 함수
