๐Ÿ’ป ๊ฐœ๋ฐœ์ฐจ๊ธฐ ๐Ÿฅ‹ feat.Android

Event Bus๐ŸšŒ์˜ ๋ฒ„์Šค ์ข€ ๋ฐ›์•„๋ณผ๊นŒ? ๋ณธ๋ฌธ

Development/Android

Event Bus๐ŸšŒ์˜ ๋ฒ„์Šค ์ข€ ๋ฐ›์•„๋ณผ๊นŒ?

Android_DevKick 2022. 9. 4. 19:02

์ด๋ฒˆ์— FCM์ด ์˜ค๋ฉด ํŠน์ • ํŽ˜์ด์ง€๋ฅผ ๋ณด๊ณ  ์žˆ๋‹ค๋ฉด ๊ทธ ํŽ˜์ด์ง€์—์„œ refresh๋ฅผ ํ•ด์•ผํ•˜๋Š” ์ผ์ด ์ƒ๊ฒผ๋‹ค.

๋ฐ”๋กœ ๊ตฌํ˜„ํ•˜๋ ค๊ณ  ํ•˜๋‹ค๋ณด๋‹ˆ Listener๋ฅผ ๋‹ฌ์•„์•ผํ•˜๋‚˜ ํ•˜๋Š” ์ƒ๊ฐ์„ ํ•˜๋ฉด ๋ญ”๊ฐ€ ์‚ฌ์ด๋“œ ์ดํŽ™ํŠธ๊ฐ€ ๋งŽ์ด ์ƒ๊ธธ ๊ฒƒ ๊ฐ™๊ณ  ๊ท€์ฐฎ์€ ์ž‘์—…์ด ๋˜๊ฒ ๋‹ค ์‹ถ์–ด์„œ ๊ตฌ๊ธ€๋ง์„ ํ•ด๋ณด๋‹ˆ Event Bus ๋ผ๋Š” ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์‚ฌ์šฉํ•˜๋ผ๋Š” ์ถ”์ฒœ ๊ธ€์„ ๋ณด๊ฒŒ ๋๋‹ค.

 

Event Bus๊ฐ€ ๋ญ์•ผ? ๐ŸšŒ๋ฒ„์Šค์—์„œ ๐ŸŽ‰์ด๋ฒคํŠธ๐ŸŽ‰ ํ•˜๋‚˜? (์ฃ„์†กํ•ฉ๋‹ˆ๋‹ค)

 

๋ผ๋Š” ์ƒ๊ฐ์— ๊ด€๋ จ ๊ธ€์„ ์ฐพ์•„๋ณด๋‹ˆ ๋ฒ„์Šค ๋„คํŠธ์›Œํฌ์˜ ๋™์ž‘ ๋ฐฉ์‹๊ณผ ์œ ์‚ฌํ•˜๊ฒŒ ํ•˜๋‚˜์˜ ์ด๋ฒคํŠธ๋ฅผ ๋™์ผ ์ฑ„๋„์— ์—ฐ๊ฒฐ๋œ ๋ชจ๋“  ๋…ธ๋“œ(Subscriber)๋“ค์—๊ฒŒ ๋ณด๋‚ด๋Š” ๋ฐฉ์‹ ์ด๋ผ๋Š”๋ฐ ๊ฐ„๋‹จํ•˜๊ฒŒ ๋‚˜์˜ ์šฉ์–ด๋กœ ์„ค๋ช…ํ•˜์ž๋ฉด A ์ฑ„๋„์„ ๊ตฌ๋…ํ•˜๋Š” ๋ชจ๋“  ์‚ฌ์šฉ์ž์—๊ฒŒ ์•Œ๋ฆผ(evnet)์„ ๋ณด๋‚ธ๋‹ค.

Github์— ํ•ด๋‹น ์ด๋ฏธ์ง€๋„ ๊ฐ™์ด ์žˆ๋‹ค. (์‚ฌ์‹ค ์ฒ˜์Œ ๋ดค์„ ๋• ์ดํ•ด๊ฐ€ ์ž˜ ์•ˆ ๋๋‹ค ๐Ÿ˜ซ)

 

 

Event Bus์—์„œ ์—ฌ๋Ÿฌ๊ฐ€์ง€ ์žฅ์ ์„ ์„ค๋ช…ํ•˜๊ณ  ์žˆ๋‹ค.

๋ฒˆ์—ญํ•˜๋ฉด

