Files
ExperionCrawler/fastTable/fastSession-Error-correction.md
2026-04-30 08:16:21 +09:00

5.3 KiB

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의 변경 감지가 충돌을 일으켰습니다.

기존 코드 흐름:

// 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)

변경 전:

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;
}

변경 후:

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)

변경 전:

_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);

변경 후:

_sessions[session.Id] = ctx;

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

검증

빌드 검증

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
  2. src/Infrastructure/OpcUa/ExperionFastService.cs

영향을 받는 기능

  • fastSession 신규 생성
  • fastSession 시작
  • fastSession 목록 조회

참고 사항

Status 허용값

FastSession.Status 필드는 다음 값만 허용합니다:

  • Pending - 대기 중
  • Running - 실행 중
  • Completed - 완료
  • Cancelled - 취소
  • Failed - 실패
  • RowLimitReached - 행 제한 도달

왜 "Running"으로 변경했는가?

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

관련 문서