Repository<T>

하나의 저장소 계약을 타입별로 재사용한다

제네릭 인터페이스는 공통 메서드의 모양을 고정하고, 타입 인자는 각 도메인 모델의 반환 타입을 끝까지 보존한다.

1

계약

interface Repository<T> {
  findAll(): T[]
  findById(id: string): T
}

메서드 이름과 반환 규칙을 인터페이스에 모은다.

2

구현 클래스

class MemoryRepository<T>
  implements Repository<T>

구현은 하나지만 내부 데이터와 반환 타입은 T를 따른다.

3

타입 인자

Repository<User>
Repository<Product>

사용 시점에 User, Product 같은 실제 모델을 끼운다.

4

반환 안정성

userRepo.findAll()
// User[]

조회 결과가 any가 아니라 정확한 도메인 타입으로 나온다.

5

Repository 재사용

service(repo)
cache(repo)
test(repo)

서비스, 캐시, 테스트 대역에서 같은 계약을 공유한다.

타입 인자

User

id, name, email

Product

id, title, price

메서드 반환

findAll()

T[]

findById()

T

save()

T

API 클라이언트

엔드포인트별 응답 타입을 보존하며 공통 조회 로직을 재사용한다.

도메인 서비스

서비스는 구현체보다 Repository<T> 계약에 의존한다.

테스트 대역

메모리 저장소로 교체해도 메서드 반환 타입은 그대로 유지된다.