HttpClient는 HTTP 호출을 직접 수행하지 않고, 요청을 정규화하고 준비하는 역할을 담당하며, 실제 호출은 HttpBackend로 위임됩니다. 📝
HttpHandler는 요청 처리의 중간 추상화 계층으로, HttpInterceptorHandler가 유일한 구현체이며 인터셉터를 적용하는 역할을 합니다. 🔗
HttpBackend는 HTTP 요청을 실제로 실행하는 추상화 계층으로, HttpXhrBackend (XMLHttpRequest)와 FetchBackend (fetch API) 등 다양한 구현체가 존재합니다. 🚀
provideHttpClient 함수는 HttpClient의 진입점으로, HttpClient 서비스, HttpHandler, 그리고 HttpBackend 구현체를 설정하는 핵심 역할을 합니다. ⚙️
HttpClient는 개발자가 제공한 설정을 HttpHeaders, HttpParams와 같은 내부 데이터 구조로 파싱하여 최종 HttpRequest 인스턴스를 생성하는 요청 정규화 과정을 거칩니다. 📊
인터셉터는 withInterceptors를 통해 등록되고 HTTP_INTERCEPTOR_FNS 멀티 프로바이더로 수집되며, HttpInterceptorHandler에 의해 중복 제거 후 "책임 연쇄(Chain of Responsibility)" 디자인 패턴으로 순차적으로 적용됩니다. ⛓️
HttpXhrBackend는 XmlHttpRequest를 사용하여 HTTP 연결을 열고, 요청을 보낸 후 HttpResponse를 포함한 다양한 HTTP 이벤트를 옵저버블 스트림으로 발행합니다. 🌊
HttpClient는 observe: 'events' 설정을 통해 원시 이벤트 스트림을 제공하거나, 대부분의 경우 HttpResponse만 필터링하고 responseType에 따라 응답 본문을 자동으로 추출하는 등 유연한 응답 처리를 지원합니다. ✨
withRequestsMadeViaParent() 함수는 자식 인젝터의 HttpBackend를 부모 인젝터의 HttpHandler로 교체하여, 자식 및 부모 인터셉터 체인을 모두 거쳐 부모의 HttpBackend를 사용하게 하는 "전략(Strategy)" 디자인 패턴을 구현합니다. 🌳