왕초보 프로그래머가 몰리오를 만든다고 생각해보자
뷰 컨트롤러의 코드에서 플레이리스트들을 fetch
하는 API를 바로 호출하는 코드를 짤 수도 있다.
두 개의 모듈로 나눴다고 생각하자
// View.swift 모듈
import MolioAPIModule
final class ViewController: UIViewController {
let apiService = APIService()
func fetch() async {
apiService.fetch()
}
}
// MolioAPIModule.swift 모듈
final class APIService {
func fetch() async {
...
}
}
현재 ViewController
→ APIService
이다.
구현체에 의존한다.
우리가 배운 바에 따르면 이제 ViewController
는 APIService
의 변경에 영향을 받는다.
APIService
의 코드가 변경되면 ViewController
의 코드도 변경해야 한다고 생각이 든다.
근데 과연 그럴까..?
APIService
의 구현이 바뀌면 항상 ViewController
도 수정해야할까?그렇지 않다.
func fetch() async
라는 메서드 시그니처를 유지하는 선에서 내부 코드를 변경한다면 수정할 필요가 없다
(시그니처를 유지하면서 바꿀 사람은 별로 없을 것 같긴 하다.)APIService
가 변경되었다고 해서 ViewController
가 변경될 부분은 한 곳도 없다.
이는 프로토콜로 의존성 역전을 시킬 때와 전혀 다를 것이 없다.
<aside> 💡
가정: APIServiceProtocol
을 만들고 구현체인 APIService
가 그걸 채택하도록 한 후 의존성 주입 받는 상황을 가정하자
이렇게 의존성 역전, 의존성 주입을 하더라도 APIService
의 내부 구현만 변경되는 상황에서 실제 구현체의 내부 동작만 변한다. 이는 의존성 주입을 하지 않는 아까 상황과 정확히 같다.
</aside>