본문 바로가기
안드로이드 자바

[Java][Android] viewmodel 활용 예시 만들기

by teamnova 2025. 5. 10.
728x90

오늘은 viewmodel을 활용해 구성변경에도 데이터를 유지하는 숫자 증감 기록 기능 예시를 만들어 보겠습니다.

 

viewmodel은 액티비티 또는 프래그먼트에 쓰이는 데이터를 준비하고 관리하는 것을 책임지는 역할로 쓰일 수 있는 클래스입니다. viewmodel이 관리하는 데이터는 화면 회전과 같은 구성 변경이 발생해도 유지되며, 액티비티나 프래그먼트가 완전히 종료될 때까지 메모리에 남아있습니다.

UI 관련 코드와 데이터 처리 로직이 분리되 코드 구조 관리에 유리, 액티비티/프래그먼트가 완전히 종료될 때 viewmdoel도 함께 정리 됨에 따른 메모리 누수 방지, 구성 변경 시 데이터 자동 보존으로 별도 코드 작성 부담 감소 등의 장점을 가집니다.

 

 

레이아웃 xml 파일 코드(activity_main.xml)

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    android:gravity="center">

    <TextView
        android:id="@+id/counter_text"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="0"
        android:textSize="48sp"
        android:layout_marginBottom="32dp"/>

    <LinearLayout
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:orientation="horizontal">

        <Button
            android:id="@+id/decrement_button"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="-"/>

        <Button
            android:id="@+id/reset_button"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="리셋"
            android:layout_marginHorizontal="16dp"/>

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

    </LinearLayout>

</LinearLayout>



 

 

액티비티 자바 코드

public class MainActivity extends AppCompatActivity {
    private CounterViewModel viewModel;
    private TextView counterTextView;
    private Button incrementButton;
    private Button decrementButton;
    private Button resetButton;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        // UI 구성요소 참조 가져오기
        counterTextView = findViewById(R.id.counter_text);
        incrementButton = findViewById(R.id.increment_button);
        decrementButton = findViewById(R.id.decrement_button);
        resetButton = findViewById(R.id.reset_button);

        // ViewModel 인스턴스 획득
        viewModel = new ViewModelProvider(this).get(CounterViewModel.class);

        // 초기 UI 업데이트
        updateCounterDisplay();

        // 버튼 클릭 리스너 설정(증가)
        incrementButton.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                viewModel.incrementCounter();
                updateCounterDisplay();
            }
        });

        // 버튼 클릭 리스너 설정(감소)
        decrementButton.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                viewModel.decrementCounter();
                updateCounterDisplay();
            }
        });

        // 버튼 클릭 리스너 설정(리셋)
        resetButton.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                viewModel.resetCounter();
                updateCounterDisplay();
            }
        });
    }

    // UI 업데이트 메서드
    private void updateCounterDisplay() {
        counterTextView.setText(String.valueOf(viewModel.getCounter()));
    }
}



 

 

실행 결과

 

화면 회전 같은 구성변경 발생시 데이터가 유지되는 것을 확인할 수 있습니다.