본문 바로가기
언어/C, C++

DI(Dependency Injection), DIP(Dependency Inversion Principle)

by minhyeok.lee 2025. 5. 22.
반응형

C++에서의 DI(Dependency Injection)와 DIP(Dependency Inversion Principle)


✅ DIP(의존성 역전 원칙, Dependency Inversion Principle)

📌 정의

상위 모듈(정책 결정)은 하위 모듈(세부 사항)에 의존하면 안 되며, 둘 다 추상(인터페이스)에 의존해야 한다.


🎯 목적

  • 구체적인 구현이 아니라 추상화된 인터페이스에 의존하여 유연한 구조 유지
  • 코드 결합도 감소 → 변경에 강한 코드

📎 C++ 예시

// 상위 모듈은 추상 인터페이스에 의존
class ICommunication {
public:
  virtual void send(const std::string& msg) = 0;
  virtual ~ICommunication() = default;
};

// 하위 모듈은 실제 구현
class UartCommunication : public ICommunication {
public:
  void send(const std::string& msg) override {
    // UART로 전송
  }
};

✅ DI(의존성 주입, Dependency Injection)

📌 정의

객체가 필요한 의존성을 직접 생성하지 않고 외부에서 주입받도록 설계하는 원칙


📦 주입 방식

방법 설명
생성자 주입 가장 일반적. 주입된 객체를 멤버로 저장
세터 주입 생성 이후 필요한 의존성 주입
인터페이스 주입 주입 대상이 외부에서 주입받는 함수 제공

📎 생성자 주입 예시

class Controller {
  ICommunication& comm;
public:
  Controller(ICommunication& c) : comm(c) {}
  void run() { comm.send("Start!"); }
};

🔄 DIP + DI 결합 설계 흐름 (C++ 기준)

class Botbox {
  Controller controller;
public:
  Botbox(ICommunication& comm)
    : controller(comm) {}  // DI
};

Botbox는 구체적인 UART 객체를 모르고도 동작 가능
→ DIP: Controller는 ICommunication에 의존
→ DI: 생성자에서 comm을 주입


✅ 테스트와 확장에 유리한 이유

상황 DIP/DI 적용 시 효과
테스트할 때 Mock 객체 주입 가능
기능 확장 (예: BLE) 새로운 클래스(BLEComm)만 구현하면 됨
모듈 독립성 유지 컴파일 의존도 분리, 빌드 속도 향상

🧪 Mock 예시 (단위 테스트)

class MockComm : public ICommunication {
public:
  std::string lastSent;
  void send(const std::string& msg) override {
    lastSent = msg;  // 로그 저장
  }
};

// 테스트 코드
MockComm mock;
Controller ctrl(mock);
ctrl.run();
assert(mock.lastSent == "Start!");

❗ C++에서 주의할 점

항목 주의 사항
객체 수명 관리 참조 or 스마트 포인터로 수명 관리 필요
생성자 DI 시 순환 의존 조심 A가 B를 필요로 하고 B도 A를 필요로 하면 구조 재검토 필요
동적 바인딩 비용 순수 가상 함수 사용 시 약간의 성능 손해 가능 (무시 수준)

✅ 결론

  • DIP는 "인터페이스에 의존하라"는 설계 원칙
  • DI는 "의존성을 외부에서 주입"하여 DIP를 실현하는 구현 기술
  • 둘을 잘 활용하면 유지보수성, 테스트, 확장성이 모두 향상
반응형

'언어 > C, C++' 카테고리의 다른 글

c, c++ 임베디드 설계 비교  (1) 2025.05.21
[c++] 로봇 시스템 상태 관리 및 로직 설계  (0) 2025.05.20
[c++] 싱글톤 패턴 정리  (0) 2025.05.19
[C++] #define, constexpr, PROGEM 비교  (0) 2024.10.27
[C++] PROGEM  (0) 2024.10.26

댓글