[NestJS] Providers

flobeeee·4일 전
0

Today I Learned

목록 보기
42/42

프로젝트 구조를 대분류로 나누자면 2가지가 있다

1. 기능별/도메인별 폴더 묶음 (Feature-based)

기능별로 폴더를 묶어 관리하는 방법이다.

이방법은 어떤 기능을 유지보수할때, 그 폴더안에 있는 파일만 확인하면 된다는 장점이 있다.
프로젝트의 규모가 커질수록 좋은 방법이다.
여러 개발자가 한 프로젝트를 관리할 때, 충돌의 가능성이 적다.

  • 예시
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

2. 파일 유형별 폴더 묶음 (Type-based)

두번째는 파일의 속성끼리 묶어 관리하는 방법이다.

컨트롤러는 컨트롤러끼리, 서비스는 서비스끼리, 레포지토리는 레포지토리끼리 있다.
프로젝트 초기에는 직관적이다.
소규모에 적합하다.
나중에 규모 커졌을 때, 유지보수할때 확인해야하는 폴더가 많아서 귀찮다.

  • 예시
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

NestJS

해당 프레임워크는 Feature-based 기반으로 만들어져 있다.

물론 2번 방식으로 수정도 가능하다.
이 글은 1번 방식에 초점을 두고 있다.

Providers

// 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를 빼면 바로 에러가 발생한다.

profile
기록하는 백엔드 개발자

0개의 댓글