inflearn logo
강의

강의

N
챌린지

챌린지

멘토링

멘토링

N
클립

클립

로드맵

로드맵

지식공유

Flutter 중급 1편 - 클린 아키텍처

08 ViewModel과 Test

HomeViewModel 질문 드립니다.

267

한석민

작성한 질문수 20

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 한 클래스들은 서로 같은 메서드명을 가지면 안되는 것일까요?

질문이 좀 우왕좌왕하는데 ㅠㅠ 죄송합니다.

 

ios android Flutter

답변 1

1

오준석

ViewModel의 생성자로 PhotoApiRepository 를 implements 한 객체를 전달하기 때문에 그 객체의 fetch() 를 실행하기 때문입니다.

뒤에 질문은 좀 우왕좌왕하는데 정리를 해 드리자면

ViewModel 에서는 인터페이스로 사용할 추상클래스 인스턴스로 로직을 작성합니다. 하지만 실제로는 어떤 동작을 할 지 모릅니다.

실제로 무엇을 할 지는 이 추상클래스의 추상 메서드들을 구현하는 객체를 만들어서 ViewModel에 전달하여 그대로 실행합니다.

ViewModel이 축구장이라고 하면 Repository를 축구선수라고 합시다. shot() 메서드가 있고요.

이를 구현하는 동네아저씨 class 를 만들어서 ViewModel에 전달하면 그저그런 슛을 합니다.

마찬가지로 이를 구현하는 메시 class 를 만들어서 전달하면 멋진 슛을 합니다.

구현체에 따라서 다른 결과가 나오게 하는 방법이고, 이를 통해서 실제 구현체가 뭔지 몰라도 이를 사용하는 클래스를 쉽게 테스트 할 수 있습니다.

0

atomom

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

0

오준석

네 그렇습니다.

테스트 할 때는 FakePhotoRepository 가 구현체가 되고요.

 

0

atomom

선생님 이해했습니다! 감사합니다 !

MVVM, 클린 아키텍처 관련 질문 있습니다.

0

110

2

가끔씩 ui가 깨지는? 현상이 있어서 질문드립니다.

0

104

1

freezed 3.0 대응된 코드 깃헙에도 업데이트 해주실 수 있으신가요?

0

195

3

sealed class 사용시 기능은 동작하지만 Radio위젯에 선택 표시가 안되는 부분 질문

0

133

2

sealed class 사용시 The getter 'orderType' isn't defined for the type 'NoteOrder<dynamic>' 오류

0

102

2

유즈케이스 관련하여 질문 드립니다.

0

99

1

mockito사용시 오류 해결법

1

127

2

sealed class 사용 문의2

0

88

2

sealed class 사용 문의

0

123

2

freezed3.0에서 build시 when생성되지 않습니다.

0

275

2

Try implementing the missing methods, or make the class abstract. 문제해결 공유

0

246

2

This is likely caused by a misconfigured builder definition. 오류 해결 방법

1

332

3

강의 화면이 안보여요

0

142

3

Flutter에서 추천하는 Navigator, Router

0

335

2

The following ProgressEvent object was thrown resolving an image codec: [object ProgressEvent]

0

331

3

event와 ui_event

0

217

1

코드 색깔 관련 질문

0

214

1

Photo.fleezed.dart,photo.g.dart삭제시 에러

0

216

2

sealed class 적용 시...

0

337

1

클린 아키텍처 질문

0

317

1

sealed class 데이터 접근

0

333

1

서버에서 데이터를 가져와서 사용하는 경우...

0

239

1

뷰/뷰모델 작성 질문

0

277

1

freezed JsonKey 사용 예시 공유

1

797

1