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_정기주 2주차 과제 Step2 #61

Open
wants to merge 18 commits into
base: ddangcong80
Choose a base branch
from

Conversation

ddangcong80
Copy link

@ddangcong80 ddangcong80 commented Jul 5, 2024

과제 수행 시 어려웠던 점

  • 검색창에서 검색된 내용을 데이터베이스에서 추출 후 리사이클러뷰를 사용해서 장소 리스트를 출력하는 부분을 구현 중에 검색된 데이터들이 adapter까지도 전송이 잘 되는데 에뮬레이터 화면에는 1개의 리스트밖에 출력되지 않았었습니다. 이 과정에서 adapter 설계 문제인지 xml 문제인지 정확히 문제점을 찾지 못하여 시간을 많이 소모했습니다. place_item.xml을 constraintlayout으로 구현했었는데 linearlayout으로 변경 후 해결할 수 있었습니다.
  • MVVM 패턴을 적용하려다 보니 단순히 패턴을 적용하는 것이 아니라 binding, livedata, 의존성 등 여러 개념들을 잘 숙지 하고 있어야 한다는 것을 알았습니다.
  • 이번 과제에서는 모든 개념들을 알고있다고 하기에는 다소 부족한 코드가 된 것 같아 아쉽습니다.

중점적으로 리뷰해주셨으면 하는 부분

  • MVVM 패턴을 잘 적용하였는지와 LiveData 사용이 적절했는지 궁금합니다.
  • 전체적인 함수의 로직을 잘 구현하였는지 궁금합니다.

@ddangcong80 ddangcong80 changed the base branch from main to ddangcong80 July 5, 2024 08:57
Copy link

@InyoungAum InyoungAum left a comment

Choose a reason for hiding this comment

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

LiveData는 적절하게 잘 사용해주셨습니다.
MVVM은 아직 데이터바인딩을 사용하지 않아서 정확한 코멘트를 드리긴 어렵습니다.

view(Activity) viewModel의 역할을 구분할 때
뷰의 변경이 있는 경우만 Activity까지 가서 함수를 호출하고 나머지는 viewModel에서 처리하는 것이 좋습니다. 이 개념을 잘 숙지해두시면 좋을 것 같습니다.

private val dbHelper = PlaceDBHelper(context)

fun isDataExists(category: String): Boolean {
val db: SQLiteDatabase = dbHelper.readableDatabase

Choose a reason for hiding this comment

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

DB관련 로직 + 쿼리는 Helper에 두고 해당 함수를 불러서 사용하는 식으로 하면 더 좋을 것 같습니다

)
val exists = cursor.count > 0
cursor.close()
db.close()

Choose a reason for hiding this comment

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

여기서는 close를 잘 해주셨는데요 다른곳에서도 꼭 해주시기 바랍니다
메모리 릭의 원인이 될 수 있습니다.

class SearchRepository(context: Context) {
private val dbHelper = PlaceDBHelper(context)

fun isDataExists(category: String): Boolean {

Choose a reason for hiding this comment

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

이 함수는 내부에서만 사용한는 것으로 보이는데요 private을 붙여주면 좋습니다.
나중에 협업할 때 해당 함수가 외부에서 사용될 수 있다고 판단되어 무분별한 사용이 일어날 수 있습니다.

private lateinit var saveRecyclerView: RecyclerView
private lateinit var savePlaceAdapter: SavePlaceAdapter

override fun onCreate(savedInstanceState: Bundle?) {

Choose a reason for hiding this comment

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

onCreate의 로직이 다소 복잡하게 느껴집니다. 여러 기능들이 나열되어있어서 그런 것 같은데요
initView등으로 view관련 함수 + adatper 생성을 묶고
dataObserve 하는 함수를 묶어서 각각 함수를 하나씩 호출하면 가독성이 올라갈 것 같습니다.

findViews()
setCancelBtnClickListener()
editTextWatcher()
viewModel.showSavePlace()

Choose a reason for hiding this comment

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

이 동작과 아래의 더미 데이터를 넣는 동작은

class MyViewModel: ViewModel() {
    init {
        // do-something
    }
}```

으로 처리해도 좋을 것 같습니다. 이 동작들이 view를 건든다기보다 데이터로드만 하는거라 뷰에 직접적인 연관은 없어보이네요

recyclerView.layoutManager = LinearLayoutManager(this)
viewModel.places.observe(this) { places ->
searchAdapter = SearchAdapter(places) {
viewModel.savePlaces(it.name)

Choose a reason for hiding this comment

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

savePlaces를 한 후에는 항상 viewModel.showSavePlace를 호출하여 데이터 갱신이 필요해 보이는데요
이럴경우 동작이 두개더라도 하나로 묶는것이 안전할 것 같습니다.

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