인프런 커뮤니티 질문&답변

김동욱님의 프로필 이미지
김동욱

작성한 질문수

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

32 새 노트 작성, 노트 표시 기능

데이터가 수정되거나 추가될때 리스트를 최신화하는 부분의 질문입니다.

작성

·

257

0

- 학습 관련 질문을 남겨주세요. 상세히 작성하면 더 좋아요!
- 먼저 유사한 질문이 있었는지 검색해보세요.
- 서로 예의를 지키며 존중하는 문화를 만들어가요.
- 잠깐! 인프런 서비스 운영 관련 문의는 1:1 문의하기를 이용해주세요.

 

클린아키텍쳐를 구현중인데요

노트를 수정하는 플로우에서

viewModel -> useCase.update -> repository.update -> remoteDatasource.update 의 과정을 거치고

 

노트리스트 조회의 플로우를 생각해보면

viewModel -> useCase.getList -> repository.getList -> remoteDatasource.getLIst 처럼 같은 과정을 거치게 됩니다.

updateapi를 성공했다면 리스트화면으로 돌아올때 데이터 최신화를 위해 다시한번 조회하는 의미없는 리소스를 없애고싶습니다. 혹은 화면 A,B에서 같은리스트를 보여주는 상황이라면 update 성공 하고나서 A,B화면에 어떤방식으로 notify를 해줄 수 있을까요? 클린아키텍쳐의 구조를 구현하기 전에는 SingleTon으로 구현된 Repository에서 stream을 열어서 viewModelA와 viewModelB 에서 같은 repository의 stream을 구독해서 state를 바꿔주는 방식으로 했는데 usecase를 사용하려고하니 해당구조는 어려움이 생겨서 어떻게 할지 고민하다가 질문 드립니다!

답변 4

0

김동욱님의 프로필 이미지
김동욱
질문자

하나의 섹션으로보고 PeedViewModel을 사용한다면 soft하고 쉽게 확장가능한 구조를 만들기위해 클린아키텍쳐를 적용하는데있어서 의미가 퇴색되지는 않을까요? 예를들어 갑자기 또 다른화면에서 같은 데이터를 공유하는 기능이 추가되야 한다면 하나의 뷰모델에서 3개 또는 4개의 뷰핸들링하는 상황이 되는거같아서 안좋은 패턴인거같다 라는 생각을 했습니다

오준석님의 프로필 이미지
오준석
지식공유자

저도 하나의 화면에서 하나의 ViewModel을 가지는 것이 가장 이상적이라고 생각합니다.

다만, 실제 업무를 하다보면 화면으로 볼지, 화면의 일부로 볼지 경계가 애매한 경우가 있더라고요.

참고가 되실지 모르겠지만 제가 수업에 사용하던 소스를 첨부합니다.

https://github.com/junsuk5/flutter-contact

화면에 나오는 요소들을 화면의 일부로 생각하고 ViewModel은 한개로 활용하고 있습니다.

여러 예외 케이스들이 있기 때문에 상황에 맞게 저도 여러 패턴을 연구중입니다.

김동욱님의 프로필 이미지
김동욱
질문자

오 감사합니다 ㅎㅎ 소스코드 한번 정독 해 보겠습니다!!

0

김동욱님의 프로필 이미지
김동욱
질문자

peedListViewModel 에서 사용되는 state와 peedDetailViewModel에서 사용되는 state가 peedList 외에 공통되는게 없는 상황이라면 peedViewModel 에 view를 컨트롤하는 기능들을 통합하는 방향이 괜찮을까요? 좋은 구조는 아닌거같아서 고민중입니다. useCase를 싱글톤으로 repository처럼 injection해주고 useCase에 Stream을 두고 viewModel에서 하나의 useCase를 구독하는 방향도 생각중이었는데 어떻게 생각하시나요!

오준석님의 프로필 이미지
오준석
지식공유자

State가 양쪽에 복잡하게 많은 경우라면 말씀하신 방안이 좋아보입니다.

김동욱님의 프로필 이미지
김동욱
질문자

아하! useCase를 전역으로 관리하는 방향도 나쁘지 않다라면 이쪽방향으로 구현 해 봐야겠네요!!
늦은시간인데 답변주셔서 감사합니다! 이 수업듣고 실력향상에 도움이 많이 됐습니다 감사합니다.

0

오준석님의 프로필 이미지
오준석
지식공유자

ViewModel에 Stream 을 두고 usecase를 통해 얻을 값들을 업데이트 해 주면 이전처럼 동일한 느낌으로 사용할 수 있습니다.

김동욱님의 프로필 이미지
김동욱
질문자

viewModel에 스트림을 두게된다면 ViewModelA에서 업데이트 된 데이터를 ViewModelB에서 사용하게되면 결국 viewModelB에서는 useCase를 통해서 다시한번 조회해야하지 않나요?

0

김동욱님의 프로필 이미지
김동욱
질문자

인스타그램을 예로들면

  1. 내가 올린피드 리스트 (peedLIst)

  2. 피드를 탭하면 피드의 내용을볼 수 있는 화면 (peedDetail)

  3. peedDetail에서 아래로 내리면 peedLIst에서 조회한 리스트의 데이터와 같아야함

이런 상황일때 peedDetail에서 글을 수정을하면 수정한 내용이 똑같이 peedList에서 보여져야하는 상황이 생기는데

네비게이션 peedList -> peedDetail 이 된 상황에서 peedDetail에서 update이벤트가 일어나고 pop을하면 peedList에서 최적화 및 ux를 위해 다시 조회하느라 필요한 로딩화면을 없애고싶은 상황일때 클린아키텍쳐 구조에서 어떤방식으로 구현을 해야 좋은 패턴이 될까요?

오준석님의 프로필 이미지
오준석
지식공유자

상황을 보니 ViewModel 을 peedList 와 peedDetail 에서 공용으로 사용해야 할 것 같습니다.

보는 관점에 따라 두번째 화면이 앞 화면의 다이얼로그 같은 느낌일 수도 있는데 이런 경우 ViewModel을 공유하는 형태로 했을때가 가장 쉽게 해결이 되었습니다.

오준석님의 프로필 이미지
오준석
지식공유자

저는 이런 화면 구조에서는 두 화면을 모두 화면으로 보지 않고 section 으로 취급합니다.

예를 들어 위 두 화면을 다음과 같이 하나의 화면 안에 두 개의 섹션으로 봅니다.

그럼 PeedViewModel 이 두 섹션에서 동시에 활용이 되기 때문에 원하시는 내용을 구현하기에 좋습니다

PeedScreen - PeedListSection
- PeedDetaionSection

김동욱님의 프로필 이미지
김동욱

작성한 질문수

질문하기