카테고리 없음

의존성 주입(DI/ Dependency Injection)에 대해 알아보자(feat : DIP)

근본넘치는개발자 2024. 11. 8. 23:53

오늘은 의존성 주입(DI/ Dependency Injection)에 대해 알아보고자 합니다.

 

2024.10.31 - [디자인 패턴] - 디자인 패턴에 대해 알아보자#4 - 팩토리 패턴 (Factory Pattern) (feat : 팩토리 메소드, 추상 팩토리 패턴)

 

이전에 팩토리 패턴에 대해 글을 작성한 적이 있었는데요,

추가로 공부 하다보니 의존성 주입(DI/ Dependency Injection)을 자주 사용한다고 하여

DI라는 게 정확히 뭔지 찾아봤고 그 내용을 정리했습니다.

 

DI와 DIP를 엮어서 많이들 소개하던데

이전에 작성했던 Solid 원칙을 보고 오신다면 더 이해가 쉬울거로 생각합니다.

2024.10.07 - [디자인 패턴] - 디자인 패턴에 대해 알아보자 #1 Solid 원칙

 

의존성 ? 

한 클래스가 다른 클래스를 사용하는 관계를 말합니다.

A가 B를 사용한다면 이를 A가 B에 의존한다고 합니다.

 

DI를 사용하면 결합도를 감소시킬 수 있고,

경우에 따라 DIP를 준수하는 데도 도움을 줍니다.

 

아래는 이전 팩토리 패턴에 DI를 적용하는 코드입니다.

예제

// Game 클래스가 CharacterFactory에 직접 의존
public class Game 
{
    public void Run() 
    {
        CharacterFactory factory = new CharacterFactory();  // 직접 생성
        
        ICharacter warrior = factory.CreateCharacter("warrior");
        ICharacter archer = factory.CreateCharacter("archer");
        ICharacter mage = factory.CreateCharacter("mage");
        
        // ...
    }
}

//DI 적용한 코드

// 1. 팩토리 인터페이스 정의
public interface ICharacterFactory 
{
    ICharacter CreateCharacter(string type);
}

// 2. 기존 팩토리를 인터페이스 구현체로 변경
public class CharacterFactory : ICharacterFactory 
{
    public ICharacter CreateCharacter(string type) 
    {
        switch (type.ToLower()) 
        {
            case "warrior": return new Warrior();
            case "archer": return new Archer();
            case "mage": return new Mage();
            default: throw new ArgumentException("Unknown character type");
        }
    }
}

// 3. Game 클래스가 팩토리를 주입받도록 수정
public class Game 
{
    private readonly ICharacterFactory characterFactory;  // 의존성을 주입받을 필드

    // 생성자를 통한 의존성 주입
    public Game(ICharacterFactory factory) 
    {
        this.characterFactory = factory;
    }

    public void Run() 
    {
        // 주입받은 팩토리 사용
        ICharacter warrior = characterFactory.CreateCharacter("warrior");
        ICharacter archer = characterFactory.CreateCharacter("archer");
        ICharacter mage = characterFactory.CreateCharacter("mage");
        
        // ...
    }
}

 

 

여기서는 생성자를 활용하여 구현했지만

찾아보니 생성하면서 직접 주입, 필드 주입, 메서드로 주입하는 방법 등

다양하게 구현하더군요.

상황에 맞게 사용하시면 될 거 같습니다.

 

(유니티에서는 프로퍼티를 활용하여 주로 구현하는 듯합니다. / MonoBehaviour 상속 관련)

마무리

 

오늘은 의존성 주입(DI/ Dependency Injection)에 대해 

간단하게 정리해 봤습니다.

 

다른 건 몰라도 두 번째 영상은 한번 보셨으면 좋겠네요.

 

팩토리 패턴 말고 MVC패턴에서 DI를 적용하는 내용을 다룹니다.

 

유니티 DI라고 검색해서 두번째에 떴는데

제목이 '유니티에서 DI 왜 써요' 라고 하셔서 안 볼 수가 없었습니다. ㅋ;;

실제 경험을 토대로 장점과 사용 이유에 대해 자세하게 설명해 주셔서

이해하는 데 큰 도움이 되었던 거 같습니다.

 

 

참고한 (혹은 하면 좋을) 자료 

https://youtu.be/WsnkyHVu-Gw?si=FTo5bQ5duWx9-xog

 

https://youtu.be/f_QjRrUvzpk?si=bl9R9qHT3C52pPjp

 

https://youtu.be/1vdeIL2iCcM?si=JKGSXUPU8rA6cO6V