포시코딩

4월3일 - Nest.js의 Class와 Factory 본문

Node.js

4월3일 - Nest.js의 Class와 Factory

포시 2023. 4. 4. 00:09
728x90

Class와 Factory

Nest.js에서 Class와 Factory는 모두 컴포넌트를 정의하는 방법 중 하나이다.

공통적으로 의존성 주입(Dependency Injection)을 구현하는데 사용된다.

다만 목적과 사용 방법에서 차이가 있다.

 

Class

  • 일반적으로 @Injectable() 데코레이터를 사용하여 Nest.js에게 해당 클래스가 컴포넌트임을 알린다.
  • @Inject() 데코레이터를 사용하여 다른 컴포넌트에서 해당 클래스를 주입할 수 있다.
  • 클래스는 한 번 정의되면 프로그램 전체에서 공유되며, 필요한 곳에서 인스턴스화 된다.
  • 컴포넌트가 필요한 모든 곳에서 동일한 인스턴스를 공유해야 하는 경우에 사용된다.
  • 생성자 인자를 통해 의존성을 주입받는다.
  • 생성자에서 인스턴스화되는 서비스에 대한 참조를 쉽게 얻을 수 있으며, 코드의 가독성과 유지관리가 용이하다.
// AuthService 클래스 예시

import { Injectable, Logger } from '@nestjs/common';
import { JwtService } from '@nestjs/jwt';
import { UsersService } from '../users/users.service';

@Injectable()
export class AuthService {
  constructor(
    private readonly usersService: UsersService,
    private readonly jwtService: JwtService,
    private readonly logger: Logger,
  ) {}

}

 

Factory

  • Nest.js에서 팩토리를 사용하여 컴포넌트를 동적으로 생성할 수 있다.
  • 일반적으로 @Injectable() 데코레이터와 @Inject() 데코레이터를 모두 사용한다.
  • 팩토리는 컴포넌트가 필요한 시점에 호출되어 해당 컴포넌트를 생성하고 반환한다.
  • 이렇게 생성된 컴포넌트는 해당 컴포넌트를 사용하는 모듈이나 컨트롤러 등에서 사용될 수 있다.
  • 동적으로 컴포넌트를 생성해야하는 경우에 사용된다.
    ex) DB 연결 등의 리소스가 필요한 경우 팩토리를 사용하여 컴포넌트를 생성하고, 컨트롤러에서 해당 컴포넌트를 사용
  • 생성자 대신 팩토리 메서드를 사용해 객체를 생성한다. 팩토리를 사용하면 생성 로직을 더 잘 제어할 수 있으며, 클래스 내부에서 작동하지 않는 기능을 제공할 수 있다.
// AuthServiceFactory 예시

import { Injectable, Logger } from '@nestjs/common';
import { JwtService } from '@nestjs/jwt';
import { UsersService } from '../users/users.service';
import { AuthService } from './auth.service';

@Injectable()
export class AuthServiceFactory {
  createAuthService(): AuthService {
    const usersService = new UsersService();
    const jwtService = new JwtService();
    const logger = new Logger('AuthService');
    return new AuthService(usersService, jwtService, logger);
  }
}

AuthServiceFactory는 createAuthService() 팩토리 메서드를 통해 AuthService 인스턴스를 생성한다.

createAuthService() 메서드는 UsersService, JwtService, Logger 등 AuthService 생성자의 의존성을 수동으로 해결한다.

팩토리를 사용하면 생성 로직을 더욱 세부적으로 제어할 수 있으므로 필요한 경우에만 사용하는 것이 좋다.

 

사용자 정의 프로바이더와 같은 고급 기능을 구현해야 하는 경우 팩토리를 사용하는 것이 좋은데, 

일반적인 경우에는 그냥 클래스를 사용하는 것이 더 효율적이라고 한다.

 

 

 

 

참고한 곳

https://overcome-the-limits.tistory.com/673

 

[Project] 프로젝트 삽질기9 (feat Queue, bull)

들어가며 사이드 프로젝트에서 푸시 알림을 활용한 서비스를 개발하고 있습니다. 그 과정에서 생각하고 배웠던 점들을 하나씩 작성하고자 합니다. 먼저 푸시 알림 서비스를 구축하려면, Queue를

overcome-the-limits.tistory.com

728x90