Repository<T>
interface Repository<T> {
findById(id: string): T
findAll(): T[]
save(entity: T): T
}
제네릭 인터페이스는 findById, findAll, save 같은 공통 동작의 모양을 고정하고, T는 User나 Product 같은 실제 반환 타입을 끝까지 보존한다.
interface Repository<T> {
findById(id: string): T
findAll(): T[]
save(entity: T): T
}
저장 방식은 하나로 공유하되, 메서드의 입출력은 T에 맞춰 좁혀진다. 서비스와 테스트 대역은 구현체가 아니라 Repository<T> 계약에 의존한다.
User, Product처럼 실제 데이터 모양을 정의한다.
Repository<User>처럼 T 자리에 모델을 넣는다.
findAll은 User[], save는 User로 계산된다.
캐시, 서비스, 테스트가 같은 API 모양을 공유한다.
User
User[]
User
Product
Product[]
Product
id 접근 가능
모든 요소 id 보장
저장 전 식별자 검사
도메인이 늘어도 호출 방식은 흔들리지 않는다.
any로 흐르지 않고 모델별 타입 힌트가 유지된다.
메모리, HTTP, DB 구현체를 같은 계약으로 바꾼다.