EventBus๋Š”

  • ๊ตฌ์„ฑ ์š”์†Œ ๊ฐ„์˜ ํ†ต์‹ ์„ ๋‹จ์ˆœํ™”ํ•ฉ๋‹ˆ๋‹ค.
    • ์ด๋ฒคํŠธ ์†ก์‹ ์ž์™€ ์ˆ˜์‹ ์ž๋ฅผ ๋ถ„๋ฆฌํ•ฉ๋‹ˆ๋‹ค.
    • Activity, Fragment ๋ฐ Background thread์—์„œ ์šฐ์ˆ˜ํ•œ ์„ฑ๋Šฅ์„ ๋ฐœํœ˜ํ•ฉ๋‹ˆ๋‹ค.
    • ๋ณต์žกํ•˜๊ณ  ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•˜๊ธฐ ์‰ฌ์šด ์ข…์†์„ฑ ๋ฐ ์ˆ˜๋ช… ์ฃผ๊ธฐ ๋ฌธ์ œ๋ฅผ ๋ฐฉ์ง€ํ•ฉ๋‹ˆ๋‹ค.
  • ์ฝ”๋“œ๊ฐ€ ๋”์šฑ ๊ฐ„๋‹จํ•ด์ง‘๋‹ˆ๋‹ค.
  • ๋น ๋ฆ…๋‹ˆ๋‹ค.
  • ์•„์ฃผ ์ž‘๋‹ค( ~ 60k jar)
  • ์‹ค์ œ๋กœ 10์–ต๊ฐœ ์ด์ƒ์˜ ์„ค์น˜ ํ”„๋กœ๊ทธ๋žจ์„ ํ†ตํ•ด ์ž…์ฆ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.
  • ๋ฐฐ๋‹ฌ ์Šค๋ ˆ๋“œ, ๊ฐ€์ž…์ž ์šฐ์„  ์ˆœ์œ„ ๋“ฑ๊ณผ ๊ฐ™์€ ๊ณ ๊ธ‰ ๊ธฐ๋Šฅ์ด ์žˆ์Šต๋‹ˆ๋‹ค.

์•ˆ๋“œ๋กœ์ด๋“œ์˜ ๊ฒฝ์šฐ ์•กํ‹ฐ๋น„ํ‹ฐ์™€ ์•กํ‹ฐ๋น„ํ‹ฐ์˜ ํ†ต์‹ ์€ intent๋ฅผ ํ†ตํ•ด, fragment์™€ activity์˜ ๊ฒฝ์šฐ๋Š” bundle์ด๋‚˜ ์ฝœ๋ฐฑ์„ ์ด์šฉํ•ด์„œ ์ œ์ž‘ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๊ทธ๋Ÿฌ๋‚˜ ์ด๋Š” ๊ฒฐํ•ฉ๋„๋ฅผ ๋†’์ด๊ณ  ์žฌ์‚ฌ์šฉ์„ฑ์„ ์ค„์ด์ง€๋งŒ ์ฝ”๋“œ๋ฅผ ๋ณต์žกํ•˜๊ฒŒ ๋งŒ๋“œ๋Š” ๋‹จ์ ์„ ์ง€๋‹ˆ๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค

๋ฌผ๋ก  ์—ฌ๋Ÿฌ๊ฐ€์ง€ ๋””์ž์ธ ํŒจํ„ด์„ ์ ์šฉํ•˜๊ณ  ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์ด์šฉํ•œ๋‹ค๋ฉด ์ถฉ๋ถ„ํžˆ ๋‹ค์–‘ํ•œ ๋ฐฉ๋ฒ•์œผ๋กœ ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. Event Bus ์—ญ์‹œ ๊ทธ ์ค‘ ํ•˜๋‚˜์ž…๋‹ˆ๋‹ค.

์ด๋Ÿฌํ•œ ๊ฒฐํ•ฉ๋„๋ฅผ ๋‚ฎ์ถ”๋ฉด์„œ ๊ฐ UI๋ผ๋ฆฌ์˜ ๋ฐ์ดํ„ฐ ํ†ต์‹ ์„ ์ข€ ๋” ์›ํ™œํ•˜๊ฒŒ ํ•˜๊ณ ์ž ํ•˜๋Š” ๊ฒƒ์ด ์ด๋ฒคํŠธ ๋ฒ„์Šค์˜ ๊ฐœ๋…์ž…๋‹ˆ๋‹ค.

