본문 바로가기
.NET

.NET 8의 HostApplicationBuilder?

by leo21c 2026. 6. 16.

.NET 8의 HostApplicationBuilder는 기존 WPF 개발자분들이 주로 사용하던 방식(과거 App.xaml.cs에서 수동으로 객체를 생성하거나 별도의 IoC 컨테이너를 붙이던 방식)을 완전히 뒤바꾼, 현대 .NET의 핵심 프레임워크 기능입니다.

이 개념을 기존 C# WPF 경험과 연결하여 알기 쉽게 설명해 드리겠습니다.

## 1. HostApplicationBuilder란 무엇인가요?

HostApplicationBuilder는 애플리케이션이 실행되는 데 필요한 '인프라(환경)를 한곳에서 간편하게 빌드하고 관리해 주는 도구'입니다.

과거 .NET Core 시절에는 웹용(WebHostBuilder)과 일반 콘솔/서비스용(HostBuilder)이 나누어져 있어 코드가 다소 복잡했습니다. .NET 7/8에 이르러 이 프로세스를 완전히 단일화하고 성능을 대폭 개선하여 내놓은 것이 바로 HostApplicationBuilder입니다.

이 빌더를 사용하면 프로그램 시작 시점에 다음과 같은 핵심 기능들을 단 몇 줄로 통합 설정할 수 있습니다.

  • 의존성 주입 (Dependency Injection, DI): 객체의 생명주기 관리 및 결합도 낮춤
  • 설정 관리 (Configuration): appsettings.json이나 환경 변수 로드
  • 로그 (Logging): 콘솔, 파일, 이벤트 로그 등 일관된 로깅 시스템 구축
  • 호스팅 서비스 (Hosted Services): 백그라운드에서 계속 실행될 작업(예: BLE 통신 감시 등) 정의

## 2. 왜 사용해야 할까요? 

WPF나 MAUI 환경에서 이를 도입하면 다음과 같은 강력한 이점이 있습니다. BTLE 통신 제어 소프트웨어를 예를 들어 설명 한다면,

  • 구조적 아키텍처 (MVVM) 구현의 극대화: ViewModel, Service(통신 모듈, DB 모듈) 등을 DI 컨테이너에 등록하여, 생성자 주입(Constructor Injection) 방식으로 깔끔하게 결합할 수 있습니다.
  • 백그라운드 통신 처리 용이: 통신 제어 소프트웨어는 UI 스레드와 별개로 '장치 연결 상태를 감시하거나 데이터를 수집하는 백그라운드 스레드'가 필수적입니다. IHostedService를 구현하여 등록하면 호스트가 시작될 때 백그라운드 루프를 깔끔하게 띄워줍니다.
  • 코드 재사용성: 이 방식으로 비즈니스 로직(Service 계층)을 짜두면, WPF 프로그램이든 .NET MAUI 모바일 앱이든 동일한 DI 구문을 그대로 재사용할 수 있습니다.

## 3. 코드 비교로 보는 차이점

기존 WPF 방식과 .NET 8 HostApplicationBuilder 방식을 비교해 보면 구조적 차이가 명확히 보입니다.

### 기존 WPF 방식 (의존성 수동 관리)

// App.xaml.cs
protected override void OnStartup(StartupEventArgs e)
{
    base.OnStartup(e);

    // 수동으로 매번 인스턴스를 생성하고 조립해야 함
    var bleService = new BluetoothService(); 
    var mainViewModel = new MainViewModel(bleService);
    var mainWindow = new MainWindow(mainViewModel);

    mainWindow.Show();
}

### .NET 8 HostApplicationBuilder 방식

// App.xaml.cs
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Hosting;

protected override async void OnStartup(StartupEventArgs e)
{
    base.OnStartup(e);

    // 1. 빌더 생성 (.NET 8 스타일)
    HostApplicationBuilder builder = Host.CreateApplicationBuilder(e.Args);

    // 2. 서비스/뷰모델/윈도우 등록 (DI 컨테이너)
    builder.Services.AddSingleton<IBluetoothService, BluetoothService>(); // 싱글톤으로 관리
    builder.Services.AddTransient<MainViewModel>();                      // 필요할 때마다 생성
    builder.Services.AddTransient<MainWindow>();

    // 3. 호스트 빌드
    IHost host = builder.Build();

    // 4. 애플리케이션 시작 및 메인 윈도우 표시
    await host.StartAsync();
    
    var mainWindow = host.Services.GetRequiredService<MainWindow>();
    mainWindow.Show();
}

## 4. 핵심 구성 요소 요약

HostApplicationBuilder를 선언하면 내부에 크게 3가지 속성을 핵심적으로 다루게 됩니다.

  1. builder.Services (IServiceCollection)
    •    애플리케이션에 사용할 클래스들을 등록하는 곳입니다.
    •    AddSingleton(프로그램 전체에서 딱 하나만 유지), AddTransient(요청할 때마다 새로 생성) 등을 지정합니다.
  2. builder.Configuration (ConfigurationManager)
    •    appsettings.json 설정 파일이나 환경 변수를 읽어옵니다.
    •    예: string comport = builder.Configuration["SerialSettings:Port"]; 형태로 쉽게 연동됩니다.
  3. builder.Logging (ILoggingBuilder)
    •    과거에 Log4Net이나 NLog를 복잡하게 초기화하던 것을 표준화해 줍니다.
    •    콘솔, 파일 등 원하는 목적지를 코드 한 줄로 추가할 수 있습니다.
LIST