안드로이드 자바

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

teamnova 2025. 5. 10. 00:00
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()));
    }
}



 

 

실행 결과

 

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