🧠 Dependency Injection이란?

의존성 주입(Dependency Injection)
객체(컴포넌트)가 필요한 서비스나 객체를 직접 생성하지 않고,
외부에서 주입받도록 만드는 설계 방식입니다.

✅ 왜 필요할까?

  • 코드의 결합도(의존도)를 줄이기 위해
  • 유지보수테스트가 쉬워짐
  • 재사용성, 확장성이 좋아짐

🏗️ 기본 사용 방법

1. 서비스 클래스 작성

public class Food
{
    public string Name { get; set; }
    public int Price { get; set; }
}

public interface IFoodService
{
    IEnumerable<Food> GetFoods();
}

public class FoodService : IFoodService
{
    public IEnumerable<Food> GetFoods()
    {
        return new List<Food>
        {
            new Food() { Name = "Bibimbap", Price = 7000 },
            new Food() { Name = "Kimbap", Price = 3000 },
            new Food() { Name = "Bossam", Price = 9000 }
        };
    }
}

2. Program.cs에서 서비스 등록

builder.Services.AddSingleton<IFoodService, FoodService>();
  • 이 코드는 IFoodService 인터페이스를 FoodService로 매핑해서 DI로 사용할 수 있게 설정한 것

3. Razor 컴포넌트에서 서비스 주입

@inject IFoodService foodService

<div>
    @foreach (var food in foodService.GetFoods())
    {
        <div>@food.Name</div>
        <div>@food.Price</div>
    }
</div>

🔁 DI로 연결되는 구조 이해하기

예제: 계산 서비스에서 음식 서비스 사용하기

public class PaymentService
{
    private readonly IFoodService _foodService;

    public PaymentService(IFoodService foodService)
    {
        _foodService = foodService;
    }

    public int GetTotalPrice()
    {
        return _foodService.GetFoods().Sum(f => f.Price);
    }
}

Program.cs에 등록

builder.Services.AddSingleton<PaymentService>();

⚙️ 서비스 생명주기 (Service Lifetime)

타입특징 설명
Singleton앱 실행 시 1번만 생성, 전역에서 공유됨
Scoped요청당 1번 생성 (사용자 1명당 1개)
Transient요청마다 매번 새로 생성

예제

builder.Services.AddSingleton<SingletonService>();
builder.Services.AddScoped<ScopedService>();
builder.Services.AddTransient<TransientService>();

Razor에서 주입 후 확인

@inject SingletonService singleton
@inject ScopedService scoped
@inject TransientService transient

<p>Singleton ID: @singleton.ID</p>
<p>Scoped ID: @scoped.ID</p>
<p>Transient ID: @transient.ID</p>
  • 새로고침해도 Singleton은 ID가 유지됨
  • Scoped, Transient는 새로고침하면 ID가 바뀜 (Blazor Server 기준)

profile
李家네_공부방

0개의 댓글