C#에서 HTTP 요청을 효율적으로 관리하기 위해 HttpClientFactory를 사용하는 것이 중요합니다. 직접 HttpClient 인스턴스를 생성하면 소켓 고갈 문제 등이 발생할 수 있어, 이를 방지하는 방법으로 HttpClientFactory가 권장됩니다.
1. HttpClientFactory란?
HttpClientFactory는 .NET Core 2.1부터 제공되는 기능으로, HttpClient 객체를 생성하고 재사용을 관리합니다. 이를 통해 소켓 누수 문제와 인스턴스 관리가 간편해집니다.
2. 기본 사용법
먼저 DI 컨테이너에 HttpClientFactory를 등록합니다.
public void ConfigureServices(IServiceCollection services)
{
services.AddHttpClient();
}
다음으로 생성된 HttpClient를 주입 받아 사용합니다.
public class MyService
{
private readonly HttpClient _httpClient;
public MyService(HttpClient httpClient)
{
_httpClient = httpClient;
}
public async Task<string> GetDataAsync(string url)
{
var response = await _httpClient.GetAsync(url);
response.EnsureSuccessStatusCode();
return await response.Content.ReadAsStringAsync();
}
}
3. 네임드 클라이언트 사용
네임드 클라이언트를 사용하면 특정 설정을 가진 HttpClient를 만들 수 있습니다.
services.AddHttpClient("github", c =>
{
c.BaseAddress = new Uri("https://api.github.com/");
c.DefaultRequestHeaders.Add("Accept", "application/vnd.github.v3+json");
c.DefaultRequestHeaders.Add("User-Agent", "HttpClientFactory-Sample");
});
주입 시에는 다음과 같이 합니다.
public class GitHubService
{
private readonly HttpClient _httpClient;
public GitHubService(IHttpClientFactory httpClientFactory)
{
_httpClient = httpClientFactory.CreateClient("github");
}
public async Task<string> GetReposAsync(string user)
{
var response = await _httpClient.GetAsync($"users/{user}/repos");
response.EnsureSuccessStatusCode();
return await response.Content.ReadAsStringAsync();
}
}
4. 베스트 프랙티스
- HttpClient 인스턴스를 직접 생성하지 말고, 반드시 HttpClientFactory를 통해 생성합니다.
- 주입 받은 HttpClient는 재사용하며, Dispose하지 않습니다.
- 네임드 클라이언트나 Typed 클라이언트를 사용해 관련 설정을 묶어 관리합니다.
- 정책 핸들러(예: Polly)와 함께 사용해 재시도, 회로 차단 등을 구현할 수 있습니다.
HttpClientFactory를 적절히 활용하면 네트워크 리소스 관리가 쉬워지고 코드가 깔끔해집니다. 위 예제를 참고해 프로젝트에 적용해보세요.
'C#' 카테고리의 다른 글
| C# System.Threading.Channels로 비동기 데이터 파이프라인 구성 (0) | 2026.05.14 |
|---|---|
| C# Polyglot 애플리케이션: IronPython과의 상호운용 (0) | 2026.05.14 |
| C# 타입 변환 연산자와 Custom TypeConverter 정의하기 (0) | 2026.05.13 |
| C# 중첩 스위치 패턴과 복잡한 조건 매칭 구현 (0) | 2026.05.12 |
| C# 값 튜플(ValueTuple) vs Tuple 성능 비교 (0) | 2026.05.12 |