의존성 주입 ( 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)의 장점
❌ 의존성 주입(DI)의 단점
유지보수성과 유연성은 좋아지지만, 설정과 학습이 필요하고 성능이 약간 영향을 받을 수 있다