인프런 커뮤니티 질문&답변
HomeViewModel 질문 드립니다.
작성
·
250
0
HomeViewModel을 PhotoApiRepository 타입의 멤버 변수를 가지고 있는데 repository.fetch 하여서 [home_view_model_test] 파일에서 테스트하게 되는데,
해당 파일 내에 await viewModel.fetch('apple'); 코드를 사용해서 http 통신을 하게 되는데요.
HomeViewModel 내부에 fetch 메서드는
final result = await repository.fetch(query);
_photoStreamController.add(result);위와 같은 상태인데 repository.fetch는 그냥 abstract method 이잖아요? 그러면 메서드 내에 바디가 비어있는건데 어떻게 실행이 되는건가요? ㅠㅠ 이해가 잘 가지 않아서 질문 드립니다.
혹시 PixabayApi 클래서에서 PhotoApiRepository를 implements해서 그런건가요? 그러면 어떤 클래스가 implements를 한다면 어느 클래스든 PhotoApiRepository의 fetch 메서드가 호출 된다면 PixabayApi내의 fetch 메서드가 불리는 걸까요??
혹시 그게 맞다면 PhotoApiRepository를 implements 한 클래스들은 서로 같은 메서드명을 가지면 안되는 것일까요?
질문이 좀 우왕좌왕하는데 ㅠㅠ 죄송합니다.
답변 1
1
ViewModel의 생성자로 PhotoApiRepository 를 implements 한 객체를 전달하기 때문에 그 객체의 fetch() 를 실행하기 때문입니다.
뒤에 질문은 좀 우왕좌왕하는데 정리를 해 드리자면
ViewModel 에서는 인터페이스로 사용할 추상클래스 인스턴스로 로직을 작성합니다. 하지만 실제로는 어떤 동작을 할 지 모릅니다.
실제로 무엇을 할 지는 이 추상클래스의 추상 메서드들을 구현하는 객체를 만들어서 ViewModel에 전달하여 그대로 실행합니다.
ViewModel이 축구장이라고 하면 Repository를 축구선수라고 합시다. shot() 메서드가 있고요.
이를 구현하는 동네아저씨 class 를 만들어서 ViewModel에 전달하면 그저그런 슛을 합니다.
마찬가지로 이를 구현하는 메시 class 를 만들어서 전달하면 멋진 슛을 합니다.
구현체에 따라서 다른 결과가 나오게 하는 방법이고, 이를 통해서 실제 구현체가 뭔지 몰라도 이를 사용하는 클래스를 쉽게 테스트 할 수 있습니다.






그럼 현재는 구현체가 PixabayApi 이므로 PixabayApi 내의 fetch를 바라보는 것이 맞나요??