#17 DI & DIP

Yumin·2025년 2월 24일

Computer Science

목록 보기
17/17

의존성 주입 ( Dependency Injection ) 이란 메인 모듈이 하위 모듈에 직접 의존하지 않고 중간에 의존성 주입자(dependency injector)가 중간에서 이를 조정하여 메인 모듈이 '간접'적으로 의존성을 주입하는 방식

의존한다

A가 B에 의존한다. = B가 변하면 A에 영향을 미치는 관계 = A - > B
를 의미하며 코드로는 이러한 것을 A가 B에 의존한다고 함.

class B {
	public void go() {
    	Debug.Log("B의 go()함수");
	}
}

class A {
	public void go() {
    	new B().go();
	}
}

class Main {
	void main() {
    	new A().go();
	}
}

B의 메서드 네이밍을 수정하면 A도 마찬가지로 수정해야함.
이를 A → B의 관계에서, A는 B에 의존한다고 표현한다


의존관계역전원칙

의존성 주입을 할 때는 의존관계역전원칙(Dependency Inversion Principle)이 적용된다.

이는 2가지의 규칙을 지키는 상태를 말함.

  • 상위 모듈은 하위 모듈에 의존해서는 안 된다. 둘 다 추상화에 의존해야 함.
  • 추상화는 세부사항에 의존해서는 안 된다. 세부 사항은 추상화에 따라 달라져야 함.
public interface IPlayerService
{
    void Move();
}

public class PlayerService : IPlayerService
{
    public void Move()
    {
        LetsMove();
    }
    
        public void LetsMove()
    {
        Debug.Log("Player is moving");
    }
}

public class PlayerPresenter
{
    private readonly IPlayerService _playerService;

    public PlayerPresenter(IPlayerService playerService)
    {
        _playerService = playerService;
    }

    public void MovePlayer()
    {
        _playerService.Move();
    }
}

public class GameManager : MonoBehaviour
{
    private void Start()
    {
        IPlayerService playerService = new PlayerService();
        PlayerPresenter presenter = new PlayerPresenter(playerService);

        presenter.MovePlayer();
    }
}

이 경우는

Project -> IPlayerService
PlayerService -> IPlayerService
이렇게 의존 관계를 가진다.

IPlayerService라는 인터페이스가 변경이 되면
PlayerService 도 변경이 되어야 한다.


장.단점

✅ 의존성 주입(DI)의 장점

  • 유지보수 용이 – 의존성을 외부에서 주입받으므로 코드 수정이 쉬움.
  • 유연성 증가 – 구현체를 쉽게 교체할 수 있어 확장성이 높음.
  • 테스트 용이 – Mock 객체를 활용한 단위 테스트가 쉬워짐.
  • 결합도 감소 – 클래스 간 강한 결합을 줄이고, 인터페이스 기반 설계를 유도함.

❌ 의존성 주입(DI)의 단점

  • 설정 복잡성 – DI 컨테이너(Spring, Unity 등)를 활용하면 설정이 필요함.
  • 초기 학습 비용 – 개념을 이해하고 적용하는 데 시간이 걸릴 수 있음.
  • 코드 가독성 저하 가능 – 의존성이 많아지면 코드 흐름이 직관적이지 않을 수 있음.
  • 실행 속도 영향 – 객체를 직접 생성하는 방식보다 DI 컨테이너를 사용하면 성능 오버헤드가 발생할 수 있음.

유지보수성과 유연성은 좋아지지만, 설정과 학습이 필요하고 성능이 약간 영향을 받을 수 있다

profile
일본 게임회사에서 클라이언트 엔지니어로 활동중

0개의 댓글