• 카테고리

    질문 & 답변
  • 세부 분야

    모바일 앱 개발

  • 해결 여부

    해결됨

클린 아키텍처, MVVM 여러 질문

22.01.26 04:20 작성 조회수 239

1

 

안녕하세요. 좋은 강의 잘 보고 있습니다. 예전부터 클린 아키텍처, MVVM 관련 문서나 영상을 보고 실무에 적용하려다가 막힌 적이 있는데 본 강의를 보고도 여전히 의문이 풀리지 않아 질문드립니다.

  1. 먼저 전역 데이터 관리인데요. 특히 로그인 사용자 정보를 어떻게 관리해야 하는지가 제일 어려운 것 같습니다. 로그인 사용자 정보는 앱 전체적으로 쓰일 수 있기 때문에 어딘가에 저장하고 있어야 한다고 생각하는데요. 클린 아키텍처에서 상태를 저장하는 요소는 ViewModel(or State)인데 이건 특정 View에 종속적인 요소라 알맞지 않다고 생각하거든요.

    하나 생각나는 방법은 SharedPreferences 같은 외부 영구 저장소에 저장해놓고, 로그인 사용자 정보가 필요한 곳마다 ViewModel에서 UseCase(Reposity)를 통해 그 데이터를 가져오는 것인데, 한 번만 불러와서 메모리에 올려놓고 사용하면 되는 것을 매번 외부 저장소에 데이터를 요청하는 게 과연 옳은 건지 모르겠습니다.

  2. 1번과 이어지는 것 같은데 또 하나는 토큰입니다. 토큰은 토큰이 필요한 API 요청이 있는 DataSource 전체에 공유돼야 하는데 이 토큰은 보통 로그인할 때 받아오게 되죠. 앞서 로그인 사용자 정보와 같이 SharedPreferences에 저장해놨다가 매번 가져오는 것도 이상하고, 특히 같은 DataSource에서 다른 DataSource에 요청하는 건 클린 아키텍처, MVVM에 맞지 않다고 생각하거든요.

    이 역시 하나 생각나는 방법은 1번에도 적용할 수 있는 방법인데 클린 아키텍처의 요소 어디서든 접근할 수 있는 외부의 전역 객체를 하나 선언해놓고, 거기에 저장해뒀다가 꺼내 쓰는 방법인데 이 방법 역시 과연 클릭 아키텍처, MVVM에 맞는 방법인지 모르겠습니다.

  3. ViewModel과 UseCase의 역할 구분이 어렵습니다. 예를 들어 어떤 게시글 리스트를 보여주는 화면이 있을 때, 그 게시글 리스트 중에서 내가 쓴 글일 경우에만 특정 버튼을 노출하고 싶다면 그 글이 내 글인지 확인하기 위해 bool isMine(Post post)와 같은 메소드를 이용해야 할 텐데요. ViewModel에서 로그인 사용자 정보를 가져와서 저 메소드를 구현하는 것과 저 메소드를 구현한 UseCase를 만들어서 사용하는 것 중에 뭐가 나은 방법일까요?

  4. ViewModel에서 위젯을 정의하고 사용해도 될까요? 예를 들어 submit() 함수가 있다 했을 때, 이 submit() 함수가 끝나면 AlertDialog를 출력해서 알려주고 싶은데 그 AlertDialog를 어디에서 선언하고, 사용하는 게 나을까요? Event와 Stream을 이용해서 View에서 정의하고, 처리하는 게 나을까요?

적다 보니 질문이 꽤 길어졌네요. 정리한다고 정리했는데 잘 전달이 됐는지 모르겠습니다. 긴 글 읽어주셔서 감사하고, 많은 조언 부탁드립니다.

 

답변 1

답변을 작성해보세요.

1

1. 로그인 정보는 그냥 SharedPreferences 같은 것을 사용하시면 됩니다. 항상 트레이드오프는 존재하기 때문에 코드가 좀 더 편하게 갈 것이냐 성능을 조금이라도 올릴 것이냐인 것 같습니다. 필요하다면 싱글턴처럼 최초 한번 읽어오고 메모리에 올려서 사용하도록 로직을 작성하시면 됩니다. 저는 전자를 선호합니다.

2. 토큰 같이 보안에 민감한 데이터는 SecureStorage 같은 패키지를 사용하면 암호화되서 저장되니 이런 것을 고려하면 됩니다. 사실 매번 저장된 걸 가져오는게 이상해 보이지만 Web에서 작업할 때도 매번 token을 요청하거나 임시로 저장하기 때문에 마찬가지입니다. 복잡해 보이면 UseCase로 캡슐화하시면 됩니다. 그렇게 복잡하지 않아 보이게 됩니다. 필요시 별도 로직을 구현해서 싱글턴으로 처리하시면 됩니다. 저의 경우 별도 로직을 구현했을 때 얻는 이득이 많지 않다고 생각되어 전자를 선호합니다.

3. ViewModel이 간단하면 UseCase는 작성하지 않아도 된다고 보시면 됩니다. ViewModel의 로직이 복잡하면 그 로직을 캡슐화하는 것이 UseCase 입니다. 그런데 UseCase를 적용하기로 했다면 모두 통일 시키는 것이 좋다고 생각합니다. 게시글 기능이 등장했다면 이미 복잡한 로직을 많이 포함할 것으로 보입니다. UseCase를 적용하는 것이 좋지 않을까요

4. ViewModel은 View에 노출될 데이터만 가지고 있도록 만드셔야 합니다. 위젯을 포함하면 안 됩니다.  View단에서 AlertDialog를 정의하거나 분리한다면 components 디렉토리쯤에 정의해 두고 Event와 Stream을 사용하여 View에 알려주고 View에서 알림을 처리하시면 됩니다.

영상에서 해소되지 않는 부분은 언제든 질문 주세요. 감사합니다.

2scent님의 프로필

2scent

질문자

2022.01.26

친절하고 상세한 답변 감사합니다!