๊ตฌํ˜„ํ•˜๊ธฐ ์‰ฝ๊ณ  ๊ฐ€๋ณ์ง€๋งŒ ๋‹จ์ ๋„ ์žˆ๋‹ค

  • ํ•˜๋‚˜์˜ ์ด๋ฒคํŠธ๋ฅผ ๋ชจ๋“  ๊ตฌ๋…์ž๋“ค์ด ๋ฐ›๊ธฐ ๋•Œ๋ฌธ์— ๋ฉ”๋ชจ๋ฆฌ ์‚ฌ์šฉ์ด ์ฆ๊ฐ€ํ•  ์ˆ˜ ์žˆ๋‹ค
  • ๊ฐ ๊ตฌ๋…์ž๋“ค์ด ์Šค์Šค๋กœ ํ•„ํ„ฐ๋งํ•ด์ค˜์•ผํ•จ
  • ๋ฐ์ดํ„ฐ๋ฅผ ๋ชป ๋ฐ›์„ ๋•Œ ๋ณด์žฅ โŽ

๋ชจ๋“  ๋ฐฉ์‹์—๋Š” ์žฅ๋‹จ์ ์ด ์กด์žฌํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์‚ฌ์šฉ์„ ํ•˜๊ธฐ ์ „์—๋Š” ์ถฉ๋ถ„ํžˆ ์ ์šฉํ•  ํ”„๋กœ์ ํŠธ์— ์•Œ๋งž์€ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์ธ์ง€์— ๋Œ€ํ•œ ํ™•์ธ์€ ํ•„์ˆ˜์ง€๋งŒ, ์—ฌ๋Ÿฌ๊ฐ€์ง€ ํ”„๋กœ์ ํŠธ์—์„œ Event Bus ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์˜ ์žฅ์  ๋•๋ถ„์— ์ฐจ์šฉํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

์„œ๋ก ์€ ๊ธธ์—ˆ๊ณ  ์ด์ œ ์ ์šฉํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์„ค๋ช…ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค!

  1. gradle์— ์ ์šฉ
implementation 'org.greenrobot:eventbus:3.2.0'

2-1.

class MessageEvent { 
  /* ํ•„์š”ํ•œ ๊ฒฝ์šฐ ์ถ”๊ฐ€ */ 
}

2-2. ๊ตฌ๋…์ž ์ค€๋น„: ๊ตฌ๋… ๋ฉ”์„œ๋“œ๋ฅผ ์„ ์–ธํ•˜๊ณ  ์ฃผ์„์„ ๋‹ฌ๊ณ  ์„ ํƒ์ ์œผ๋กœ ์Šค๋ ˆ๋“œ ๋ชจ๋“œ๋ฅผ ์ง€์ •ํ•ฉ๋‹ˆ๋‹ค.

@Subscribe(threadMode = ThreadMode.MAIN)
fun onMessageEvent(MessageEvent event) {
    // ์ด๋ฒคํŠธ ๋ฐœ์ƒ์‹œ ์ฝ”๋“œ ์‹คํ–‰
}

2-3. ๊ฐ€์ž…์ž๋ฅผ ๋“ฑ๋กํ•˜๊ณ  ๋“ฑ๋ก ์ทจ์†Œํ•ฉ๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด Android์—์„œ Activity ๋ฐ Fragment๋Š” ์ผ๋ฐ˜์ ์œผ๋กœ ์ˆ˜๋ช… ์ฃผ๊ธฐ์— ๋”ฐ๋ผ ๋“ฑ๋ก๋˜์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

// this๋Š” activity์™€ fragment๋ฅผ ์˜๋ฏธ
override fun onStart() {
   super.onStart()
   EventBus.getDefault().register(this)
}
โ€‹
override fun onStop() {
    super.onStop()
    EventBus.getDefault().unregister(this)
}
// onResume๊ณผ onPause์—์„œ ์ ์šฉํ•ด๋„ ๋˜์ง€๋งŒ ๊ณต์‹ ๋ฌธ์„œ์—์„œ๋Š” onStart()์™€ onStop()์—์„œ ์‚ฌ์šฉํ•˜๊ธธ ๊ถŒ์žฅํ•จ.
  1. ์ด๋ฒคํŠธ ๊ฒŒ์‹œ
EventBus.getDefault().post(MessageEvent())

ํ•˜๋ฉด ๋์ด๋‹ค. ์ •๋ง ๊ฐ„๋‹จํ•˜์ง€ ์•Š๋‚˜์š”? ํ•˜ํ•˜ํ•˜ํ•˜

ํ•˜์ง€๋งŒ Exception์ด ๋ฐœ์ƒํ•˜๋Š” ๊ฒฝ์šฐ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.

