[BE-05] LimitedDropRepositoryImpl + JPA 영속화

작업 내용 (설계 의도)

변경 사항

LimitedDropRepository의 infrastructure 구현과 JPA 매핑(근거 TDD: ../TDD.md “ERD”). StockRepositoryImpl(Impl + JpaRepository 분리) 선례를 따른다. limited_drops 테이블 DDL은 private-senior-dbaprivate-mysql-implementer가 선행(V41__create_limited_drops.sql — ②가 V38~40 점유해 senior-dba가 V41 배정) — 이 티켓은 매핑·조회만. 롤백: 역방향 DDL로 테이블 drop(참조 코드 미배포 시 안전).

  • LimitedDropJpaRepository(Spring Data): findByProductIdAndStatus 파생 쿼리(활성 회차).
  • LimitedDropRepositoryImpl: save·findById·findOpenByProductId 구현.
  • LimitedDrop ↔ JPA 매핑: ENUM 컬럼 금지(VARCHAR status), 시간 ZonedDateTime, DATETIME(6). FK 컬럼 금지(product_id 일반 컬럼).
  • 복잡 조회 없음 → QueryDSL CustomImpl 불필요(파생 쿼리로 충분). @Query 사용 금지.

의존

  • BE-01 (LimitedDrop·LimitedDropRepository), DB(limited_drops 마이그레이션 — senior-dba·mysql-implementer 선행)

다이어그램

클래스 의존

flowchart LR
    LimitedDropRepositoryImpl -.->|implements| LimitedDropRepository
    LimitedDropRepositoryImpl --> LimitedDropJpaRepository
    LimitedDropJpaRepository -.->|매핑| LimitedDrop

테스트 케이스

  • save 후 findById로 동일 LimitedDrop을 복원한다 (Testcontainers MySQL)
  • findOpenByProductId는 status=OPEN 회차만 반환한다
  • CLOSED 회차만 있으면 findOpenByProductId는 null을 반환한다
  • status·시간 컬럼이 VARCHAR·DATETIME(6)로 매핑되어 왕복 저장·조회에 손실이 없다