DTO와 Entity는 Common에
모노레포에서의 DTO와 Entity 관리 방식
모노레포 구조에서
DTO
와 Entity
를 common
라이브러리에 두는 것은 일반적인 패턴입니다. 이 접근 방식은 특히 NestJS 모노레포에서 많이 사용됩니다.
일반적인 모노레포 구조의 장점
- 중앙 집중식 타입 관리:
- 모든 모듈이 참조할 수 있는 단일 소스로 작동
- 타입 정의의 중복을 방지하고 일관성 유지
- 마이크로서비스 전환 용이성:
- 서비스를 분리할 때도 공통 타입 정의는 그대로 유지
- 각 서비스는 동일한
@app/common
패키지를 참조하여 일관성 유지
- GraphQL 스키마 통합:
- 여러 서비스의 GraphQL 스키마를 통합할 때 타입 충돌 방지
- 일관된 타입 시스템 유지
마이크로서비스로 전환 시 고려사항
서비스를 분리할 계획이 있다면:
- 공통 패키지 배포:
- common 라이브러리를 npm 패키지로 배포하여 각 서비스가 참조
- 또는 모노레포 구조를 유지하면서 서비스만 별도 배포
- 버전 관리:
- 공통 타입 변경 시 버전 관리를 통해 하위 호환성 유지
- 주요 변경사항은 모든 서비스에 동시에 적용
- 도메인별 분리 가능:
- 필요에 따라 common/dto/users, common/dto/products 등으로 도메인별 구분
- 서비스 분리 시 관련 타입만 가져갈 수 있도록 구조화
대안적 접근 방식
일부 팀은 다른 접근 방식을 선호하기도 합니다:
- 도메인 중심 구조:
apps/
├── users/
│ ├── src/
│ │ ├── dto/
│ │ └── entities/
├── products/
│ ├── src/
│ │ ├── dto/
│ │ └── entities/
- 하이브리드 접근법:
- 여러 서비스에서 공유되는 타입은 common에 배치
- 특정 서비스에만 사용되는 타입은 해당 서비스 내에 배치
결론
모노레포에서 DTO와 Entity를 common 라이브러리에 두는 것은 일반적이고 효과적인 방식입니다. 이 접근법은 코드 재사용성을 높이고 일관성을 유지하는 데 도움이 됩니다.
마이크로서비스로 전환할 계획이 있더라도, 공통 타입 정의를 중앙에서 관리하는 것은 여전히 유효한 전략입니다. 각 서비스는 동일한 타입 정의를 참조하여 일관성을 유지할 수 있습니다.
프로젝트의 규모와 요구사항에 따라 가장 적합한 접근 방식을 선택하는 것이 중요합니다.