Caused by: org.greenrobot.eventbus.EventBusException: Subscriber class MainFragment and its super classes have no public methods with the @Subscribe annotation

@Subscribe ์ฃผ์„์ด ์—†๊ณ  ์ด๋ฒคํŠธ ๋ฒ„์Šค๋งŒ ๋“ฑ๋กํ•˜๋Š” ๊ฒฝ์šฐ, ํ”„๋ž˜๊ทธ๋จผํŠธ๊ฐ€ ์ƒ์„ฑ๋  ๋•Œ, ์ด๋ฒคํŠธ๊ฐ€ ์—†๋‹ค๋Š” ์ต์…‰์…˜์„ ๋ฐœ์ƒ ์‹œํ‚ต๋‹ˆ๋‹ค.

์ด๋Š” ์“ฐ์ง€ ์•Š๋Š” ๊ณณ์—์„œ Event Bus๋ฅผ ๋“ฑ๋กํ•˜๊ณ  ํ•ด์ œํ•˜๋Š” ๊ด€๋ฆฌ๋ฅผ ํ•˜์ง€ ๋ง๋ผ๋Š” ์˜๋ฏธ๋กœ ๋ฐœ์ƒ์‹œํ‚ค๋Š” ๊ฒƒ์œผ๋กœ ๋ณด์ž…๋‹ˆ๋‹ค.

No subscribers registered for event class org.greenrobot.eventbus.NoSubscriberEvent 

Exception ๋ณด๋‹ค๋Š” Event Bus๊ฐ€ ์™œ ์‹คํ–‰๋˜์ง€ ์•Š์•˜๋Š”์ง€์— ๋Œ€ํ•ด ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์—์„œ ์ง์ ‘ ์ •์˜ํ•ด๋†“์€ ๋ถ€๋ถ„์ด๋ผ๊ณ  ๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ด๋Š” Event๊ฐ€ ๋“ฑ๋ก๋œ class์—์„œ Event๊ฐ€ ๋ฐœ์ƒํ•œ ์‹œ์ ์— Event Bus๊ฐ€ ๋“ฑ๋ก๋˜์–ด ์žˆ์ง€ ์•Š์•„์„œ ์ฐพ์„ ์ˆ˜ ์—†๋‹ค๊ณ  ์•Œ๋ ค์ฃผ๋Š” ๊ฒ๋‹ˆ๋‹ค.

๋งŒ์•ฝ Event๊ฐ€ ๋ฐœ์ƒํ•˜์ง€ ์•Š๊ณ  ์ด๋Ÿฐ Log๋ฅผ ๋ฐœ๊ฒฌํ•œ๋‹ค๋ฉด lifecycle์ด ์ œ๋Œ€๋กœ ๋˜์–ด ์žˆ๋Š”์ง€, ํ˜น์€ ์•„์˜ˆ ์ด๋ฒคํŠธ ์ž์ฒด๋ฅผ ๊ฑธ์–ด๋‘์ง€ ์•Š์€๊ฒŒ ์•„๋‹Œ์ง€ ํ™•์ธํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

Event Bus๋Š” ์‰ฝ๊ฒŒ ์‚ฌ์šฉ์ด ๊ฐ€๋Šฅํ•˜๊ณ  ๊ฐ„๋‹จํ•œ ์ž‘์—…์ธ๋ฐ ๊ฒฐํ•ฉ๋„๊ฐ€ ๋†’์€ bundle๊ณผ intent๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ๋ณด๋‹ค ๋” ๋‚ซ๋‹ค๊ณ  ์ƒ๊ฐ์ด ๋“ค์–ด์„œ ์‚ฌ์šฉํ•˜๊ฒŒ ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

๋‚˜์ค‘์— ๊นŒ๋จน์„ ๊ฒƒ ๊ฐ™๊ธฐ๋„ ํ•˜๊ณ  ์‚ฌ์šฉํ•˜๋Š” ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๊ฐ€ ์–ด๋–ป๊ฒŒ ๋Œ์•„๊ฐ€๋Š”์ง€ ์žฅ์ , ๋‹จ์ ์„ ์•Œ๊ณ  ์‚ฌ์šฉํ•˜๋ฉด ์ข‹์„ ๊ฒƒ ๊ฐ™์•„ ๋งŽ์ด๋Š” ์•„๋‹ˆ์ง€๋งŒ ์„œ์นญ ํ›„ ์ •๋ฆฌ๋ฅผ ํ•ด๋‘ก๋‹ˆ๋‹ค.