도리안의 2025년 개발기 #104 - Room으로 데이터 읽기는 즉시 반환 함수보다 Flow 권장
Room으로 데이터 읽기는 즉시 반환 함수보다 Flow 권장
No. 104
2025. 06. 09 (월) | Written by @dorian-dev
오늘의 개발기
안드로이드 앱에서 다음과 같은 2개의 함수들이 뷰모델(ViewModel) 클래스 안에 정의한다고 가정해보자.
- addPoint(userId: String, point: Int): Unit
- userId 계정의 사용자에게 point 수량의 포인트를 추가
- 사용자, 포인트 정보는 Room 데이터베이스에 저장
- getPoint(userId: String): Int
- userId 계정의 사용자의 포인트 수량 구하기
다음과 같은 시나리오를 고려할 수 있다.
- addPoint 함수를 호출하여 특정 사용자에 포인트 100 추가
- getPoint 함수를 호출하여 화면에 보여줄 포인트 수량 읽기
여기서 질문. addPoint 함수를 호출한 직후 getPoint 함수를 호출하면, 사용자의 포인트를 정상적으로 구할 수 있을까? 그러지 못할 가능성이 있다. 이유는 다음과 같다.
- Room 데이터베이스 접근은 메인 스레드에서 실행할 수 없기 때문에
- addPoint, getPoint 함수들은 비동기로 실행되어야 한다.
- 타이밍에 따라 getPoint는 업데이트 이전 값을 읽을 가능성이 있다.
그러면 대안은 무엇일까?
포인트를 즉시 리턴하는 getPoint 함수 대신, 사용자의 포인트를 구독 형태로 제공하는 Flow를 사용하는 것이 더 좋다.
fun getPoint(userId: String): Flow<Int>
구독의 장점
- addPoint 함수로 포인트가 업데이트 될 때마다
- getUserPointFlow를 통해 구독 중인 Flow로부터 최신 포인트를 받고 이를 화면에 업데이트할 수 있다.
참고
Room으로부터 데이터를 즉시 리턴하는 함수는 지양하는 것이 좋다. 그 대신, Flow, StateFlow, LiveData 등을 활용하여 데이터를 구독하는 패턴이 더 권장된다. Jetpack Compose에서는 collectAsState() 등을 함께 사용하여 UI를 자동으로 업데이트할 수 있다.
추가 후기
Flow 사용은 점점 익숙해지고 있지만, 함수를 통한 데이터 반환이 여전히 더 편한 것 같다. 그래서 위와 같은 시행 착오를 겪은 것이라 생각한다. 이러한 패턴이 아직 남아 있는지 확인하고, 리팩토링을 해야 할 것이다.
지난 2025년 개발기
- #103 - 매주 금요일 저녁에는 '한주 동안 내가 한 일'을 기록하며 회고
- #102 - Jetpack Compose로 클릭 처리시, 팝업이 잠시 보이고 다시 사라지는 문제
- #101 - 홈 화면에서 진도율이 0%만 뜨는 버그를 수정하며 배운 점
- #1 ~ #100
Layout provided by Steemit Enhancer hommage by ayogom
Posted through the ECblog app (https://blog.etain.club)
안녕하세요.
SteemitKorea팀에서 제공하는 'steemit-enhancer'를 사용해 주셔서 감사합니다. 개선 사항이 있으면 언제나 저에게 연락을 주시면 되고, 관심이 있으신 분들은 https://cafe.naver.com/steemitkorea/425 에서 받아보실 수 있습니다. 사용시 @응원해 가 포함이 되며, 악용시에는 모든 서비스에서 제외될 수 있음을 알려드립니다.
안녕하세요.
이 글은 SteemitKorea팀(@ayogom)님께서 저자이신 @dorian-dev님을 응원하는 글입니다.
소정의 보팅을 해드렸습니다 ^^ 항상 좋은글 부탁드립니다
SteemitKorea팀에서는 보다 즐거운 steemit 생활을 위해 노력하고 있습니다.
이 글은 다음날 다시 한번 포스팅을 통해 소개 될 예정입니다. 감사합니다!