본문 바로가기
iOS/Swift

[iOS] 의존성 주입 DI

by 안녕주 2022. 2. 19.

의존성 주입 (Dependent Injection)

의존성 주입은 외부에서 초기화해서 클래스 안에 할당해주는 것입니다.

의존성 주입을 할 경우 아래와같은 효과를 기대할 수 있습니다.

  • 재사용성이 높아짐
  • 테스트 용이
  • 코드 단순화
  • 결합도는 낮추면서 유연성과 확장성 향상

 

1. 의존성은 어떤한 클래스에서 다른 클래스를 사용하면 의존성이 생깁니다.

//그냥 평범한 클래스
class Mobile {
	var name = "아이폰14"
}

//Mobile과 의존관계가 있는 클래스, Phone은 Mobile에 의존관계가 생깁니다.
class Phone{
	var phone = Mobile()
}

let Apple = Phone()
print(Apple.phone.name)

 

2. 주입은 값을 초기화할때 값을 주입합니다. 내부가 아니라 외부에서 객체를 생성해서 넣어주는 것

class Mobile {
	var name = string?

	init(name: String){
		self.name = name
	}
}

//외부에서 객체를 생성해서 넣습니다.
let Apple = Mobile(name: :"아이폰14")

 

3. 의존성 주입 → 분리가 안되어 있음 → 완벽한 의존성 주입은 아님

class Mobile {
	var name = "아이폰14"
}

class Phone{
	var phone = Mobile

	init(variable: Mobile){
		self.phone = variable
	}
}

//외부에서 Mobile을 Phone에 주입합니다.
//제어의 주체가 외부에 있습니다.
let Apple = Phone(variable: Mobile())
print(Apple.phone.name)

 

4. 의존성 분리 는 의존성을 분리시켜 사용합니다.

의존성 분리는 의존관계 역전의 원칙(IOC)으로 의존관계를 분리시킵니다. 의존관계 역전 원칙

아래의 코드를 보면 이제 제어의 주체가 Interface(Protocol)에게 있습니다.

의존성 주입의 의도는 객체의 생성과 사용의 관심을 분리하는 것입니다.

//의존 관계를 독립시킬 인터페이스
protocol NameProtocol{
	var name: String ( get set }
}

// 평범하지만 위의 인터페이스에 의존관계가 있는 클래스
class Mobile: NameProtocol {
	var name = "아이폰14"
}

// Mobile과 의존관계가 있는 클래스
class Phone{
	var phone = NameProtocol

	init(phone: NameProtocol){
		self.phone = phone
	}
}

let Apple = Phone(phone: Mobile())
print(Apple.phone.name)

 

IOC(Inversion Of Control)

기존의 모든 제어를 클라이언트 코드가 가지도록 구현 하던 것에서 기존 구조적 설계와 비교해 프레임워크(Container)가 제어를 나누어 가져가되되어 의존 관계가 방향이 달라지게 되는 것을 제어가 반전,역전 되었다 라고 합니다.

제어의 주제가 역전되는 패턴입니다.

 

IOC Container

IOC (Inversion of Control) 를 구현하는 프레임워크로 객체를 관리하고, 객체의 생성을 책임지고, 의존성을 관리하는 컨테이너 입니다.

IOC Container 개념이 설명하기엔 좀 까다로워서 아래의 블로그를 참고하시길 바랍니다..!

어렵네요.. 아직 이해를 못했습니다..!

[DI] Inversion Of Control Container 란?

 

[DI] Inversion Of Control Container 란?

DI (Dependency Injection) 의 핵심 개념인 IOC Container에 대해 간단한 메모를 해보겠습니다.

medium.com

 

[참고블로그]

https://lazyowl.tistory.com/entry/iOS-의존성-주입Dependency-Injection-알아보기

https://medium.com/@jang.wangsu/di-dependency-injection-이란-1b12fdefec4f

https://eunjin3786.tistory.com/115https://medium.com/@jang.wangsu/di-inversion-of-control-container-란-12ecd70ac7ea

'iOS > Swift' 카테고리의 다른 글

[iOS] ARC  (0) 2022.02.20
[iOS] SOLID 원칙 in Swift  (0) 2022.02.19
[iOS] Data Binding in MVVM  (0) 2022.02.19
[iOS] MVVM 패턴  (0) 2022.02.18
[iOS] Swift의 5가지 접근 타입  (0) 2022.02.17

댓글