# STEP 3 — DB 초기화: 테이블 생성 + TimescaleDB hypertable

## 사전 확인 (작업 전 반드시 수행)

1. `src/Infrastructure/Database/ExperionDbContext.cs` 파일을 열어 `InitializeAsync()` 메서드를 찾는다.
2. 아래 항목을 확인하고 기록한다:
   - [x] STEP 2가 완료되어 DbSet이 존재하는가? → 미완료면 STEP 2 먼저 수행
   - [x] `InitializeAsync()` 메서드가 존재하는가? (없으면 구현 위치를 확인)
   - [x] `CREATE TABLE IF NOT EXISTS fast_session` SQL이 이미 있는가? → 있으면 이 STEP 건너뜀
   - [x] `create_hypertable('fast_record'...)` SQL이 이미 있는가? → 있으면 이 STEP 건너뜀
   - [x] 파일 상단에 `using System.Text.Json;` import가 있는가? → 없으면 추가

---

## 작업 내용

**파일**: `src/Infrastructure/Database/ExperionDbContext.cs`  
**위치**: `ExperionDbService.InitializeAsync()` 메서드 내부, 기존 초기화 코드 마지막 줄 아래

```csharp
// ── fast_session / fast_record 테이블 생성 ────────────────────────────────
await _ctx.Database.ExecuteSqlRawAsync("""
    CREATE TABLE IF NOT EXISTS fast_session (
        id             SERIAL PRIMARY KEY,
        name           TEXT        NOT NULL,
        started_at     TIMESTAMPTZ NOT NULL,
        ended_at       TIMESTAMPTZ,
        status         TEXT        NOT NULL DEFAULT 'Pending',
        sampling_ms    INTEGER     NOT NULL,
        duration_sec   INTEGER     NOT NULL,
        tag_list       JSONB       NOT NULL DEFAULT '[]',
        row_count      INTEGER     NOT NULL DEFAULT 0,
        retention_days INTEGER,
        pinned         BOOLEAN     NOT NULL DEFAULT FALSE
    )
    """);

await _ctx.Database.ExecuteSqlRawAsync("""
    CREATE TABLE IF NOT EXISTS fast_record (
        id          SERIAL PRIMARY KEY,
        session_id  INTEGER     NOT NULL REFERENCES fast_session(id) ON DELETE CASCADE,
        recorded_at TIMESTAMPTZ NOT NULL,
        tagname     TEXT        NOT NULL,
        value       TEXT
    )
    """);

// TimescaleDB hypertable 생성 (recorded_at 기준, chunk_interval = 1 day)
await _ctx.Database.ExecuteSqlRawAsync("""
    SELECT create_hypertable('fast_record', 'recorded_at', if_not_exists => TRUE)
    """);

await _ctx.Database.ExecuteSqlRawAsync("""
    SELECT set_chunk_time_interval('fast_record', INTERVAL '1 day')
    """);
```

---

## 사후 확인 (작업 후 반드시 수행)

1. `ExperionDbContext.cs` 파일을 다시 열어 추가된 SQL 블록을 읽는다.
2. 아래 항목을 하나씩 확인한다:
   - [x] `CREATE TABLE IF NOT EXISTS fast_session` SQL이 존재하는가?
   - [x] `CREATE TABLE IF NOT EXISTS fast_record` SQL이 존재하는가?
   - [x] `fast_record`에 `REFERENCES fast_session(id) ON DELETE CASCADE` 가 있는가?
   - [x] `create_hypertable('fast_record', 'recorded_at', if_not_exists => TRUE)` 가 있는가?
   - [x] `set_chunk_time_interval('fast_record', INTERVAL '1 day')` 가 있는가?
3. `dotnet build src/Infrastructure` 실행 → 에러/경고 0개 확인
4. (가능하면) 앱을 실제로 실행해 DB에 `fast_session`, `fast_record` 테이블이 생성되는지 확인

---

## 완료 조건
- `dotnet build src/Infrastructure` 결과: 에러 0, 경고 0 (기존 경고 포함)
- SQL 5개 블록 모두 `InitializeAsync` 내에 존재
- (선택) DB에서 `\d fast_record` 실행 시 hypertable 확인