오늘은 의존성 주입(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