아카이브사이트맵
© 2026 Rayon. All rights reserved.
DevDay
아티클랭킹스페이스채용
헤이딜러 favicon헤이딜러

ViewModel 이벤트, EventFlow 대신 Channel로 더 깔끔하게!

by DD
2025-03-06
1년 전
조회수 16

ViewModel 내 One-time 이벤트 처리를 위해 EventFlow를 사용했으나, Channel로 대체

Channel은 EventFlow의 요구사항(구독자 부재 시 이벤트 보존, 중복 처리 방지)을 더 간결하게 충족

Channel.BUFFERED를 사용하여 구독 여부와 관계없이 이벤트 전송, UI 생명주기에 따른 collect 문제 해결

EventFlow에서 Channel로의 전환

ViewModel에서 One-time 이벤트 처리를 위해 EventFlow를 사용했지만, Channel이 더 적합하다. Channel은 구독자가 없을 때 이벤트를 보존하고, 중복 처리를 방지하는 EventFlow의 핵심 요구사항을 간결하게 충족한다. 따라서, 코드 단순화와 유지보수성 향상을 기대할 수 있다.

Channel.BUFFERED의 중요성

Channel.BUFFERED를 사용하면 구독 여부와 관계없이 이벤트를 버퍼에 저장하여, UI가 Backgroud에 있거나 화면 회전 시에도 이벤트를 안전하게 처리할 수 있다. Channel.RENDEZVOUS는 구독자가 없으면 send()가 suspend되므로, 이벤트 유실의 위험이 있다. 따라서 UI 생명주기에 따른 collect()의 문제를 해결한다.

receiveAsFlow() vs consumeAsFlow()

receiveAsFlow()는 collect()가 끝나도 Channel을 닫지 않아, UI의 Lifecycle에 따라 여러 번 collect()하는 경우에 적합하다. consumeAsFlow()는 collect()가 끝나면 Channel을 닫아, UI가 다시 화면에 보여질 때 오류 발생 가능성이 있다. 따라서 UI 재구독 시 receiveAsFlow()를 사용하여 안정성을 확보한다.

ViewModel에서 더이상 EventFlow를 사용하지 마세요
중급
아키텍처
Kotlin
Flow
Channel
Backend
원문 읽기
원문 읽기

댓글 0

첫 번째 댓글을 남겨보세요!

관련 추천 글

Kotlin Flow로 안드로이드 앱 데이터 흐름을 깔끔하게!

여기어때 로고

CodeQL 2.26.0: Kotlin 2.4.0 지원 및 AI 프롬프트 주입 탐지

깃헙 로고

코드큐엘(CodeQL) 업데이트: Go, Kotlin 지원 강화 및 쿼리 정확도 향상

깃헙 로고

Kotlin DSL로 전시 도메인 코드 가독성을 높이다!

여기어때 로고

Spring Boot 4, Kotlin 개발 환경을 더욱 강력하게!

스프링 로고

Kotlin Coroutine으로 비동기 시스템 구축, 성능 UP!

신세계 로고
헤이딜러 favicon헤이딜러
중급
아키텍처
Kotlin
Flow
Channel
Backend

관련 추천 글

Kotlin Flow로 안드로이드 앱 데이터 흐름을 깔끔하게!

여기어때 로고

CodeQL 2.26.0: Kotlin 2.4.0 지원 및 AI 프롬프트 주입 탐지

깃헙 로고

코드큐엘(CodeQL) 업데이트: Go, Kotlin 지원 강화 및 쿼리 정확도 향상

깃헙 로고