0. 이 둘을 왜 나누는 거지?

소위 인터페이스와 구현체를 왜 나누는 것인지 잘 몰랐다.

지금껏 여러 프로젝트로 앱을 만들어오면서 그냥 이렇게 하니까~ 하며 나눠왔는데, 공부해보고서 알게 되었다.


1. 나누지 않을 시의 문제점

Repository는 추상체, Impl은 구현체이다.

만약 둘 간의 분리가 없다면 ViewModel은 곧장 Impl에 의존하게 된다.

ViewModel → RepositoryImpl

이렇게 되면 내가 추후 타이머 구현 방식을 변경하면 ViewModel을 죄다 뜯어 고쳐야한다!


2. 올바른 구현

ViewModel → Repository → RepositoryImpl 순으로 구현해야 상기 문제를 피할 수 있다.

ViewModel 입장에서는 ‘어떻게 구현되든’ 상관 없다. 오로지 시작/일시정지/종료만 하면 되는 것이다.

ViewModel이 구현체에 의지하게 되면, 실제로 delay로 인해 테스트가 느려지고, Job, Coroutine 등으로 예측이 어렵다.

하지만, ViewModel이 인터페이스에 의지하게 되면 Fake Repository를 만들어 상기 이슈를 해결하고, 테스트까지 쉽게 할 수 있다.

⇒ 정리하면,