인프런 커뮤니티 질문&답변
MVVM, 클린 아키텍처 관련 질문 있습니다.
작성
·
30
0
- 학습 관련 질문을 남겨주세요. 상세히 작성하면 더 좋아요!
- 먼저 유사한 질문이 있었는지 검색해보세요.
- 서로 예의를 지키며 존중하는 문화를 만들어가요.
- 잠깐! 인프런 서비스 운영 관련 문의는 1:1 문의하기를 이용해주세요.
안녕하세요. 좋은 강의 정말 잘 듣고 있습니다.
강의를 통해 MVVM 구조와 클린 아키텍처에 대해 배우고, 진행 중인 프로젝트에 적용해보고 있는데, 어려움을 겪고 있어 조언을 구하고자 질문 글을 올리게 되었습니다.
회원 정보 관련
api - repository - use_case - view_model -view 구조에서,
로그인 화면에서 로그인 후 받아오는 회원 정보를 어디에 저장해 두어야 되는지 잘 모르겠습니다.
회원정보는 마이페이지, 피드 등 여러 view에 사용되는데,
그렇다면 각각의 view_model은 회원정보를 어디에서 읽어오는게 좋은지 궁금합니다.
새로 고침 관련
note_app 강의 예제 에서는 노트 목록과 삭제가 하나의 화면(notes_view)에 있습니다.
제가 구현하는 구조에서는 두 개의 view로 분리되어 있습니다.
1번 view: 노트 목록 화면
2번 view: 노트 상세 + 삭제 화면
각 화면은 서로 다른 view_model을 사용합니다.
노트 상세 화면에서 노트를 삭제했을 때, 노트 목록 화면을 어떻게 다시 업데이트 하는 것이 적절한지 고민입니다.
생각나는 방법을 아래에 작성해보았는데, 어떤 방법을 사용하는 게 깔끔할지, 이외에 더 좋은 방법이 있는지 궁금합니다.
두 개의 view가 하나의 view_model을 공용으로 사용
노트 상세 화면에서 노트 목록 view_model를 read 하여 _loadNotes()를 직접 호출
노트 목록도 회원 정보처럼 별도로 저장해두고, view_model은 읽어오기
감사합니다!
답변 2
1
회원 정보는 UseCase나 Repository 를 통해서 얻도록 구성하시고, 해당 기능이 필요한 ViewModel 에서 이 UseCase나 Repository를 활용해서 정보를 얻으면 됩니다.
하나의 ViewModel 을 공유하게 되면 추후에 더 많은 버그를 유발할 수 있습니다. 상세 화면에서 목록 화면의 ViewModel 에 접근하는 것도 좋은 방법이 아닙니다.
가장 간단한 방법으로는 목록화면에서 상세화면으로 Navigator.push 방식으로 이동한다면 push 함수 자체가 Future 타입이고 리턴 값을 받을 수도 있어서 await 으로 호출하고, 상세화면이 pop 하면서 리프레시용으로 true 값을 던지면, 목록화면에서 이를 확인하여 refresh() 를 할 수 있습니다.
Flutter 고급 : 현업 수준의 아키텍처 강의의 일부분인데요.
여러 구독자를 허용하며 마지막 상태를 가지는 Stream을 제공하는
RxDart의 BehaviorSubject 를 활용하여 여러 화면에서 관찰가능하게 하는 전략이 있습니다.
관찰하려는 내용을 이런식으로 제공하면 새로운 화면이 다시 그려질 때 언제든 최신 정보로 refresh 가능합니다.
https://github.com/junsuk5/flutter_recipe_app_course/blob/35-refactor/lib/data/repository/mock_bookmark_repository_impl.dart
이러한 방식이 너무 복잡하다 느껴지신다면 특정 ViewModel을 싱글톤으로 유지하고 여러 화면이 공유하는 것이 단기적으로는 대안이 될 수 있으나, 장기적으로는 리팩터링 대상이 될 수 있습니다.
예전부터 계속 고민하던 부분이었는데, 덕분에 막막했던 게 풀린 것 같습니다.
중급 편 학습 마치고, 고급 강의도 수강 하여 말씀해주신 내용 적용해볼 수 있도록 하겠습니다.
도움 주셔서 감사합니다!
0
안녕하세요, 인프런 AI 인턴입니다.
혜영님께서 질문하신 MVVM 구조와 클린 아키텍처에서의 데이터 관리를 어떻게 해야 할지에 대한 고민은 많은 개발자들이 공감할 부분입니다. 관련된 유사 질문과 답변을 바탕으로 몇 가지 팁을 드리겠습니다.
회원 정보 관리
로그인 후 받아오는 회원 정보를 어떻게 관리할지에 대한 고민이 있으시군요. 이 문제는 다음 두 질문과 관련이 있습니다:클린 아키텍처, MVVM 여러 질문: 이 질문에서는 전역 데이터 관리, 특히 로그인 사용자 정보를 어떻게 관리할지에 대해 설명합니다. SharedPreferences나 보안이 필요한 경우 SecureStorage 같은 외부 역구를 사용해 데이터를 저장하는 방법을 추천합니다.
로그인 정보는 여러 화면에서 공통적으로 사용되기 때문에, Application 레벨에서 싱글턴 패턴을 사용하여 전역적으로 하나의 인스턴스로 관리하는 것도 하나의 방법입니다. 이렇게 하면 여러 ViewModel에서 회원 정보를 쉽게 접근할 수 있습니다.
노트 목록 업데이트
노트 목록과 노트 삭제를 각각의 View로 나누는 것은 유용하지만, 데이터 동기화가 이슈가 될 수 있습니다:데이터가 수정되거나 추가될때 리스트를 최신화하는 부분의 질문입니다: 이 질문에서는 ViewModel 간 데이터 동기화에 대한 문제를 다룹니다. 하나의 ViewModel을 두 개의 뷰에서 각기 다른 State를 관리하도록 하고, 데이터 동기화가 필요한 경우 이벤트 버스를 사용하거나 Stream으로 상태를 관리하는 방법을 고려할 수 있습니다.
노트 상세화면에서 삭제 이벤트 발생 시 노트 목록 화면의 ViewModel을 업데이트해야 한다면, 상태관리를 위해 이벤트 버스를 사용하거나 Riverpod의 Provider를 공유하여 상태를 변경하고, 구독된 화면들이 자동 갱신되도록 하는 방법을 사용할 수도 있습니다.
이 두 질문에서 제안하는 방법이 도움이 되셨길 바랍니다. 다양한 방법이 있지만, 각각의 방법들은 실제 프로젝트에 맞게 선택과 설계가 필요합니다.
저는 질문자님의 이해를 돕고자 지식공유자님의 기존 답변을 참고하여 유사한 답변 링크를 추천해 드리고 있습니다. 현재 베타 기능으로 답변이 만족스럽지 않을 수 있는 점 양해 부탁드립니다. 🙏 추가적으로 궁금한 점이 있으시면, 이어서 질문해 주세요. 곧 지식공유자께서 답변해 주실 것입니다.






친절한 답변 감사합니다!
관련해서 더 궁금한 점이 있습니다.
상세 화면으로 진입하는 경로가 여러 가지인 경우,
상세 화면에서 변경된 내용을 목록 화면이 어떻게 감지하여 refresh 할 수 있을지 궁금합니다.
감사합니다!