Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[경북대 Android 주수민] 4주차 과제 step1 #58

Open
wants to merge 15 commits into
base: cleonno3o
Choose a base branch
from

Conversation

cleonno3o
Copy link

주요 변경 사항

  • 파일을 Domain, Data, Presentation에 따라 분리
  • 지난 리뷰 내용 반영
    • TODO 주석처리
    • Model(현 Repository)에서 LiveData 삭제
  • Model을 3가지 Repository로 분리
  • 검색 결과를 db에 저장하지 않음(기록과 마지막 위치는 저장)
  • usecase는 아직 구현하지 않음

어려웠던 점 / 중점적으로 리뷰를 바라는 부분

  • 강의 때 배웠던 구조대로 파일을 재배치하고 코드를 분리하는것이 어려웠습니다. 클린아키텍쳐에 대해 배우고 알고있는 선에서 유사하도록 구현해보았는데 적절한지 피드백해주시면 좋겠습니다
  • 현재 MapActivity와 SearchActivity가 모두 ViewModel이 필요해 각 액티비티에서 갖고있도록 초기화 해주었습니다. 이렇게 서로다른 객체로 ViewModel을 각 Activity가 갖고있어도 되는지 궁금합니다.
  • 이외에도 부족한 부분이 있으면 알려주시면 감사하겠습니다!

실행화면

4._step1_error.mp4
4.step1_normal.mp4

cleonno3o added 15 commits July 16, 2024 15:15
- DB에 저장하는 정보에 건물 id, x, y좌표 추가
- Location 클래스에 id, x, y좌표 추가
: 기능 목록 세부화
- MapModel
: LastLocationRepository, ResultRepository, HistoryRepository 로 분리
: 더 이상 Repository가 context를 가지지 않음

- ResultRepository
: 서버에서 가져온 값을 로컬DB에 저장하지 않고 메모리에 보관하는 방식으로 변경

- RetrofitService
: 코루틴을 위해 suspend하도록 메서드 변경

- MapDbHelper
: 더 이상 서버에서 가져온 값을 DB에 저장하지 않음

- MapViewModel
: MapModel(현 Repository)를 observe하지 않고 메서드를 통해 요청
- SearchActivity
: startActivity를 통해 LastLocation정보를 전달하지 않음
: LastLocation 정보를 DB에 저장하고 finish()하도록 변경

- MapActivity
: Intent가 아닌 DB에서 값을 가져와 표시하도록 변경
: 기타 기능 메서드로 분리

- 나머지
: Reformat Code 적용
: response가 successful이고 ServerResult가 null이 아닐 경우에만 로직 수행
: response가 successful하지 않은 경우(실패) 3번까지 다시 시도하고 종료

import java.io.Serializable

data class Location(
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

강의 때 배웠던 구조대로 파일을 재배치하고 코드를 분리하는것이 어려웠습니다. 클린아키텍쳐에 대해 배우고 알고있는 선에서 유사하도록 구현해보았는데 적절한지 피드백해주시면 좋겠습니다

아키텍쳐에 대해서 얘기할땐 "얼마나 유사하게 잘 구현했냐?"를 얘기하기보단
이걸 왜 도입했고 어떤목적을 가지고 적용했는지를 고민하셔야합니다.
단순히 구현 유사도만 말씀드리면 잘 구현하셨습니다. 많이 쓰는 패턴들이 보이네요
하지만 잘 따라했는지 여부는 학습에 큰 도움이 되지 않습니다.
그런 맥락에서 질문 몇개를 드릴게요! 고민만 해보셔도 좋고,
(일부만) 생각을 정리해서 코멘트로 남겨보셔도 좋습니다

(질문대로 구현하란 말이 아니고, 구현하는게 더 옳다는 뜻도 아닙니다)

  1. 이 프로젝트에서 정의하는 domain 모델의 기능적 영역은 어디까지인가요?
  2. Repository만 구현하시고 DataSource는 구현 안하셨는데 안하신 이유가 있나요?
  3. Repository는 왜 interface와 impl 구현체로 나누셨나요?
  4. MapDbHelper는 data.source에 있는데, 얘만 repository 없이 ui 모듈이 직접 참조하는 이유가 있나요?

Copy link
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

과제에서 MVVM 패턴 적용이 요구사항이라 따라서 형태를 갖추는데만 집중했던 것 같습니다! 처음에 적용하려고 했던 이유는 단순히 각 기능들이 어디있는지 파악하기 어려워서 시작했습니다. 질문 주신 내용들 모두 곰곰히 생각해보고 더 공부해보겠습니다! 감사합니다!


class SearchActivity : AppCompatActivity(), DatabaseListener {
// private val viewModel: MapViewModel by viewModels()
private lateinit var viewModel: MapViewModel
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

현재 MapActivity와 SearchActivity가 모두 ViewModel이 필요해 각 액티비티에서 갖고있도록 초기화 해주었습니다. 이렇게 서로다른 객체로 ViewModel을 각 Activity가 갖고있어도 되는지 궁금합니다.

여러 컴포넌트를 거치는 viewModel을 만드는건 흔한 일입니다.
다만 안드로이드 aac 차원에서 scope를 activity, fragment 단위로만 지원하다보니
activity를 넘는 viewModel은 잘 안만드는거 같아요

안되는거까진 아닌데, 다른 방법을 고민하신다면...
보니까 MapViewModel 전체가 필요한게 아닌 일부 기능만 필요한걸로 보이네요
2가지 방안을 제안드립니다.

  1. usecase로 공통부분을 추출하고, MapViewModel / SearchViewModel에서 공통 usecase 를 사용한다.
  2. MapViewModel / SearchViewModel을 만들고, 공통부분을 부모 클래스로 만들어본다.

Copy link
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

2번 방법으로 반영해보겠습니다!

@JSpiner
Copy link

JSpiner commented Jul 19, 2024

step2 PR을 이미 만드셔서 이건 머지 안할게요~

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

2 participants