HTTP module

HTTP module

AxiosλŠ” μˆ˜μ‹­ 개의 μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ—μ„œ 널리 μ‚¬μš©λ˜λŠ” ν’λΆ€ν•œ κΈ°λŠ₯의 HTTP ν΄λΌμ΄μ–ΈνŠΈμž…λ‹ˆλ‹€. κ·Έλ ‡κΈ° λ•Œλ¬Έμ— NestλŠ” 이 νŒ¨ν‚€μ§€λ₯Ό κ°μ‹Έμ„œ 기본적으둜 λ‚΄μž₯된 HttpModule둜 κ³΅κ°œν•©λ‹ˆλ‹€. HttpModule은 λ‹¨μˆœνžˆ HTTP μš”μ²­μ„ μˆ˜ν–‰ν•˜κΈ° μœ„ν•΄ Axios 기반 λ©”μ†Œλ“œλ₯Ό λ…ΈμΆœν•˜λŠ” HttpServiceλ₯Ό 내보내고 리턴 μœ ν˜•μ„ Observables둜 λ³€ν™˜ν•©λ‹ˆλ‹€.

HttpServiceλ₯Ό μ‚¬μš©ν•˜κΈ° μœ„ν•΄μ„œλŠ” HttpModule을 κ°€μ Έμ™€μ•Όν•©λ‹ˆλ‹€.

@Module({
  imports: [HttpModule],
  providers: [CatsService],
})
export class CatsModule {}

info 힌트 HttpModule은 @nestjs/common νŒ¨ν‚€μ§€μ—μ„œ κ³΅κ°œλ©λ‹ˆλ‹€.

그런 λ‹€μŒ HttpServiceλ₯Ό μ‚½μž…ν•  수 μžˆμŠ΅λ‹ˆλ‹€. 이 ν΄λž˜μŠ€λŠ” @nestjs/common νŒ¨ν‚€μ§€μ—μ„œ μ‰½κ²Œ μ•‘μ„ΈμŠ€ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

@@filename()
@Injectable()
export class CatsService {
  constructor(private readonly httpService: HttpService) {}

  findAll(): Observable<AxiosResponse<Cat[]>> {
    return this.httpService.get('http://localhost:3000/cats');
  }
}
@@switch
@Injectable()
@Dependencies(HttpService)
export class CatsService {
  constructor(httpService) {
    this.httpService = httpService;
  }

  findAll() {
    return this.httpService.get('http://localhost:3000/cats');
  }
}

λͺ¨λ“  λ©”μ†Œλ“œλŠ” Observable 였브젝트둜 λž©ν•‘λœ AxiosResponseλ₯Ό λ¦¬ν„΄ν•©λ‹ˆλ‹€.

Configuration

AxiosλŠ” HttpServiceλ₯Ό λ”μš± κ°•λ ₯ν•˜κ²Œ λ§Œλ“€κΈ° μœ„ν•΄ ν™œμš©ν•  수 μžˆλŠ” λ§Žμ€ μ˜΅μ…˜μ„ μ œκ³΅ν•©λ‹ˆλ‹€. 여기에 λŒ€ν•΄ μžμ„Ένžˆ μ•Œμ•„λ³΄μ‹­μ‹œμ˜€. κΈ°λ³Έ 라이브러리 μΈμŠ€ν„΄μŠ€λ₯Ό κ΅¬μ„±ν•˜λ €λ©΄ HttpModule의 register()λ©”μ†Œλ“œλ₯Ό μ‚¬μš©ν•˜μ‹­μ‹œμ˜€.

@Module({
  imports: [
    HttpModule.register({
      timeout: 5000,
      maxRedirects: 5,
    }),
  ],
  providers: [CatsService],
})
export class CatsModule {}

μ΄λŸ¬ν•œ λͺ¨λ“  속성은 axios μƒμ„±μžλ‘œ μ „λ‹¬λ©λ‹ˆλ‹€.

Async configuration

