ViewModel 이벤트, EventFlow 대신 Channel로 더 깔끔하게!
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()를 사용하여 안정성을 확보한다.