[TIL] 230811 회고

서정한·2023년 8월 11일
0

내일배움캠프 7기

목록 보기
31/66

Intro

  • ViewModel과 LiveData를 공부하는중이다.

ViewModel

  • 간단하게 ViewModel에대해 구현해보았다.
  • 요 앱은 flutter를 시작하면 나오는 기본 앱이랑 유사하게 클릭할때마다 숫자가 카운팅되어 화면에 디스플레이되는 간단한 앱이다.
  • ViewModel을 배우는 이유가 대표적으로 안드로이드에서 화면이 Rotate될때 View를 새로그리게되는데 그때 기존 뷰에 남아있는 데이터들을 그대로 살리고싶을때 사용한다.
View부분
  • 심플하다. 그냥 버튼한개 텍스트뷰 한개가 끗.
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="horizontal"
    android:layout_gravity="center"
    android:gravity="center"
    tools:context=".MainActivity">

    <Button
        android:id="@+id/btn_main"
        android:text="INCREMENT"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content" />

    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_margin="10dp"
        android:id="@+id/tv_count"
        android:textSize="20sp"
        android:text="0" />

</LinearLayout>
CountViewModel
  • 여기도 심플한데 내가 뷰모델에관한 설명을 아무리봐도 구현하려고할때 감이 없어서 어떻게 시작해야할지 몰랐는데 Flutter의 Provider 구현하는거랑 살짝 비슷하게 느껴졌다.
  • 구현하면서 느낀 핵심은 여기에 선언된 변수들은 Activity, Fragment의 생명주기에서 이들이 Destroy되지않는다면 데이터가 날라가지 않는다는 것으로 이해했다.
  • 실제 카운팅 관련 변수를 선언하고 외부에서 쓸 메서드를 만들어준다.
package bootcamp.sparta.viewmodellivedatatraning1

import androidx.lifecycle.ViewModel

class CountViewModel : ViewModel(){
    private var count = 0

    fun getCount() : Int = count

    fun setCount(count: Int) {
        this.count = count
    }
}
MainActivity
  • findViewById로 뷰들을 모두 연결해준다. 그리고 화면이 바뀔 로직을 구성해주는데, 이때 화면에 보여줄 카운트 숫자 데이터를 viewModel에서 가져와주는 것 말고는 평소 앱 개발하던것과 별 차이없다.
  • ViewModel을 쓰기위해서는 ViewModelProvider를 선언하여 여기에 아까구현한 CountViewModel을 get메서드에 넘겨주면 끗. 그 후 ViewModel의 메서드를 사용하여 구성하면된다.
  • ViewModel에서는 lifecycleOwner가 존재한다. 이건 우리가 사용하는 activity나 fragment를 뜻하고, ViewModel에 Owner를 설정해줘야 ViewModel에서 해당 Owner의 lifecycle을 추적하여 그에 맞게 동기화해줄 수 있다고한다.(내가 이해한걸 정리하면 이런데 이게 적확한 설명인지는 모르겠다. 좀더 구현해보고 난 후에 다시 공부해봐야겠다.)
package bootcamp.sparta.viewmodellivedatatraning1

import androidx.appcompat.app.AppCompatActivity
import android.os.Bundle
import android.widget.Button
import android.widget.TextView
import androidx.lifecycle.ViewModelProvider

class MainActivity : AppCompatActivity() {
    lateinit var numberText: TextView
    lateinit var viewModel : CountViewModel

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)

        numberText = findViewById(R.id.tv_count)
        viewModel = ViewModelProvider(this)[CountViewModel::class.java]

        displayCount(viewModel.getCount())

        findViewById<Button>(R.id.btn_main).setOnClickListener {
            viewModel.setCount(viewModel.getCount()+1)
            displayCount(viewModel.getCount())
        }

    }

    fun displayCount(count: Int){
        numberText.text = count.toString()
    }
}

Outro

  • 공부하면서 느낀거지만 구현감을 잡는데 생각보다 많은 에너지와 시간이 쓰였다. 이론을 알아도 이걸 어떤식으로 구현하는지 그과정이 머리속에 들어오는데 또한번 시간이걸렸다. 이 과정을 단축하려면 아주 단순한 기능에 내가 공부하고싶은 개념을 적용해봐야하는데 그것을 나는 다른사람이 설명하기위해 만들었던 예제들을 찾아서 똑같이 구현해보고 내가 변경해보는 식으로 학습했었다. 이과정에서 엄청난 시간이 소요되었다. 좀더 속도감있게 학습하기위해서는 공식문서에 나온 과정대로 일단 단순한 앱에다가 바로 어떻게든 꾸역꾸역 구현해봐야겠다는 생각이들었다.
  • 요즘 새로운 개념을 학습하는 속도를 어떻게 올릴 수 있을까 생각중이다. 일단 지금의 내 솔루션은 많은 예제를 일단 구현시키고 사용법을 머리와 손가락에 때려넣은 후 그다음에 어떻게 돌아가는지 찾아보는 것이다. 물론 어떻게 돌아가는지도 실습을 통해서 알아가야하지만 지금은 거기이전에 구현할수있을정도의 습득속도를 높이는게 우선이라는 생각이든다.
profile
잘부탁드립니다!

0개의 댓글