본문 바로가기

iOS

[iOS] 의존성 1 by Escaper

프로젝트 중 우리 코드의 의존성 주입에 문제가 있다는 피드백을 받았습니다. 이에 앞서 의존성주입에 대해 먼저 알아 봅시다. 간단스하게!

의존성

  • A클래스가 내부변수로 B클래스를 가지고 있을때 A클래스는 B클래스에 의존성이 생긴다.
  • A → B

주입

  • 내부가 아닌 외부에서 객체를 생성해서 넣어주는 것을 주입이라고 합니다.

의존성 주입

  • 외부에서 B클래스 객체를 만들어서 A에 넣어주면 의존성을 주입!
  • A → B

 

현재 우리 코드

현재 ViewController를 만들고 ViewController의 create() 함수를 이용해 ViewModel을 넣는다.

ViewController의 create() 함수안에서 ViewModel, UseCase, Repository를 만든다.

문제점 발견

  • 현재 ViewModel을 ViewController에 주입 한다고 볼 수 없다. ViewController 클래스 내에서 ViewModel을 생성하고 있기 때문

주입 방법은 세가지!

  • Constructor Injection, 생성자 주입
  • Method Injection, 메서드 주입
  • Property Injection, 프로퍼티 주입

주입 방법 세가지의 차이점은?

Constructor Injection vs Method Injection, Property Injection

  • Method Injection, Property Injection은 비슷하게 동작하는 것 같음!. 런타임에서 오류를 찾음
  • Constructor Injection은 컴파일단에서 에러를 찾을 수 있음. 컴파일타임에서 오류를 찾음

Constructor Injection을 쓰자!

  • Constructor Injection는 컴파일에서 오류를 찾을 수 있는데 이는 개발자가 인지 못할 경우 컴파일타임에서 찾아주는 장점이 있음.
  • 프로퍼티를 nil로 하지 않아도 됨.

최대한 Constructor Injection로 적용하자!

  • ViewModel, UseCase, Repository 적용
  • ViewController는 Constructor Injection을 시도했는데 평범한 클래스랑은 init방식이 다른 것 같음 → 실패
  • ViewController만 Method Injection적용!

코드 수정

ViewModel을 ViewController를 생성하고 후에 주입함!

추가적으로 의존 관계 역전 법칙 (SOLID의 법칙 중 하나임)

(Dependency Injection Principal)

 

의존 관계를 역전 시켜서 의존 관계를 분리한다?

상위 계층이 하위 계층에 의존하는 관계를 반전시킨다. 상위 계층이 하위 계층의 구현으로부터 독립 된다

상위 모듈과 하위모듈은 둘다 추상화에 의존한다.

(말이 좀 어렵네요 .. )

위의 A클래스 B클래스를 예로 들면

A → B, A가 B를 의존하게 됨!

여기서 추상화 즉 프로토콜을 만들어서 각 A와 B가 프로토콜을 의존하게 하면!

A → 프로토콜 ← B, A는 프로토콜에 의존 B도 프로토콜에 의존

 

장점으로는 

  • 모듈 간 의존성이 떨어질 수 있다.
  • 테스트가 용이해지는 코드 해당 프로토콜을 채택한 Mock 객체를 이용한 테스트가 가능
  • 코드에 유연성이 생긴다

 

'iOS' 카테고리의 다른 글

[iOS] HashTable, Dictionary  (0) 2022.01.15
[iOS] 의존성 2 by Escaper  (0) 2021.12.06
[iOS] Appearance by Escaper  (0) 2021.12.06
[iOS] 데이터 순서 보장 by Escaper  (1) 2021.12.06
[iOS] - 접근성 - VoiceOver를 도입해보자!  (2) 2021.11.21