본문 바로가기
개발

[디자인 패턴] DI(Dependency Injection, 의존성 주입)

by TTTGGG 2024. 11. 6.
728x90
반응형
SMALL

의존성 주입(Dependency Injection, DI)은 객체 지향 프로그래밍에서 객체의 의존성을 외부에서 주입받는 디자인 패턴을 의미함

DI는 소프트웨어 모듈 간의 결합도를 낮추고 코드의 재사용성과 테스트 가능성을 높이기 위해 사용됨

DI는 크게 세 가지 요소로 구성됨

 - 의존성(Dependency), 주입(Injection), 제어 역전(Inversion of Control, IoC) 

 

의존성(Dependency)

 - 의존성은 클래스가 다른 클래스의 기능을 필요로 하는 관계를 말함

 - 예를 들어 UserService 클래스가 데이터베이스에서 유저 정보를 가져오는 UserRepository를 사용해야 한다면, UserService는 UserRepository에 의존성을 가지게 됨

 - 클래스 내부에서 다른 클래스의 인스턴스를 직접 생성하는 방식은 결합도가 높아져 클래스 수정이 어렵고 테스트가 복잡해 질 수 있음

 

주입(Injection)

 - 주입이란 클래스가 필요로 하는 의존성을 외부에서 주입해 주는 것을 의미

 - 직접 의존성을 생성하지 않고 외부에서 생성한 객체를 전달 받음으로써 의존성의 결합을 줄이는 방식

 - DI에서는 세 가지 주입 방법이 주로 사용됨

/*
생성자 주입 : 필요한 의존성을 클래스 생성자에서 받는다. 
이는 의존성이 반드시 필요할 때 유용하고, 가장 일반적으로 사용되는 방식이다.
*/
public class UserService
{
    private readonly UserRepository _userRepository;

    public UserService(UserRepository userRepository)
    {
        _userRepository = userRepository;
    }
}

/*
세터 주입 : 생성 후 필요한 의존성을 설정자 메서드로 전달 받는다. 
이는 의존성이 선택적일 때 유용하다.
*/
public class UserService
{
    private UserRepository _userRepository;

    public void SetUserRepository(UserRepository userRepository)
    {
        _userRepository = userRepository;
    }
}

/*
인터페이스 주입 : 클래스가 특정 인터페이스를 구현하여 의존성을 주이받는다. 
인터페이스를 통해 의존성을 전달하므로 DI 컨테이너나 프레임워크에서 활용되기도 한다.
*/
public interface IUserService
{
    void SetRepository(UserRepository userRepository);
}

 

제어 역전(Inversion of Control, IoC) 

 - DI의 핵심 개념 중 하나로, 객체의 생성과 생명주기를 관리하는 책임이 객체 자체가 아닌 외부의 다른 구성요소(주로 IoC 컨테이너)에 있다는 의미

 - IoC 컨테이너는 객체를 생성하고 주입하는 작업을 자동으로 처리해 주기 때문에 클래스는 자신이 필요한 객체를 스스로 관리할 필요가 없음

 - 이로 인해 모듈 간 결합도가 낮아지고 코드의 유연성이 높아짐

 

DI와 IoC 컨테이너의 역할

 - IoC 컨테이너는 애플리케이션의 모든 의존성을 관리함. 

 - 대표적인 IoC 컨테이너로는 .NET의  Microsoft.Extensions.DependencyInjection, Java의 Spring Framework 등

 - 컨테이너는 의존성 주입 관리, 객체 생명주기 관리, 결합도 관리 역할을 수행 

 

DI의 장점

 - 결합도 감소

 - 재사용성 증가

 - 테스트 용이성

 - 코드 가독성 및 유지보수성 향상

 

DI 사용 시 주의사항

 - 필요 이상으로 남발하지 않기 : 너무 많은 의존성을 주입받으면 코드가 복잡해지고 관리가 어려워질 수 있음

 - 정확한 IoC 컨테이너 설정 : DI 컨테이너 설정이 잘못되면 의존성 주입 과정에서 오류가 발생할 수 있음

 - 순환 의존성(Circular Dependency) 피하기 : 서로가 서로를 의존하는 경우 DI가 순환 참조 문제를 일으킬 수 있음 

 

728x90
반응형
LIST