TIL - 20
# Android One-Time Events
안드로이드 프로젝트에서 단일성 이벤트를 처리할 때 어떻게 처리하시나요? “SingleLiveEvent”를 사용하시나요? “LiveEvent”에서 “Event”를 맵핑해서 사용하시나요? 아니면 “Channel”을 사용하시나요? 아니면 “SharedFlow” 또는 “StateFlow”를 사용하시나요? 정말로 많은 공식 문서 및 아티클을 찾아봤는데 사람마다 사용하는 방법이 정말로 다양하게 있는 것 같습니다.
## Android Developer 에서 추천하는 방법?
Android Developer 블로그 글을 보면 ( https://medium.com/androiddevelopers/viewmodel-one-off-event-antipatterns-16a1da869b95 ) “Channel” 및 “SharedFlow”는 백그라운드에 가서 이벤트를 들을 소비자가 없는 경우 예기치 못한 버그를 야기한다고 합니다. 따라서 StateFlow에서 캐싱 된 State를 사용하여 이벤트를 세팅한 후 끝난 후에는 State 값을 변경하여 단일성 이벤트를 처리하라고 권고합니다. 이러한 글뿐만 아니라 공식 문서상에서도( https://developer.android.com/topic/architecture/ui-layer/events?hl=ko#consuming-trigger-updates ) 이벤트 처리 후 state 값을 변경해서 처리하는 것을 알 수 있습니다.
## StateFlow로 단일성 이벤트 정말로 좋은 것인가…
모든 프로젝트에 “StateFlow”를 통해 이벤트 처리를 할 수 있으면 정말로 좋겠지만 쉽지 않은 케이스도 나오게 됩니다. 블로그 댓글만 봐도 동의하는 댓글도 있지만 비동의하는 댓글도 만만치 않게 많이 보인다는 것을 알 수 있습니다. navigation에 대한 처리가 쉽지 않을 수 있다는 의견, 다시 이벤트를 off 하는 state를 처리하지 않으면 또 다른 버그가 야기할 수 있다는 의견, 너무 코드상 복잡해진다 등 다양한 의견들이 있습니다. 저도 단순한 이벤트 처리면 StateFlow로도 가능하겠지만 정말로 다양한 유즈케이스들이 존재한다면 “StateFlow”만으로 처리하기 어렵다고 생각합니다.
## 결론?
안타깝지만 아직 명확한 답을 못 찾은 상태입니다. SingleLiveEvent, Channel, StateFlow등 각 프로젝트에 맞게 구현하는 게 현 상황에 맞는 것 같습니다. (안드로이드에서 더 좋은 솔루션을 제공하면 좋겠네요…)
최근에 본 영상에서 해당 토픽 관련해서 흥미로운 의견을 볼 수 있었습니다. 시간이 되시면 한번 보시는걸 추천드립니다. 해당 영상을 요약하면, 간단하게 사용할 거면 “SharedFlow” 에 buffer를 줘서 사용하는 방법, “Channel”을 사용하려면 Dispatcher를 “Dispatcher.Main.immediate”를 사용해서 이벤트를 처리하는 것을 추천해 주고 있습니다.
안드로이드 프로젝트에 대한 고민을 나눠주셔서 감사합니다! 다양하게 적용 가능한 방법들을 언급해주시니 더 머리가 복잡하실 것 같네요.😅 영상 소개도 감사드려요! 이런 공유로 인해 다른 유저들도 많은 도움을 받을 수 있을 거에요. 다양한 의견을 주고받는 원티드 소셜이 되도록 노력하겠습니다! 👍🏻😃