* 이 포스팅은 쿠팡 파트너스 활동의 일환으로 이에 따른 일정액의 수수료를 제공받습니다.
좋은 방향입니다! HttpClientFactory를 사용하면 MemberService 같은 서비스 클래스에서 HttpClient를 효율적으로 관리할 수 있고, 재사용성 및 테스트 용이성도 향상됩니다. 그리고 401 등의 공통 예외도 DelegatingHandler를 통해 중앙에서 관리 가능하죠.
아래는 MemberService에서 HttpClientFactory를 사용하는 구조 + 공통 에러 핸들링 포함 예시입니다.
✅ 1. CustomHttpMessageHandler 작성 (공통 에러 처리)
csharp
복사편집
public class CustomHttpMessageHandler : DelegatingHandler { private readonly NavigationManager _navigationManager; public CustomHttpMessageHandler(NavigationManager navigationManager) { _navigationManager = navigationManager; } protected override async Task<HttpResponseMessage> SendAsync(HttpRequestMessage request, CancellationToken cancellationToken) { var response = await base.SendAsync(request, cancellationToken); if (response.StatusCode == HttpStatusCode.Unauthorized) { _navigationManager.NavigateTo("/login", true); } // 로그 용도 if (!response.IsSuccessStatusCode) { Console.WriteLine($"[HTTP Error] {response.StatusCode}: {request.RequestUri}"); } return response; } }
✅ 2. Program.cs 구성
csharp
복사편집
builder.Services.AddScoped<CustomHttpMessageHandler>(); builder.Services.AddHttpClient("MemberApiClient", client => { client.BaseAddress = new Uri("https://api.example.com/"); }) .AddHttpMessageHandler<CustomHttpMessageHandler>(); builder.Services.AddScoped<IMemberService, MemberService>();
✅ 3. IMemberService 및 MemberService 구성
IMemberService.cs
csharp
복사편집
public interface IMemberService { Task<MemberInfo?> GetMemberAsync(string id); }
MemberService.cs
csharp
복사편집
public class MemberService : IMemberService { private readonly HttpClient _httpClient; public MemberService(IHttpClientFactory httpClientFactory) { _httpClient = httpClientFactory.CreateClient("MemberApiClient"); } public async Task<MemberInfo?> GetMemberAsync(string id) { var response = await _httpClient.GetAsync($"members/{id}"); if (response.IsSuccessStatusCode) { var json = await response.Content.ReadAsStringAsync(); return JsonSerializer.Deserialize<MemberInfo>(json, new JsonSerializerOptions { PropertyNameCaseInsensitive = true }); } return null; } }
✅ 4. 사용 예시 (예: Blazor 페이지)
razor
복사편집
@inject IMemberService MemberService <h3>회원 정보</h3> @if (_member != null) { <p>이름: @_member.Name</p> } else { <p>로딩 중...</p> } @code { private MemberInfo? _member; protected override async Task OnInitializedAsync() { _member = await MemberService.GetMemberAsync("user123"); } }
🔧 요약
- HttpClientFactory를 MemberService 안에서 사용하여 DI 및 테스트 용이성 확보.
- 공통 에러 처리는 DelegatingHandler(CustomHttpMessageHandler)로 처리.
- Blazor 환경이라면 NavigationManager로 인증 오류 시 자동 이동도 가능.
728x90
댓글