프로젝트 구조를 대분류로 나누자면 2가지가 있다
기능별로 폴더를 묶어 관리하는 방법이다.
이방법은 어떤 기능을 유지보수할때, 그 폴더안에 있는 파일만 확인하면 된다는 장점이 있다.
프로젝트의 규모가 커질수록 좋은 방법이다.
여러 개발자가 한 프로젝트를 관리할 때, 충돌의 가능성이 적다.
src/
├── user/
│ ├── dto/
│ ├── entities/
│ ├── user.controller.ts
│ ├── user.service.ts
│ ├── user.repository.ts
│ └── user.module.ts
├── board/
│ ├── dto/
│ ├── entities/
│ ├── board.controller.ts
│ ├── board.service.ts
│ ├── board.repository.ts
│ └── board.module.ts
두번째는 파일의 속성끼리 묶어 관리하는 방법이다.
컨트롤러는 컨트롤러끼리, 서비스는 서비스끼리, 레포지토리는 레포지토리끼리 있다.
프로젝트 초기에는 직관적이다.
소규모에 적합하다.
나중에 규모 커졌을 때, 유지보수할때 확인해야하는 폴더가 많아서 귀찮다.
src/
├── controllers/
│ ├── board.controller.ts
│ └── user.controller.ts
├── services/
│ ├── board.service.ts
│ └── user.service.ts
├── repositories/
│ ├── board.repository.ts
│ └── user.repository.ts
├── dtos/
│ ├── create-board.dto.ts
│ ├── update-board.dto.ts
│ ├── create-user.dto.ts
│ └── update-user.dto.ts
└── entities/
├── board.entity.ts
└── user.entity.ts
해당 프레임워크는 Feature-based 기반으로 만들어져 있다.
물론 2번 방식으로 수정도 가능하다.
이 글은 1번 방식에 초점을 두고 있다.
// board.module.ts
import {Module} from '@nestjs/common';
import {TypeOrmModule} from '@nestjs/typeorm';
import {Board} from '@/entities/Board.entity';
import {BoardService} from './Board.service';
import {BoardController} from './Board.controller';
import {BoardRepository} from './Board.repository';
@Module({
imports: [TypeOrmModule.forFeature([Board])],
controllers: [BoardController],
providers: [BoardService, BoardRepository],
})
export class BoardModule {}
여기서 주목할만한 점이 있다.
구조상
BoardController -> BoardService -> BoardRepository
순으로 로직이 실행된다.
컨트롤러에서 서비스를 호출하고 DB 쿼리는 날리는 로직은 레포지토리에서 가져오는 것이다.
착각하기 쉬운 게 BoardService 에 BoardRepository 이 속해있으니까
BoardRepository는 providers에 굳이 넣지 않아도 되지 않을까? 이다
https://docs.nestjs.com/providers
공식문서를 확인해보면 이렇게 명시되어 있다.
Providers are a core concept in Nest. Many of the basic Nest classes, such as services, repositories, factories, and helpers, can be treated as providers.
NestJS에서 Provider는 Service, Repository, Factory 등 모든 주입 가능한 클래스를 의미합니다.
핵심은 어떤 클래스가 다른 클래스의 기능을 사용하려면, 그 사용하려는 클래스(Provider)가 NestJS의 DI 시스템에 등록되어야 한다.
providers 에서 BoardRepository를 빼면 바로 에러가 발생한다.