Files
portfolio-hub/docs/batches/bat-021_20260628_req047-step2-integration-and-runbook/implementation.md
T
genichin 3e1b571906 feat(bat-021): REQ-047 Step2 동반 코드 수정 + 실 DB 통합검증 + 런북
- ensure_schema() broker_credentials: daemon_id NOT NULL, PK=(daemon_id,broker)로 갱신
- _row_to_broker_credential: Step2 컬럼 순서(daemon_id 선두)로 갱신
- upsert_broker_credential: ON CONFLICT (daemon_id,broker)로 수정, fallback try/except 제거
- list_broker_credentials: fallback 제거, SELECT 컬럼 순서 갱신
- test_bat020_broker_credential_domain.py: AC-3/AC-4 행 순서를 Step2 포맷으로 갱신
- tests/test_bat021_step2_ensure_schema_and_upsert.py: 12개 신규 테스트
- docs/runbooks/bat-021-req047-step2-migration-runbook.md: 운영 적용 런북
- docs/batches/bat-021: batch 문서(index/planning/design/implementation/verification)

실 PostgreSQL 통합검증(AC-1~7 전건 PASS):
  Step1 upgrade → backfill → Step2 upgrade → downgrade 시나리오 포함
  NULL 사전검증(upgrade 거부) 및 downgrade 안전장치(중복 시 RuntimeError) 확인

521 passed, 0 failed (기존 509 + 신규 12)
2026-06-28 10:19:27 +09:00

61 lines
2.1 KiB
Markdown

# BAT-021 Implementation
## 변경 파일
### `app/repositories/postgres.py`
**T-1: ensure_schema() broker_credentials CREATE TABLE 갱신**
구 정의 (Step1 이전):
```sql
PRIMARY KEY (user_id, broker)
-- daemon_id 없음
```
신 정의 (Step2 이후):
```sql
daemon_id TEXT NOT NULL,
broker TEXT NOT NULL,
user_id TEXT NOT NULL,
account_ref TEXT NOT NULL,
encrypted_payload TEXT NOT NULL,
credential_version INTEGER NOT NULL DEFAULT 1,
last_rotated_at TIMESTAMPTZ NOT NULL DEFAULT NOW(),
PRIMARY KEY (daemon_id, broker)
```
**T-2: `_row_to_broker_credential` Step2 컬럼 순서 적용**
구 매핑: `row[0]=user_id, row[1]=broker, ..., row[6]=daemon_id`
신 매핑: `row[0]=daemon_id, row[1]=user_id, row[2]=broker, row[3]=account_ref, row[4]=encrypted_payload, row[5]=credential_version, row[6]=last_rotated_at`
**T-3: `upsert_broker_credential` ON CONFLICT 수정 + fallback 제거**
- `ON CONFLICT (user_id, broker)` → `ON CONFLICT (daemon_id, broker)`
- `RETURNING` 컬럼 순서: `daemon_id, user_id, broker, account_ref, encrypted_payload, credential_version, last_rotated_at`
- `try/except` fallback 완전 제거 (트랜잭션 abort 이슈 동시 해소)
**T-4: `list_broker_credentials` fallback 제거 + SELECT 컬럼 순서 수정**
- `try/except` fallback 완전 제거
- `SELECT daemon_id, user_id, broker, ...` 순서로 변경
### `tests/test_bat020_broker_credential_domain.py`
- `test_row_to_broker_credential_with_daemon_id`: 행 순서를 Step2 컬럼 순서로 수정 (AC-3 갱신)
- `test_row_to_broker_credential_without_daemon_id`: Step2 5컬럼 기본값 테스트로 갱신 (AC-4 갱신)
- `_make_rows_for_user`: Step2 컬럼 순서로 갱신
### 신규 파일
- `tests/test_bat021_step2_ensure_schema_and_upsert.py`: 12개 신규 테스트
- `docs/runbooks/bat-021-req047-step2-migration-runbook.md`
- `docs/batches/bat-021_20260628_req047-step2-integration-and-runbook/` (index, planning, design, implementation, verification)
## 테스트 count (구현 후)
- 기존: 509 passed
- 신규: 12 추가 (test_bat021_step2_ensure_schema_and_upsert.py)
- 합계: 521 passed