
변화에 유연한 HTTP 클라이언트 만들기
두줄요약
Nest.js HTTP Module의 외부 라이브러리 종속을 줄이는 WebClientModule 설계를 소개했습니다. 인터페이스·Mock 구현체와 선언적 HTTP 클라이언트로 교체성과 테스트성을 높였습니다.
문제 상황
- Nest.js HTTP Module의 Observable 반환과 AxiosResponse 노출로 인한 비동기 모델·외부 라이브러리 종속
- HTTP 라이브러리 교체 시 서비스 코드와 테스트 코드까지 수정될 수 있는 OCP 위반 우려
구조와 흐름
WebClient인터페이스로 HTTP 메서드, URI, 헤더, 본문 설정과 요청 실행 추상화BodyInserter로 콘텐츠 타입별 요청 본문 생성,ResponseSpec으로 상태 코드·본문·DTO 변환 캡슐화WebClientService가 요청별 클라이언트 인스턴스를 생성하고 Nest.js provider로 구현체 주입
선택 이유
- got 기반 구현체를
WebClient뒤로 숨겨 axios·node-fetch 등 구현 라이브러리 교체 범위 축소 - MockWebClient와 MockWebClientService를 통한 실제 HTTP 호출 없는 순수 유닛 테스트 지원
- 선언적 HTTP 클라이언트로 서비스 로직의 통신 세부 사항 분리 시도
트레이드오프
ResponseSpec의 DTO 변환이 class-transformer에 의존하는 잔여 결합- TypeScript 인터페이스의 런타임 부재로 선언적 클라이언트에서 클래스와 빈 구현부 필요


