의존성 주입이라는 어려운 말인데 어떤 건지 알아보자
https://jsonplaceholder.typicode.com
여기서 간단한 데이터 사용해서 구현해볼예정
이중에 posts 데이터를 사용해봅시다
요렇게 getData하는 메소드를 DataService class가 들고 있다고 해보자
지금까지는 요렇게 싱글톤 instance를 만들고
viewModel에서 이 객체를 사용해서 getData를 처리해줬을겨
근데 싱글톤에는 3가지정도의 문제가 있음
첫째로 글로벌해서 아무데서나 접근이 가능하다는거.
두번째로 init 메소드를 커스텀하는게 불가능하다는거! (실제로 해보면 static을 선언하는 부분에서 파라미터에 값을 넣어주게됨)
세번째로 같은 객체로 다른 service를 실행할 수 없다는거
이럴 때 dependency injection이 필요함
singleton으로 만들던 static let 없애주고
viewModel이 init될 때 dataService를 받아주는겨
그리고 viewModel을 들고있는 view도 init될 때 dataService가 들어가게끔 해줘서 dataService 객체는 철저하게 뷰가 init될 때 들고 있게끔 만들어주는 겁니다~!
그리고 init할 때 url을 받게끔 해주면
내가 URL을 넣는 타이밍이 요시점이 되겠죠!
MockData를 넘겨서 테스트하고 싶을 수 있잖음
요럴 때 전 시간에 배운 Protocol을 아주 잘 활용해볼 수 있음
DataServiceProtocol을 만들고 아까 ProductionDataService 가 가지고 있던 메소드를 필수로 구현해줘야한다고 작성해줌
그리고 MockDataService에서 프로토콜을 채택해주고
getData가 저렇게 구현되게 해줬다
Just는 값을 한번 방출하고 마는 퍼블리셔임
그래서 이게 Error를 반환할 경우가 없기 때문에
.tryMap에서 에러를 한번 걸러주는 척! 을 해줌
그리고 injection하는 부분을 죄다 DataServiceProtocol타입으로 바꿔주면~
뿜~!
쩐다...
여기서 한번더 가볼까요
nil일 때 기본값 줄수도 있고 따로 PostModel array를 넣어줄 수도 있음!!!!
캬아아
만약에 이런 주입해줘야할 dataService가 막 많아지잖음?
init 할 때마다 여러 클래스들 계속 넘겨줘야할 텐데
그거 그냥 다가지고 있는 class로 만들어버리는겨
그래서 Dependencies 클래스를 넘겨버리면 되겠죠?