계약
interface Repository<T> {
findAll(): T[]
findById(id: string): T
}
메서드 이름과 반환 규칙을 인터페이스에 모은다.
제네릭 인터페이스는 공통 메서드의 모양을 고정하고, 타입 인자는 각 도메인 모델의 반환 타입을 끝까지 보존한다.
interface Repository<T> {
findAll(): T[]
findById(id: string): T
}
메서드 이름과 반환 규칙을 인터페이스에 모은다.
class MemoryRepository<T> implements Repository<T>
구현은 하나지만 내부 데이터와 반환 타입은 T를 따른다.
Repository<User> Repository<Product>
사용 시점에 User, Product 같은 실제 모델을 끼운다.
userRepo.findAll() // User[]
조회 결과가 any가 아니라 정확한 도메인 타입으로 나온다.
service(repo) cache(repo) test(repo)
서비스, 캐시, 테스트 대역에서 같은 계약을 공유한다.
id, name, email
id, title, price
T[]
T
T
엔드포인트별 응답 타입을 보존하며 공통 조회 로직을 재사용한다.
서비스는 구현체보다 Repository<T> 계약에 의존한다.
메모리 저장소로 교체해도 메서드 반환 타입은 그대로 유지된다.