Repository<T>

하나의 저장소 계약이 도메인 타입마다 달라진다

제네릭 인터페이스는 findById, findAll, save 같은 공통 동작의 모양을 고정하고, T는 User나 Product 같은 실제 반환 타입을 끝까지 보존한다.

공통 계약

Repository<T>

interface Repository<T> {
  findById(id: string): T
  findAll(): T[]
  save(entity: T): T
}
구현체

MemoryRepository<T>

저장 방식은 하나로 공유하되, 메서드의 입출력은 T에 맞춰 좁혀진다. 서비스와 테스트 대역은 구현체가 아니라 Repository<T> 계약에 의존한다.

01

도메인 타입

User, Product처럼 실제 데이터 모양을 정의한다.

02

계약에 주입

Repository<User>처럼 T 자리에 모델을 넣는다.

03

메서드 추론

findAll은 User[], save는 User로 계산된다.

04

재사용 경계

캐시, 서비스, 테스트가 같은 API 모양을 공유한다.

User

User

User[]

User

Product

Product

Product[]

Product

HasId 제약

id 접근 가능

모든 요소 id 보장

저장 전 식별자 검사

API 모양 고정

도메인이 늘어도 호출 방식은 흔들리지 않는다.

반환 타입 보존

any로 흐르지 않고 모델별 타입 힌트가 유지된다.

교체 가능성

메모리, HTTP, DB 구현체를 같은 계약으로 바꾼다.