TypeScript 에러 해결: http-proxy 모듈 사용 시 ProxyServer 임포트 문제

문제 상황

NestJS 프로젝트에서 http-proxy 모듈을 사용하는 중 다음과 같은 TypeScript 에러가 발생했습니다:

src/eap/upload/upload.controller.ts:10:29 - error TS2305: Module '"http-proxy"' has no exported member 'ProxyServer'.

10 import { createProxyServer, ProxyServer } from 'http-proxy';
                             ~~~~~~~~~~~

원인 분석

node_modules/http-proxy/lib/http-proxy.js 파일을 확인한 결과, ProxyServer는 named export(명명된 내보내기)로 제공되지 않고 있습니다. 대신, 모듈 자체가 ProxyServer 클래스로 export되고 있습니다.

// node_modules/http-proxy/lib/http-proxy.js 파일 내용
var ProxyServer = require('./http-proxy/index.js').Server;

// ...

ProxyServer.createProxyServer = createProxyServer;
ProxyServer.createServer      = createProxyServer;
ProxyServer.createProxy       = createProxyServer;

/**
 * Export the proxy "Server" as the main export.
 */
module.exports = ProxyServer;

해결 방법

방법 1: 모듈 전체 임포트 사용

import * as httpProxy from 'http-proxy';

// 클래스 정의
private readonly proxy: httpProxy;

constructor(...) {
  // ...
  this.proxy = httpProxy.createProxyServer({
    // ...
  });
}

방법 2: 타입 정의 분리하기

import { createProxyServer } from 'http-proxy';
import * as httpProxy from 'http-proxy';

// 타입 정의
private readonly proxy: httpProxy;

constructor(...) {
  // ...
  this.proxy = createProxyServer({
    // ...
  });
}

방법 3: 타입 정의 패키지 설치하기

@types/http-proxy 패키지를 설치하면 타입 정의가 추가될 수 있습니다:

npm install --save-dev @types/http-proxy

기존 코드 수정 예시

// 수정 전 (에러 발생)
import { createProxyServer, ProxyServer } from 'http-proxy';

// 수정 후 (정상 동작)
import * as httpProxy from 'http-proxy';
import { createProxyServer } from 'http-proxy';

// 타입 선언 부분
private readonly proxy: httpProxy;

NestJS 컨트롤러의 전체 수정된 코드는 기존 기능을 그대로 유지하면서 TypeScript 에러를 해결합니다.

참고사항