지노윈 2019. 11. 10. 22:24
반응형

DI는 Dependency Injection(의존성 주입)입니다.
어떤 클래스가 의존하는 클래스의 인터페이스를 도입하여 의존성을 독립화하고 런타임에 의존 클래스를 결정할 수 있게끔 하는 기법입니다. 의존 클래스를 런타임에 적절한 것으로 "삽입" 한다고 해서 의존성 주입이라 합니다.
예) 전등의 전구 슬롯, 장난감의 건전지 슬롯 등등...

 

ILogger를 ConsoleLogger에 연결한다. ILogger를 요청하면 ConsoleLogger를 전달한다.
가장 큰 장점은 di::bind<ILogger>().to<ConsoleLogger>()코드에서 ConsoleLogger를 다른 클래스로 바꾸어 주면 injector를 사용하여 생성한 모든 Car의 Logger를 바꿀 수 있다는 것입니다.

#include <iostream>
#include <boost/di.hpp>
 
using namespace std;
 
namespace di = boost::di;
 
struct ILogger
{
 virtual void Log(const string& s) = 0;
};
 
struct ConsoleLogger : ILogger
{
 void Log(const string& s) override
 {
  cout << "LOG: " << s.c_str() << endl;
 }
};
 
struct Car
{
 shared_ptr<ILogger> mLogger;
 
 Car(shared_ptr<ILogger> logger) : mLogger(logger)
 {
  mLogger->Log("making a car");
 }
};
 
int main()
{
 auto injector = di::make_injector(
  di::bind<ILogger>().to<ConsoleLogger>()
 );
  
 auto car = injector.create<Car>();
}

injector.create<Car>()를 호출하여 car, car2, car3... 와 같이 생성 되었다면 di::bind<ILogger>().to<ConsoleLogger>()에서 ConsoleLogger를 CloudLogger로 바꾸어 주면 car, car2, car3의 연결이 한번에 모두 바뀌게됩니다.

 auto injector = di::make_injector(
  di::bind<ILogger>().to<CloudLogger>()
 );
  
 auto car = injector.create<Car>();
 auto car2 = injector.create<Car>();
 auto car3 = injector.create<Car>();