타입스크립트와 몽구스를 사용한 확장 가능한 베이스 리포지토리 구축 🔥
카테고리
프로그래밍/소프트웨어 개발
서브카테고리
웹 개발
대상자
- 대상자: 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. **미래 확장성**
GetAllOptions
에search
,useCursor
,aggPipeline
등 새로운 기능 플래그 추가 가능getAll()
내부에서opts.search
기반 텍스트 검색 또는aggPipeline
기반 집계 처리
결론
- DRY 원칙을 준수해 모든 모델의 공통 로직을 단일 팩토리로 관리
- 타입스크립트로 강력한 타이핑 적용해 잘못된 필터/정렬 오류 방지
- 미래 확장성을 위해
GetAllOptions
와 팩토리 함수를 확장해 새로운 기능 추가 가능 - "모든 CRUD 로직을 복사/붙이지 말고,
createBaseRepository
팩토리를 사용해 한 번 구현 후 모든 모델에 확장하세요."