• 목록 (128)
    • Android (62)
    • Back-End (2)
    • Java (3)
    • Kotlin (16)
    • CS (7)
    • 개발 서적 (12)
    • 문제 풀이 (26)

최근 글

티스토리

전체 방문자
오늘
어제
hELLO · Designed By 정상우.
MJ_94
Android

[Android] ViewModel에서 LiveData와 StateFlow의 권장 사용 방법

Android

[Android] ViewModel에서 LiveData와 StateFlow의 권장 사용 방법

2024. 6. 20. 00:01

안드로이드 프로젝트를 개발하면서 ViewModel을 사용할 때, LiveData 혹은 StateFlow를 활용하여 데이터 변경을 관찰하고 UI에 반영한다.
이때 Mutable 변수는 private으로 설정하고 이름 앞에 _를 붙이고, 외부에 노출되는 변수는 Immutable로 사용하는 것을 흔히 볼 수 있다.

일반적인 코드 컨벤션이라고 생각할 수도 있지만, 좀 더 생각해 보면 객체지향 설계 원칙과 클린 코드 관점에서 중요한 이유가 있다.


권장 이유

1. 캡슐화 (Encapsulation)
캡슐화는 객체지향 설계의 기본 원칙 중 하나로 데이터를 직접 접근하지 못하게 하고, 데이터에 대한 접근을 제한하며, 변경을 메서드를 통해서만 할 수 있도록 한다. 
MutableLiveData나 MutableStateFlow를 private으로 설정하고 _를 붙이는 것은 데이터를 보호하고 외부에서 직접 수정할 수 없도록 한다. 이를 통해 의도하지 않은 데이터 변경을 방지할 수 있다.

2. 단일 책임 원칙 (Single Responsibility Principle, SRP)
SRP는 객체지향 설계 원칙 중 하나로, 클래스는 하나의 책임만 가져야 한다는 원칙이다.
ViewModel에서 데이터의 변경과 UI에 데이터를 제공하는 책임을 분리하는 것이 좋다. 
MutableLiveData나 MutableStateFlow를 private으로 설정하고 데이터를 변경하는 책임은 ViewModel 내부에만 존재하게 하여, ViewModel 외부에서는 데이터에 접근만 할 수 있도록 한다.

3. 클린 코드 (Clean Code)
클린 코드는 읽기 쉽고, 이해하기 쉬우며, 유지보수가 쉬운 코드를 의미한다.
_를 붙이고 private으로 설정하는 네이밍 컨벤션은 개발자가 쉽게 Mutable 변수를 식별하고, 이 변수가 외부에서 직접 변경되지 않도록 의도한 것임을 명확히 알 수 있게 해 준다.
코드의 가독성을 높이고, 실수를 줄이며, 코드 리뷰 시에도 일관된 스타일을 유지하는데 도움이 된다.

4. 불변성 (Immutability)
불변성은 데이터 변경을 최소화하고, 예상치 못한 부작용을 방지하는 중요한 프로그래밍 원칙이다.
LiveData와 StateFlow를 불변으로 제공함으로써, 외부에서 데이터를 변경할 수 없게 하여, 데이터의 일관성과 안정성을 보장한다.
특히 멀티스레딩 환경에서 데이터 경합을 줄이고, 디버깅을 용이하게 한다.

5. 코드의 예측 가능성
Mutable 변수를 private으로 하고 _를 붙이는 방식은 코드의 예측 가능성을 높여준다.
데이터가 변경되는 부분은 ViewModel 내부의 특정 메서드에서만 이루어지기 때문에, 데이터 변경을 추적하고 디버깅하기 쉬워지며 코드의 유지보수성을 향상한다.

class MyViewModel : ViewModel() {
    // Private mutable LiveData
    private val _mutableLiveData = MutableLiveData<String>()
    
    // Public immutable LiveData
    val liveData: LiveData<String> get() = _mutableLiveData
    
    // Private mutable StateFlow
    private val _mutableStateFlow = MutableStateFlow<String>("")
    
    // Public immutable StateFlow
    val stateFlow: StateFlow<String> get() = _mutableStateFlow
    
    // Function to update LiveData
    fun updateLiveData(newValue: String) {
        _mutableLiveData.value = newValue
    }
    
    // Function to update StateFlow
    fun updateStateFlow(newValue: String) {
        _mutableStateFlow.value = newValue
    }
}

 

결론

 

안드로이드 ViewModel에서 LiveData와 StateFlow를 사용할 때, Mutable 변수는 이름 앞에 _를 붙이고 private으로 설정하며, Immutable 변수를 public으로 제공하는 방식은 객체지향 설계 원칙과 클린 코드 관점에서 많은 이점을 제공한다. 이는 캡슐화, 단일 책임 원칙, 불변성, 코드의 예측 가능성, 그리고 클린 코드 작성의 중요한 측면을 충족시키며, 안정적이고 유지보수하기 쉬운 코드를 작성하는 데 도움을 준다.

이러한 권장 방식을 따라 ViewModel을 설계하면, 코드의 품질을 높이고, 팀 내 일관성을 유지하며, 프로젝트의 장기적인 유지보수성을 향상할 수 있다.

저작자표시 비영리 변경금지

'Android' 카테고리의 다른 글

[Android] Compose remember 간단 요약  (0) 2024.07.17
[Android] 시스템 설정 변경 처리하기  (0) 2024.06.25
[Android] OS 10 이상에서 알림 갯수 제한 문제 해결  (0) 2024.06.19
[Android] DiffUtil과 Payload를 활용한 RecyclerView 성능 최적화  (0) 2024.06.18
[Android] RecyclerView 성능 최적화를 위한 ListAdapter 살펴보기  (0) 2022.12.22
    'Android' 카테고리의 다른 글
    • [Android] Compose remember 간단 요약
    • [Android] 시스템 설정 변경 처리하기
    • [Android] OS 10 이상에서 알림 갯수 제한 문제 해결
    • [Android] DiffUtil과 Payload를 활용한 RecyclerView 성능 최적화
    MJ_94
    MJ_94
    안드로이드, 개발 관련 기술 블로그

    티스토리툴바

    단축키

    내 블로그

    내 블로그 - 관리자 홈 전환
    Q
    Q
    새 글 쓰기
    W
    W

    블로그 게시글

    글 수정 (권한 있는 경우)
    E
    E
    댓글 영역으로 이동
    C
    C

    모든 영역

    이 페이지의 URL 복사
    S
    S
    맨 위로 이동
    T
    T
    티스토리 홈 이동
    H
    H
    단축키 안내
    Shift + /
    ⇧ + /

    * 단축키는 한글/영문 대소문자로 이용 가능하며, 티스토리 기본 도메인에서만 동작합니다.