TypeScript & Mongoose로 DRY 원칙 적용한 Base Repository 구축

타입스크립트와 몽구스를 사용한 확장 가능한 베이스 리포지토리 구축 🔥

카테고리

프로그래밍/소프트웨어 개발

서브카테고리

웹 개발

대상자

  • 대상자: Node.js와 MongoDB 백엔드 개발자
  • 난이도: 중급~고급 (타입스크립트, 몽구스, 타입 정의 경험 필요)

핵심 요약

  • createBaseRepository 팩토리 함수를 사용하여 모든 모델에 공통된 CRUD 로직을 DRY 원칙으로 구현
  • 강력한 타입 정의(FilterQuery, ProjectionType, SortBy)를 통해 타입스크립트로 오류 방지
  • 확장성 지원: GetAllOptions 인터페이스를 확장해 커서 페이징, 풀 텍스트 검색, 집계 추가 가능

섹션별 세부 요약

1. **Generic Types 정의**

  • T: 스키마 인터페이스 (예: Note { title: string; ... })
  • Doc extends HydratedDocument: 몽구스 문서 타입
  • FilterQuery: 몽구스 스타일 필터 적용 가능

2. **GetAllOptions 인터페이스**

  • filter: Mongoose 필터 적용
  • projection: 필드 포함/제외
  • pagination: 페이지 번호, 페이지 크기
  • sort: 타입스크립트로 강력한 정렬 (예: SortBy)
  • session: 트랜잭션을 위한 ClientSession 전달
  • populate: Mongoose의 populate() 지원

3. **기능 구현**

  • model.find()를 기반으로 .skip(), .limit(), .sort(), .populate() 체이닝
  • mongo.fire(() => query)를 통해 연결 관리, unwrap()으로 결과 처리
  • 인터페이스 확장 예시:

```typescript

export interface INotesRepository extends ReturnType> {

create(title: string, content: string, user: string, session?: ClientSession): Promise;

}

```

4. **미래 확장성**

  • GetAllOptionssearch, useCursor, aggPipeline새로운 기능 플래그 추가 가능
  • getAll() 내부에서 opts.search 기반 텍스트 검색 또는 aggPipeline 기반 집계 처리

결론

  • DRY 원칙을 준수해 모든 모델의 공통 로직을 단일 팩토리로 관리
  • 타입스크립트로 강력한 타이핑 적용해 잘못된 필터/정렬 오류 방지
  • 미래 확장성을 위해 GetAllOptions와 팩토리 함수를 확장해 새로운 기능 추가 가능
  • "모든 CRUD 로직을 복사/붙이지 말고, createBaseRepository 팩토리를 사용해 한 번 구현 후 모든 모델에 확장하세요."