λͺ¨λ“ˆ μ˜΅μ…˜μ„ 미리 μ „λ‹¬ν•˜λŠ” λŒ€μ‹  λΉ„λ™κΈ°μ‹μœΌλ‘œ μ „λ‹¬ν•˜λ €λŠ” κ²½μš°κ°€ μ’…μ’… μžˆμŠ΅λ‹ˆλ‹€. 이 경우, 비동기 데이터λ₯Ό μ²˜λ¦¬ν•˜λŠ” λ‹€μ–‘ν•œ 방법을 μ œκ³΅ν•˜λŠ” registerAsync() λ©”μ†Œλ“œλ₯Ό μ‚¬μš©ν•˜μ‹­μ‹œμ˜€.

κ°€λŠ₯ν•œ 첫 번째 방법은 νŒ©ν† λ¦¬ κΈ°λŠ₯을 μ‚¬μš©ν•˜λŠ” κ²ƒμž…λ‹ˆλ‹€.

HttpModule.registerAsync({
  useFactory: () => ({
    timeout: 5000,
    maxRedirects: 5,
  }),
});

λΆ„λͺ…νžˆ, 우리 νŒ©ν† λ¦¬λŠ” λ‹€λ₯Έ λͺ¨λ“  κ²ƒμ²˜λŸΌ ν–‰λ™ν•©λ‹ˆλ‹€ ( async일 μˆ˜λ„ 있고 inject을 톡해 μ˜μ‘΄μ„±μ„ μ£Όμž…ν•  μˆ˜λ„ μžˆμŠ΅λ‹ˆλ‹€).

HttpModule.registerAsync({
  imports: [ConfigModule],
  useFactory: async (configService: ConfigService) => ({
    timeout: configService.getString('HTTP_TIMEOUT'),
    maxRedirects: configService.getString('HTTP_MAX_REDIRECTS'),
  }),
  inject: [ConfigService],
});

λ˜λŠ” νŒ©ν† λ¦¬ λŒ€μ‹  클래슀λ₯Ό μ‚¬μš©ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

HttpModule.registerAsync({
  useClass: HttpConfigService,
});

μœ„μ˜ ꡬ성은 HttpModuleλ‚΄μ—μ„œ HttpConfigServiceλ₯Ό μΈμŠ€ν„΄μŠ€ν™” ν•˜κ³  μ˜΅μ…˜ 객체λ₯Ό λ§Œλ“œλŠ” 데 ν™œμš©ν•©λ‹ˆλ‹€. HttpConfigServiceλŠ” HttpModuleOptionsFactory μΈν„°νŽ˜μ΄μŠ€λ₯Ό κ΅¬ν˜„ν•΄μ•Όν•©λ‹ˆλ‹€.

@Injectable()
class HttpConfigService implements HttpModuleOptionsFactory {
  createHttpOptions(): HttpModuleOptions {
    return {
      timeout: 5000,
      maxRedirects: 5,
    };
  }
}

HttpModule 내뢀에 HttpConfigServiceκ°€ μƒμ„±λ˜λŠ” 것을 λ°©μ§€ν•˜κ³  λ‹€λ₯Έ λͺ¨λ“ˆμ—μ„œ κ°€μ Έμ˜¨ κ³΅κΈ‰μžλ₯Ό μ‚¬μš©ν•˜λ €λ©΄ useExisting ꡬ문을 μ‚¬μš©ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

HttpModule.registerAsync({
  imports: [ConfigModule],
  useExisting: ConfigService,
});

HttpModule은 κ°€μ Έμ˜¨ λͺ¨λ“ˆμ„ κ²€μƒ‰ν•˜μ—¬ 자체적으둜 μΈμŠ€ν„΄μŠ€ν™”ν•˜λŠ” λŒ€μ‹  이미 μž‘μ„±λœ ConfigServiceλ₯Ό μž¬μ‚¬μš©ν•©λ‹ˆλ‹€.

Last updated

Was this helpful?