NestJS의 깨끗한 구조 디렉터리 구조

다양한 디렉토리 구조


목록 구조가 상당히 고민이죠.NestJS뿐만 아니라 몇 가지 모델을 향상시켜 보려고 합니다.

Rails형


이것은 내가 처음으로 배운 목록 구조다.
├── controllers
│   ├── userController.ts
│   └── chatController.ts
├── services
│   ├── userService.ts
│   └── chatService.ts
├── models
│   ├── user.ts
│   └── chat.ts
└── configs

Rails형 청결 구조


이것은 내가 녹색 구조로 만든 목록 구조를 배웠다.
├── presentations
│   ├── userController.ts
│   └── chatController.ts
├── usecases
│   ├── userService.ts
│   └── chatService.ts
├── domains
│   ├── user
│   │   ├── userRepositoryInterface.ts
│   │   └── userEntity.ts
│   └── chat
│       ├── chatRepositoryInterface.ts
│       └── chatEntity.ts
├── infrastructures
│   ├── sequelize
│   │   └── userRepository.ts
│   └── dynamodb
│       └── chatRepository.ts
└── configs

주역 분할 청결 구조


이 구조는 Rails형의 청결한 구조를 계승하고 메인 영역에서 첫 번째 디렉터리를 구분한다.나는 어떤 보도에서 어떤 회사가 채택한 것을 보았다.관련 도메인 이름은 기본 도메인 디렉토리 아래에 있습니다.예를 들어 채팅 영역 아래에 참가자의 목록 영역을 추가했다.따라서 주요 도메인 이름 본체를 core로 분리한다.
├── chat
│   ├── presentations
│   │   └── chatController.ts
│   ├── usecases
│   │   └── chatService.ts
│   ├── domains
│   │   └── core
│   │       ├── chatRepositoryInterface.ts
│   │       └── chatEntity.ts
│   ├── infrastructures
│   │   └── dynamodb
│   │       └── chatRepository.ts
│   └── configs
└── account
    ├── presentations
    │   └── userController.ts
    ├── usecases
    │   └── userService.ts
    ├── domains
    │   └── core
    │       ├── userRepositoryInterface.ts
    │       └── userEntity.ts
    ├── infrastructures
    │   └── sequelize
    │       └── userRepository.ts
    └── configs

모듈형 청결 구조


만약 nestjs에서 청결 구조를 한다면, 나는 바로 이 구조라고 생각한다.폴더 이름은 무심코 지은 것이기 때문에entityinfra 등 좋아하는 이름도 괜찮다.
├── chat
│   ├── core
│   │   ├── entity
│   │   │   ├── chat.entity.ts
│   │   │   └── chat.repository.interface.ts
│   │   ├── infra
│   │   │   └── chat.repository.dynamodb.ts
│   │   ├── chat.controller.ts
│   │   ├── chat.service.ts
│   │   └── chat.module.ts
│   └── chat.index.module.ts
└── account
    ├── core
    │   ├── entity
    │   │   ├── user.entity.ts
    │   │   └── user.repository.interface.ts
    │   ├── infra
    │   │   └── user.repository.sequelize.ts
    │   ├── user.controller.ts
    │   ├── user.service.ts
    │   └── user.module.ts
    └── account.index.module.ts

질의 서비스 가져오기


모듈 디렉터리user.query.service.interface.ts와 인터페이스에 직접 있습니다.다음infra 디렉터리에 실제 실현user.repository.sequelize.ts이 나타날 것이다.
└── account
    ├── core
    │   ├── entity
    │   │   ├── user.entity.ts
    │   │   └── user.repository.interface.ts
    │   ├── infra
    │   │   ├── user.query.service.sequelize.ts
+   │   │   └── user.repository.sequelize.ts
    │   ├── user.controller.ts
    │   ├── user.service.ts
+   │   ├── user.query.service.interface.ts
    │   └── user.module.ts
    └── account.index.module.ts

외부 프로그램 라이브러리를 모듈로 가져오려면


nestjs의 방법에 따르면 sequelize와prisma 등 외부 라이브러리는 직접import이 아니라 모듈 관리,DI가 사용하고 싶은 서비스입니다.만드는 방법은 두 가지가 있다.
숨김 모드 1 라이브러리의 고유 명사.
├── account
│   ├── core
│   │   ├── entity
│   │   │   ├── user.entity.ts
│   │   │   └── user.repository.interface.ts
│   │   ├── infra
│   │   │   └── user.query.service.sequelize.ts
│   │   ├── user.controller.ts
│   │   ├── user.service.ts
│   │   └── user.module.ts
│   └── account.index.module.ts
└── cache
    ├── infra
    │   └── cache.service.redis.ts
    ├── cache.service.interface.ts
    └── cache.module.ts
사용 모드 2 라이브러리의 고유 명사.
├── account
│   ├── core
│   │   ├── entity
│   │   │   ├── user.entity.ts
│   │   │   └── user.repository.interface.ts
│   │   ├── infra
│   │   │   └── user.query.service.sequelize.ts
│   │   ├── user.controller.ts
│   │   ├── user.service.ts
│   │   └── user.module.ts
│   └── account.index.module.ts
└── sequelize
    ├── sequelize.service.ts
    └── sequelize.module.ts
모드1은 리디스가 가지고 있는 고속 캐시 작용의 앞에 나타나고 추상화된다.따라서 cache.service.ts가 아니라cache.service.interface.ts다.infra 디렉토리에 설치합니다.
모드 2는 sequelize 자체를 서비스화합니다.
추상화된 관점에서는 패턴 2보다 패턴 1이 더 추천된다.모드2는 주로 다른 디렉터리infra 디렉터리에 자주 사용되는 라이브러리에 주입하는 데 사용됩니다.
추상화에 관해서는 이 보도에 상세한 해설이 있다.
https://zenn.dev/dove/articles/40ec3779b39ac6

도메인 이벤트 관련 디렉터리에 들어간 경우


├── account
│   ├── core
│   │   ├── entity
│   │   │   ├── user.entity.ts
│   │   │   └── user.repository.interface.ts
│   │   ├── event
│   │   │   └── account.created.event.ts
│   │   ├── infra
│   │   │   └── user.query.service.sequelize.ts
│   │   ├── user.controller.ts
│   │   ├── user.service.ts
│   │   └── user.module.ts
│   └── account.index.module.ts
├── notification
│   ├── listener
│   │   └── account.created.listener.ts
│   ├── notification.service.ts
│   └── notification.module.ts
└── share
    ├── baseEvent.ts
    └── util.ts
설치는 여기를 참조하세요.
https://zenn.dev/dove/articles/40476144e8bf9a

좋은 웹페이지 즐겨찾기