상식닷컴
로그인
가입하기
2026년 상식닷컴 선정 식당 & 카페 리스트
2025년 2026년 신상 호텔 리스트
최근에 오픈한 호텔을 찾는다면 살펴보세요
일주일 식단표 어플
자동 일주일 식단표 어플
안드로이드
아이폰
주식 & 코인 차트의 신
1000만원으로 2000만원 만들기 프로젝트
수정하기 - LiveData에서 List<T> 변경을 옵저빙하는 방법은?
닉네임
비밀번호
제목
내용
[이미지 업로드는 권한이 있는 사람만 가능. 하단 카톡으로 연락]
LiveData에서 L<a href='https://sangseek.com/sangseeks/ist<T>/ko'>ist<T></a> 타입의 데이터를 관찰(observe)할 때, 리스트 내부의 요소가 변경되었을 때 자동으로 <a href='https://sangseek.com/sangseeks/옵저버/ko'>옵저버</a>가 호출되지 않는 점을 이해하는 것이 중요합니다. LiveData는 기본적으로 값의 참조(reference) 변경을 감지하기 때문입니다. 즉, 리스트 객체 내의 요소들을 변경해도 리스트 객체 참조가 바뀌지 않으면 옵저버가 동작하지 않습니다. 이해를 돕기 위해 LiveData<<a href='https://sangseek.com/sangseeks/List<T>/ko'>List<T></a>>에서 리스트 변경을 제대로 옵저빙하는 방법을 단계별로 설명하겠습니다. --- 기본 동작 및 문제점 - LiveData가 hold하는 값은 `List<T>` 객체입니다. - 리스트 내부 요소를 추가하거나 삭제해도, 리스트 객체의 참조는 그대로이므로 LiveData 값이 변경된 것으로 인식되지 않습니다. - 따라서 UI에 변화가 있어도 옵저버가 호출되지 않고, 화면에 변경이 반영되지 않습니다. 예를 들어 다음과 같은 코드가 있다고 가정합시다: ```kotlin val itemsLiveData = MutableLiveData<List<String>>() // 기존 리스트에 요소 추가 val currentList = itemsLiveData.value ?: emptyList() val newList = currentList.toMutableList() newList.add("새로운 항목") itemsLiveData.value = newList ``` - 여기서는 MutableList를 새로 만들어서 LiveData에 새로 할당했기 때문에 `value`의 참조가 달라져 옵저버가 호출됩니다. - 그러나 만약 `itemsLiveData.value?.add("새로운 항목")` 식으로 직접 원본 리스트를 수정하면 호출되지 않습니다. --- 1. 리스트 변경 시 새로운 리스트 객체로 할당하기 가장 안전하고 기본적인 방법은 리스트 내부 요소를 변경할 때마다 새로운 리스트 객체를 만들어서 LiveData에 할당하는 것입니다. ```kotlin // 기존 리스트 복사 후 수정 val currentList = itemsLiveData.value ?: emptyList() val updatedList = currentList.toMutableList() updatedList.add(newItem) itemsLiveData.value = updatedList ``` - 이렇게 하면 LiveData의 참조가 변경되어 데이터 변경을 감지합니다. - UI 옵저버는 새로운 리스트를 받으므로 자동으로 UI를 업데이트할 수 있습니다. --- 2. `MutableLiveData<List<T>>`와 `postValue()`를 함께 사용하기 - LiveData는 값 변경을 메인 스레드에서 해야 하므로, 백그라운드 스레드에서 변경할 때는 `postValue()`를 써야 합니다. - 이 경우에도 역시 새로운 리스트 객체로 만들어 postValue 호출을 해야 합니다. ```kotlin val currentList = itemsLiveData.value ?: emptyList() val updatedList = currentList.toMutableList() updatedList.add(newItem) itemsLiveData.postValue(updatedList) ``` --- 3. List의 원소 변경 감지 (복잡한 경우) - 단순히 리스트에 항목 추가나 삭제 외에 리스트 내부 아이템 객체의 속성 변경을 감지하는 것은 LiveData에서 직접 지원하지 않습니다. - 예를 들어 `List<MyData>`이고 MyData 내부 속성만 변경된다면 LiveData는 참조 변경이 없기 때문에 알지 못합니다. 이런 경우 고려할 방법은: - 아이템 객체에 Observable 패턴(예: ObservableField, RxJava의 Observable 등)을 적용해 내부 속성 변화를 감지. - 아이템 변경 시 전체 리스트를 복사해서 LiveData에 다시 할당. - 리스트 대신 `LiveData<Map<Key, Value>>` 등 변경 추적이 용이한 다른 데이터 구조 사용. - Android의 `ListAdapter`와 `DiffUtil` 사용하는 경우에도 동일하게 리스트가 새로 할당되어야 변경이 잘 반영됩니다. --- 4. 추천 라이브러리 및 구조 - 최근에는 Jetpack Compose 또는 `StateFlow`/`SharedFlow` 같은 Flow 계열 API를 함께 사용하는 것을 권장합니다. - LiveData 대신 `MutableStateFlow<List<T>>`를 쓰면 내부 요소 변경도 더 효율적으로 처리가 가능합니다. - 하지만 LiveData를 써야 하는 <a href='https://sangseek.com/sangseeks/기존 환경/ko'>기존 환경</a>에서는 위에 설명한 방식대로 새로운 리스트 할당 방식을 사용하는 것이 가장 보편적입니다. --- 요약 - LiveData는 참조(reference) 변경만 감지하므로, 리스트 내부 변화는 감지하지 못합니다. - 리스트 요소를 변경할 때는 반드시 새로운 리스트 객체를 만들어 `setValue`나 `postValue`로 다시 할당해야 옵저버가 호출됩니다. - 아이템 자체 변경을 감지해야 한다면, 각 아이템의 자체 변경 감지 로직을 추가하거나, 리스트를 새로 생성해서 LiveData에 할당하는 패턴을 권장합니다. --- 이런 기본 원리를 이해하고 적용하면 LiveData에서 List<T> 변경을 <a href='https://sangseek.com/sangseeks/정확하고 효율적/ko'>정확하고 효율적</a>으로 옵저빙할 수 있습니다.
이용안내
커뮤니티 이용안내
×
- 게시한 게시글로 발생하는 문제는 게시자에게 책임이 있습니다.
- 게시글이 타인/타업체의 저작권을 침해할 경우 모든 책임은 게시자에게 있습니다. 게시자가 모든 손해를 부담해야 합니다.
- 상식닷컴 운영자는 게시자와 상의하지 않고 게시글을 수정 또는 삭제할 수 있습니다.
- 상식닷컴 운영자는 깨끗한 커뮤니티 공간을 만드는 것이 1순위입니다.
수정하기
취소하기