framework/NestJS

⚡ NestJS Async Providers – 비동기 주입 완벽 가이드

octo54 2025. 4. 29. 11:11
반응형

⚡ NestJS Async Providers – 비동기 주입 완벽 가이드


NestJS에서 **Async Provider(비동기 프로바이더)**는 외부 API 호출, 데이터베이스 연결처럼
비동기 초기화가 필요한 의존성을 주입할 때 사용하는 핵심 기능입니다.
이번 글은 NestJS 공식 문서 Async Providers를 기반으로
한글 번역 + 실전 적용법 중심으로 해설합니다.

🚀 외부 리소스(예: Redis, Database, API Client)를 다룰 때는 Async Provider 패턴이 필수입니다.


✅ Async Provider란?

  • NestJS의 Provider는 기본적으로 싱크(sync) 방식입니다.
  • 하지만 외부 연결, 설정 파일 로딩, 인증 토큰 발급 등은 비동기(async) 로 처리해야 합니다.
  • 이때 useFactory + async/await 조합을 사용해 비동기 Provider를 선언합니다.

1️⃣ 기본 Async Provider 예제

const ConfigProvider = {
  provide: 'CONFIG',
  useFactory: async () => {
    const config = await loadConfigFromServer();
    return config;
  },
};
  • useFactory 안에서 async 함수로 외부 작업 수행
  • 완료된 값을 주입합니다.

2️⃣ 모듈에 Async Provider 등록

@Module({
  providers: [ConfigProvider],
  exports: ['CONFIG'],
})
export class ConfigModule {}
  • 이렇게 하면 다른 모듈에서도 'CONFIG' 토큰으로 주입받아 사용할 수 있습니다.

✅ 사용하는 쪽

@Injectable()
export class AppService {
  constructor(@Inject('CONFIG') private config) {}

  getConfigValue(key: string) {
    return this.config[key];
  }
}
반응형

 

이 구간은 Async Provider를 실전 적용하는 법이 소개되는 핵심 구간입니다.
애드센스 광고를 삽입하면 CTR이 가장 높은 지점이 됩니다.

<ins class="adsbygoogle"
     style="display:block"
     data-ad-client="ca-pub-XXXXXX"
     data-ad-slot="YYYYYY"
     data-ad-format="auto"
     data-full-width-responsive="true"></ins>

3️⃣ 다른 Provider를 주입받는 Async Provider

useFactory 안에서 다른 Provider를 주입받아 사용할 수도 있습니다.

@Module({
  providers: [
    DatabaseService,
    {
      provide: 'USER_REPOSITORY',
      useFactory: async (db: DatabaseService) => {
        return db.getRepository('User');
      },
      inject: [DatabaseService],
    },
  ],
})
export class UsersModule {}
  • inject: [DatabaseService]를 통해 DatabaseService 인스턴스를 useFactory 함수에 주입
  • db.getRepository('User')처럼 비동기 작업 후 결과를 반환

4️⃣ 실무에서 많이 쓰는 패턴 – 환경설정 모듈

✅ ConfigService 만들기

@Injectable()
export class ConfigService {
  private config: any;

  constructor() {
    this.config = {}; // 기본값
  }

  async load() {
    // 외부에서 환경 설정을 불러옴
    this.config = await loadExternalConfig();
  }

  get(key: string) {
    return this.config[key];
  }
}

✅ 비동기로 ConfigService 초기화

@Module({
  providers: [
    {
      provide: ConfigService,
      useFactory: async () => {
        const configService = new ConfigService();
        await configService.load();
        return configService;
      },
    },
  ],
  exports: [ConfigService],
})
export class ConfigModule {}

5️⃣ NestJS가 Async Provider를 처리하는 방식

  • Application Lifecycle에서 비동기 프로바이더의 초기화를 기다립니다.
  • 따라서 await createApp() 이후에는 모든 비동기 작업이 완료된 상태가 됩니다.

🧠 실무 정리

상황 방법

외부 API 키 로딩 Async Provider
DB 연결 초기화 Async Provider
비동기 설정 파일 로딩 Async Provider
Redis, Kafka 연결 Async Provider

🔚 마무리 요약

  • 비동기 초기화가 필요한 의존성은 useFactory+async 조합으로 설정
  • inject 옵션을 통해 다른 Provider도 사용 가능
  • 외부 시스템과 연결하는 모든 경우에 Async Provider를 적극 활용

 

NestJS Async Provider,NestJS useFactory Async,NestJS 비동기 프로바이더,NestJS 설정 모듈,NestJS 외부 API 연동,NestJS DB 연결,NestJS Redis 연결,NestJS Kafka 연결,NestJS 실무 패턴,NestJS 비동기 주입