프로그래밍/Nest.js

Nest.js에서 팩토리 프로바이더 활용하기

shimdh 2025. 3. 23. 15:36
728x90

Nest.js는 현대적인 서버 사이드 애플리케이션을 구축하기 위한 강력한 프레임워크입니다. 그 중에서도 팩토리 프로바이더는 의존성 주입 시스템을 활용하여 객체를 생성하는 유연한 방법으로, 복잡한 애플리케이션 개발에 있어 매우 유용한 도구입니다. 이번 포스트에서는 팩토리 프로바이더의 개념, 구조, 예제 및 장점에 대해 자세히 알아보겠습니다.

팩토리 프로바이더란?

팩토리 프로바이더는 특정 로직을 통해 인스턴스를 생성하는 함수를 제공하는 역할을 합니다. 일반적으로 클래스를 직접 인스턴스화하기보다는 팩토리를 통해 원하는 방식으로 인스턴스를 생성할 수 있습니다. 이러한 접근 방식은 코드의 재사용성과 테스트 용이를 높이는 데 기여하며, 개발자가 더 나은 구조의 코드를 작성할 수 있도록 돕습니다.

팩토리 프로바이더의 필요성

  • 복잡한 설정: 다양한 환경이나 조건에 따라 다르게 설정해야 하는 서비스나 객체를 만들 때 유용합니다.
  • 유연한 객체 생성: 객체 생성의 복잡성을 줄이고, 다양한 환경에서의 유연한 설정을 가능하게 합니다.

팩토리 프로바이더의 구조

Nest.js에서 팩토리 프로바이더를 정의하려면 다음과 같은 구조를 따릅니다:

  1. 프로바이더 클래스: 서비스를 정의합니다. 이 클래스는 비즈니스 로직을 포함하고 있으며, 다른 컴포넌트에서 사용할 수 있는 메서드를 제공합니다.
  2. 팩토리 함수: 해당 서비스를 반환하는 함수를 정의합니다. 이 함수는 인스턴스를 생성하는 데 필요한 모든 정보를 수집하고, 이를 바탕으로 객체를 생성합니다.
  3. 모듈 등록: 모듈 내에서 이들을 연결합니다. 이를 통해 Nest.js의 의존성 주입 시스템이 이 프로바이더를 인식하고 사용할 수 있도록 합니다.

예제

아래 예제를 통해 팩토리 프로바이더가 어떻게 작동하는지 살펴보겠습니다.

// 1. 서비스 클래스 정의
export class DatabaseService {
    constructor(private readonly connectionString: string) {}

    connect() {
        console.log(`Connected to database at ${this.connectionString}`);
    }
}

// 2. 팩토리 함수 정의
const databaseServiceFactory = {
    provide: DatabaseService,
    useFactory: () => {
        const connectionString = process.env.DATABASE_URL || 'default_connection_string';
        return new DatabaseService(connectionString);
    },
};

// 3. 모듈 등록
import { Module } from '@nestjs/common';

@Module({
    providers: [databaseServiceFactory],
})
export class AppModule {}

위의 예제에서는 DatabaseService라는 서비스를 만들고, 그 서비스에 대한 인스턴스를 생성하기 위한 useFactory 함수를 제공합니다. 이 함수는 환경 변수를 기반으로 데이터베이스 연결 문자열을 결정하고, 이를 사용해 DatabaseService의 새로운 인스턴스를 반환합니다. 이와 같은 방식으로, 개발자는 환경에 따라 유연하게 객체를 생성할 수 있습니다.

팩토리 프로바이더의 장점

1. 유연성

  • 다양한 입력값에 따라 다른 인스턴스를 쉽게 생성할 수 있습니다.
  • 테스트 환경이나 프로덕션 환경에서 서로 다른 설정을 요구하는 경우에 유용합니다.

2. 테스트 용이성

  • Mocking 및 Stubbing 작업 시 복잡성을 줄여줍니다.
  • 개발자는 테스트를 위해 필요한 객체를 쉽게 생성하고, 의존성을 관리할 수 있습니다.

3. 코드 재사용성

  • 동일한 로직으로 여러 서비스를 쉽게 구성할 수 있습니다.
  • 이는 코드의 중복을 줄이고, 유지보수를 용이하게 합니다.

결론

팩토리 프로바이더는 Nest.js 애플리케이션에서 더 나은 유지보수성과 확장성을 제공하는 강력한 도구입니다. 위와 같은 패턴을 활용하면 상황에 맞게 동적으로 객체를 생성하고 관리할 수 있어, 더욱 효율적인 개발환경을 구축할 수 있습니다. 이러한 유연한 구조는 개발자가 변화하는 요구사항에 신속하게 대응할 수 있도록 도와주며, 결과적으로 더 나은 품질의 소프트웨어를 개발하는 데 기여합니다.

728x90