의존성이란?? DI

W·2024년 5월 25일

용어정리

목록 보기
6/6

의존성이란..

예를들어, 제가 카페를 차렸다고 가정해보겠습니다.
가게 오픈에 앞서 빵을 진열해 놓으려고 합니다.
저희 카페에 진열되어있는 빵은 파리바게트 빵입니다. 코드는 아래와 같습니다.

void main() {
  final mycafe = MyCafe();
  mycafe.displayBread();
}

// 나의 빵집
class MyCafe {
  ParisBaguette parisbaguette = ParisBaguette();
  
  // 빵 진열하기 메서드
  void displayBread() {
    int breadCount = parisbaguette.giveBreadCount();
    String shopname = parisbaguette.name;
    
    print('$shopname에서 공수해온 빵 $breadCount개 진열 완료!!');
  }
}

// 파리바게트
class ParisBaguette {
  String name = '파리바게트';  
  int giveBreadCount() {
    return 10;
  }
}

결과

저희 카페는 파리바게트가 없으면 빵을 진열할 수가 없습니다. ㅜㅜ
MyCafe 클래스의 displayBread 메서드는 ParisBaguette 클래스가 없으면 실행 할 수 없습니다.
MyCafe 클래스는 ParisBaguette 클래스에 의존!! 하고 있습니다.

의존성 주입..

그렇다면 의존성 주입이란 말은 왜 생겨났을까요?

MyCafe를 차린 저는 이제 빵집을 뚜레주르로 바꾸려고 한답니다. (같은 가격에 2개를 더 얹어준다네요!? 속닥속닥)
displayBread 메서드는 변경할게 없고, 내부의 빵집만 바꿔주면 되겠죠?
근데 바꾸려고 보니, 바꿔야할게 많아요…

void main() {
  final mycafe = MyCafe();
  mycafe.displayBread();
}

// 나의 카페
class MyCafe {
  // ParisBagutte를 TouslesJours로 변경해야 해!
  ParisBaguette parisbaguette = ParisBaguette();
  //  변경 후 
  TouslesJours touslesjours = TouslesJours();
  
  // 빵 진열하기 메서드
  void displayBread() {
	 // giveBreadCount → sendBreadCount 로 변경해야 해!
    int breadCount = parisbaguette.giveBreadCount();
	//  변경 후 
    int breadCount = touslesjours.sendBreadCount();
    
    // name → shopName 로 변경해야 해!
    String shopname = parisbaguette.name;
	//  변경 후 
    String shopname = touslesjours.shopName;
    
    print('$shopname에서 공수해온 빵 $breadCount개 진열 완료!!');
  }
}

// 뚜레주르 
class TouslesJours {
	String shopName = '뚜레주르';
	int sendBreadCount() {
    return 12;
  }
}

결과

이렇게 하나하나 열심히 바꿔주고 나니까 너무 힘들어요.
나중에 빵집이 또 변경되면 또 바꿔줘야된다는 생각에 괴로워요.
그래서 빵집에 대한 정보를 외부에서 넣어주면(주입) 되겠다 생각하게 되었어요.

우선 빵을 진열할때 필요한 정보들을 통일 시켜서 정리해 보았어요.
print('$shopname에서 공수해온 빵 $breadCount개 진열 완료!!');

이렇게 print를 실행시키기위해서는 빵집 명과 가져온 빵개수가 필요해요.

// 빵집들 추상 클래스
abstract class BreadShop {
	// 빵집 명
  String get breadShopName;
  // 가져온 빵 개수 파악 메서드.
  int giveBreadCount();
}

각각의 빵집에 해당 규칙을 적용해 줍니다.

// 파리바게트 
class ParisBaguette extends BreadShop {
	String breadShopName = '파리바게트';
	int giveBreadCount() {
    return 10;
  }
}

// 뚜레주르 
class TouslesJours extends BreadShop {
	String breadShopName = '뚜레주르';
	int giveBreadCount() {
    return 12;
  }
}

이제 의존성 주입을 해볼게요.

void main() {
	// MyCafe mycafe = MyCafe(빵집을 골라서 넣어줄수 있어요.);
	// ex) 파리바게트
	MyCafe mycafe = MyCafe(ParisBaguette());
    mycafe.displayBread();
}

class MyCafe {
	BreadShop breadShop;
	
	MyCafe(this.breadShop);
	  
  // 빵 진열하기 메서드
  void displayBread() {
	  String shopname = breadShop.breadShopName;
		int breadCount = breadShop.giveBreadCount();
	  
    print('$shopname에서 공수해온 빵 $breadCount개 진열 완료!!');
  }
}

결과

MyCafe를 생성해줄때 어떤 빵집을 사용할건지를 직접 골라서 넣어줄 수 있게 되었습니다.
의존성을 주입하는 것이죠!!
이제 어떤 다른 빵집이 생기더라도 BreadShop이라는 규칙을 지키게 만들어주면 내부의 코드를 수정할 필요가 없이 바로 적용할 수 있게 되었습니다.

profile
타협하는 순간 발전이 없어

0개의 댓글