Files
portfolio-hub/docs/srs/Data/req-046_broker-credential-daemon-id-field.md
T

6.6 KiB

REQ-046: BrokerCredential 도메인 모델 daemon_id 필드 추가

  • Status: Implemented
  • Type: Data
  • Priority: High
  • Owner: Justin Ko

Intent

  • BrokerCredential 도메인 엔티티가 현재 user_id 기반으로만 인증정보를 식별한다. daemon-scoped 소유로 전환하기 위해 daemon_id 필드를 모델에 추가하고, repository 조회/행 변환 로직이 daemon_id 차원을 인식하도록 한다.
  • 이 REQ는 도메인 모델·repository 계층의 데이터 구조 변경을 담당하며, 마이그레이션(REQ-047/REQ-048) 및 API 전달(REQ-049)·CLI(REQ-050)의 선행 조건이다.

Requirement

  • app/domain/models.py의 BrokerCredential dataclass에 daemon_id: str | None = None 필드를 추가한다.
  • app/repositories/postgres.py의 _row_to_broker_credential 정적 메서드가 DB 행에서 daemon_id를 읽어 BrokerCredential 인스턴스를 구성해야 한다.
  • upsert_broker_credential 메서드 시그니처에 daemon_id: str | None = None 파라미터를 추가하고, INSERT/ON CONFLICT 쿼리에 daemon_id 컬럼 처리를 반영한다. 단, 실제 테이블 컬럼은 REQ-047 마이그레이션이 선행 적용된 후 활성화되므로 이 REQ 단독으로는 DB 컬럼이 존재하지 않는 환경에서도 하위 호환을 고려한다.
  • list_broker_credentials 메서드에 daemon_id: str | None = None 파라미터를 추가하여, 값이 제공되면 daemon_id로 필터링한 결과를 반환하도록 한다.
  • delete_broker_credential 메서드 시그니처에 daemon_id: str | None = None 파라미터를 추가한다.

Acceptance Criteria

  1. Given BrokerCredential 인스턴스를 생성할 때 daemon_id=None이 기본값이면, When 인스턴스를 생성, Then daemon_id 필드가 None으로 존재한다.
  2. Given BrokerCredential 인스턴스를 생성할 때 daemon_id="daemon-abc" 값을 주면, When 인스턴스를 생성, Then daemon_id 필드가 "daemon-abc"로 존재한다.
  3. Given _row_to_broker_credential 메서드가 6컬럼 행(daemon_id 포함)을 받으면, When 변환, Then 반환 BrokerCredential.daemon_id가 해당 값으로 세팅된다.
  4. Given _row_to_broker_credential 메서드가 기존 6컬럼 행(daemon_id 없음)을 받으면, When 변환, Then BrokerCredential.daemon_id가 None으로 세팅된다(하위 호환).
  5. Given list_broker_credentials(user_id="u1", daemon_id="d1")를 호출하면, When DB에 daemon_id="d1" 행과 daemon_id="d2" 행이 있으면, Then daemon_id="d1" 행만 반환된다.
  6. Given list_broker_credentials(user_id="u1") (daemon_id 미지정)를 호출하면, When DB에 여러 행이 있으면, Then 모든 행을 반환한다(기존 동작 유지, 하위 호환).

Impacted Area

  • Docs:
    • docs/data-model.md — BrokerCredential 엔티티에 daemon_id 필드 추가, PK 변경 예고(REQ-047 선행 마이그레이션 후 PK=(daemon_id, broker)) 명시.
  • Modules:
    • app/domain/models.py — BrokerCredential dataclass에 daemon_id: str | None = None 필드 추가.
    • app/repositories/postgres.py — _row_to_broker_credential, upsert_broker_credential, list_broker_credentials, delete_broker_credential 시그니처 및 쿼리 갱신.
  • Tests:
    • BrokerCredential dataclass 필드 단위 테스트.
    • _row_to_broker_credential 행 변환 테스트(daemon_id 포함/미포함 두 케이스).
    • list_broker_credentials daemon_id 필터 테스트(mock 또는 메모리 repo 기반).

