[NestJS] Modules & Controllers & Providers (3)

[Provider]

클래스에 @Injectable() 데코레이터를 붙여서 선언한다.

이는 가장 흔한 생성자 기반 의존성 주입을 위한 방법인데, 다른 방법도 있다는 점은 일단 알아두자.

 

Provider는 Nest의 기본 구성요소 중 하나인데, 모듈이나 컨트롤러와 달리 다양한 역할을 가질 수 있다.

대표적인 역할이 Service이고, Repository, Factory, Helper 등등 만들기 나름이다.

기본적으로 Nest에서 Provider란 의존성으로서 Injectable 한 요소다.

스프링에서도 중요한 개념인 Dependency Injection을 위한 요소라고 보면 된다.

 

가장 흔하게 사용되는 Provider 역할인 Service를 보자.

// user.service.ts

@Injectable()
export class UserService {
  constructor(
    @InjectRepository(UserEntity)
    private userRepository: Repository<UserEntity>,
  ){}
  
  async findAll(): Promise<UserEntity[]> {
    return await this.userRepository.find();
  }
}

이전 포스트에서 Controller가 호출한 findAll() 함수를 작성해보았다.

여기서 유의할 점은, userRepository 관련 코드는 DB 접근을 위한 TypeORM의 구성요소다.

일단 지금은 DB에 접근해서 데이터를 읽어오는 객체 정도로 이해하고 넘어가자.

 

위와 같이 @Injectable() 데코레이터를 지정한 클래스는 이제 의존성 주입으로 사용 가능하다.

 

이전 포스트들을 떠올려보면 모듈이나 컨트롤러도 앞에 export 키워드가 붙어있었을 것이다.

UserService 또한 export 키워드가 붙어있는데, 이것은 파일 외부로 클래스를 노출시키기 위한 것이다.

이건 TypeScript 규칙에 따른 것으로, 다른 파일에서 import 하기 위해선 export 해야한다, 정도로 넘어가자.

 

이전에 작성한 코드들을 다시 살펴보자.

// user.controller.ts

@Controller('users')
export class UserController {
  constructor(
    private readonly userService: UserService,
  ) {}
  
  @Get()
  findAll(): Promise<UserEntity[]> {
    return this.UserService.findAll();
  }
}

컨트롤러의 생성자에 UserService 클래스 변수를 인자로 넣는 것으로 의존성 주입이 끝났다.

Nest에서 클래스를 token으로 하여 컨트롤러에 의존성을 주입한 것이다.

 

일반적인 경우 Nest가 Provider를 싱글턴으로 관리하기 때문에, 객체 생성은 보통 한 번만 하게 된다.

Provider의 생명주기는 따로 scope 속성을 주지 않는 한 Nest 어플리케이션과 같다고 보면 된다.

Nest 어플리케이션이 Bootstrap 할 때 모든 의존성 객체가 생성되고, 어플리케이션이 끝날 때 파괴된다.

일반적이지 않은 경우는 이 포스트에서는 다루지 않겠다.

// user.module.ts

@Module({
  controllers: [UserController],
  providers: [UserService],
  exports: [UserService],
})
export class UserModule {}

당연한 말이지만, Provider는 providers 속성에 들어간다.

외부에서 UserModule을 import 하면 UserService를 사용할 수 있도록 UserService를 exports에도 넣어주었다.

 

여기까지 Module, Controller, Provider에 대해 아주 간략하게 공부해보았다.

async/await 이나 TypeORM 관련 코드 때문에 오히려 헷갈리게 만들었을 수도 있겠다.

하지만 실제로 서버를 개발하다보면 자주 보게 될 코드라 미리 한 번 넣어보았다. (한 줌의 리얼리티?)

 

읽어주신 분들께 감사합니다. :)

Nest-CLI로 서비스 생성하기 (주의: Provider 아니고 Service임)

$ nest generate service user

또는

$ nest g s user