Notes

  • REQ-047(마이그레이션) 선행 없이는 실제 DB 컬럼이 없으므로, 이 REQ의 구현은 DB 컬럼 유무에 관계없이 모델/메서드 시그니처만 정합화하는 것을 목표로 한다. 실제 DB 컬럼 처리는 REQ-047 이후 통합 시점에 완성된다.
  • upsert_broker_credential 쿼리의 ON CONFLICT 절 수정은 PK 변경(REQ-047) 완료 이후 정합화한다. 따라서 이 REQ에서 upsert 쿼리의 ON CONFLICT 처리는 설계 위임(REQ-047 delivery 연계).
  • list_broker_credentials daemon_id 필터는 WHERE daemon_id = %s 조건을 추가하는 방식으로 구현하며, NULL 처리는 WHERE daemon_id IS NULL 또는 파라미터 없음(전체 조회)으로 구분한다.
  • data-model.md의 BrokerCredential 엔티티 갱신(daemon_id 필드, PK 변경 예고)은 이 REQ 구현 시 함께 반영한다.
  • Source: dcy-010 FR-1, §4 C1.

Change Log

CHG-20260628-01

  • Date: 2026-06-28
  • Author: Justin Ko

Change Summary

  • 신규 생성 (Proposed) — dcy-010 FR-1 산출물.

Intent

  • dcy-010 confirmed Discovery의 FR-1(daemon_id 차원 도입)을 도메인 모델·repository 계층 변경으로 분리하여 REQ로 정규화한다.

Acceptance Criteria Delta

  • Added:
    • AC-1 ~ AC-6 전체 (신규 초안)
  • Updated: 없음
  • Removed: 없음

Impacted Area Delta

  • Docs:
    • docs/srs/Data/req-046_broker-credential-daemon-id-field.md 신규 생성
    • docs/data-model.md 갱신 예고
  • Modules:
    • app/domain/models.py, app/repositories/postgres.py 최초 지정
  • Tests:
    • BrokerCredential 단위·행 변환·필터 테스트 신규

Delivery Trace Delta

  • Batches: 미정 (suggest-batch-reqs 대기)
  • Releases: 미정

Revalidation Impact

  • Reverification Needed: no
  • Existing Implementation Invalidated: no
  • Status Recommendation: keep-current
  • Follow-up Action: confirm-req 후 batch 배정. REQ-047 마이그레이션과 delivery 연계.

Validation Plan

  • pytest로 AC-1~6 각 케이스 확인. _row_to_broker_credential 하위호환(AC-4) 포함.

CHG-20260628-02

  • Date: 2026-06-28
  • Author: 팀장(Claude)
  • confirm-req: Proposed → Approved. dcy-010 FR-1 추적 확인, AC testable, 하위호환(AC-4) 적절. REQ-047 선행 의존 명시됨. blocker 없음.

CHG-20260628-03

  • Date: 2026-06-28
  • Author: 팀장(Claude)

Change Summary

  • confirm-req-implemented: Approved → Implemented. PR #17 머지(mergeCommit d4acfd4), BAT-020, QC PASS-WITH-NOTES(blocker 0), 테스트 통과.

Intent

  • BAT-020 delivery(PR #17 머지)에서 AC-1~6 전 항목 구현 및 테스트 통과가 확인되어 Implemented로 전환한다.

Acceptance Criteria Delta

  • Added: 없음
  • Updated: 없음
  • Removed: 없음

Impacted Area Delta

  • 없음 (상태 전환만)

Delivery Trace Delta

  • Batches: BAT-020 (PR #17, mergeCommit d4acfd4)
  • Releases: 미정

Revalidation Impact

  • Reverification Needed: no
  • Existing Implementation Invalidated: no
  • Status Recommendation: implemented

Validation Plan

  • BAT-020 verification 문서 및 QC PASS-WITH-NOTES 결과(blocker 0)로 AC-1~6 근거 확보됨.