์๋๋ก์ด๋๋ฅผ ์ ํ์ง๋ 1๋ ์ด ๋์ด๊ฐ๋ค. ๊ทธ ์ค์ ์ ๋ง ์ง์คํด์ ํ ๊ธฐ๊ฐ์ 6๊ฐ์ ์ ๋๋ค. ๋ ๊ตฌํ์๋ง ์ ๊ฒฝ์ผ๊ธฐ ๋๋ฌธ์ ์์กด์ฑ์ ๋ถ๋ฆฌํ๋ ๊ฒ ์ข๋ค๋ ์์ฃผ ๊ธฐ์ด์ ์ธ ์ง์๋ง์ ๊ฐ๊ณ ์์๋ค. ์ด๋ฒ์ ์ ํ๋ก์ ํธ์ ์ฐธ์ฌํ๊ฒ ๋๋๋ฐ ๋ฏผํ๋ฅผ ๋ผ์น์ง ์๊ธฐ์ํด ๊ณต๋ถ๋ฅผ ํด์ผํ๋ค. ์ฒซ๋ฒ์งธ๋ก MVVM์ด๋ค.
์ผ๋ฐ ์ํคํ ์ฒ ์์น
ํจํด์ ๋ค์ด๊ฐ๊ธฐ ์ ์ ์๋๋ก์ด๋ ๊ณต์ ๋ฌธ์์์ ์ง์ ํ ์ํคํ ์ฒ ์์น์ ํ์ตํ๊ฒ ๋ค. ๋ฒ์ญ ์ค๋ฅ๋ฅผ ํผํ๊ธฐ ์ํด ์๋ฌธ๊ณผ ๊ฐ์ด ๋ดค๋ค.
- ๊ด์ฌ์ฌ๋ถ๋ฆฌ
- ๋ฐ์ดํฐ ๋ชจ๋ธ์์ UI ๋์ถํ๊ธฐ
- ๋จ์ผ ์์ค ์ ์ฅ์
- ๋จ๋ฐฉํฅ ๋ฐ์ดํฐ ํ๋ฆ
์ด๋ ๊ฒ ๋ค ๊ฐ์ง๊ฐ ์ฃผ์ด์ก๋ค.
๊ด์ฌ์ฌ ๋ถ๋ฆฌ Separation of concerns
๊ฐ์ฅ ์ค์ํ๊ณ ์ ์ผ ์ฐ์ ์ ๋์ด์ผ ํ ์์น์ด๋ค. Activity
๋ Fragment
๋ UI๊ธฐ๋ฐ ํด๋์ค๋ค. ์ด ๊ฒฝ์ฐ UI ๋ฐ ์ด์์ฒด์ ์ํธ์์ฉ์ ์ฒ๋ฆฌํ๋ ๋ก์ง๋ง ํฌํจํด์ผํ๋ค. ๋ด๋นํ๋ ๋ถ๋ถ์ ๋ถ๋ฆฌํ๋ค๋ ๊ฐ๋
์ผ๋ก ๊ฐ ํด๋์ค๋ผ๋ฆฌ ์์กด์ฑ์ ๋ฎ์ถ๋ ๋ฐฉ๋ฒ์ด๋ค. Activity๋ Fragment๋ ๋จ์ง Android OS
์ ์ฑ์ ์ฐ๊ฒฐํด์ฃผ๋ ์ค๊ฐ๋ค๋ฆฌ๋ค. OS๊ฐ ์ฌ์ฉ์์ ์์ฒญ์ด ๋ค์ด์ค๋ฉด ์ธ์ ๋ ์ง ๋ฉ๋ชจ๋ฆฌ์์ ๋ ๋ฆด ์ ์๊ธฐ ๋๋ฌธ์ ์ด๋ฐ ๊ด์ฌ์ฌ๋ฅผ ๋ถ๋ฆฌํ๋ ์์
์ ํ์๋ค.
๋ฐ์ดํฐ ๋ชจ๋ธ์์ UI ๋์ถํ๊ธฐ Drive UI from data models
๋ฐ์ดํฐ ๋ชจ๋ธ์ ์ฑ์ ๋ฐ์ดํฐ๋ฅผ ์๋ฏธํ๋ค. ์ฑ์ UI์์ ๋ฐ ๊ธฐํ ๊ตฌ์ฑ์์์ ๋ ๋ฆฝ๋์ด์๋ ๋ชจ๋ธ์ด๋ค(์๋ช ์ฃผ๊ธฐ์ ๋ถ๋ฆฌ). ์ฑ์ ๋ฐ์ดํฐ์ด๋ฏ๋ก ์ฑ์ ํ๋ก์ธ์ค๋ฅผ os๊ฐ ์ ๊ฑฐํ๋ฉด ๋น์ฐํ ๋ฐ์ดํฐ ๋ชจ๋ธ๋ ์ ๊ฑฐ๋๋ค.
๊ฐ๊ธ์ ์ด๋ฉด ์ง์๋ชจ๋ธ(persistent models)์ ๊ถ์ฅํ๋๋ฐ, ์ฒซ๋ฒ์งธ๋ก OS๊ฐ ๋ฆฌ์์ค๋ฅผ ํ๋ณดํ๊ธฐ ์ํด์ ๋ฉ๋ชจ๋ฆฌ์์ ์ฑ์ ์ ๊ฑฐํด๋ ์ฌ์ฉ์ ๋ฐ์ดํฐ๊ฐ ์ญ์ ๋์ง์๋๋ค. ์ด๊ฒ์ ๋ฐฉ๊ธ ๋งํ ํ๋ก์ธ์ค๊ฐ ์ ๊ฑฐ๋๋ฉด์ ๋ฐ์ดํฐ ๋ชจ๋ธ์ด ์ ๊ฑฐ๋๋ค๋ ๊ฒ๊ณผ ์กฐ๊ธ ๋ค๋ฅธ๋ฐ, ์ฌ์ฉ ์ค์ด๋ ์์ ๋ฐ์ดํฐ ๋ชจ๋ธ์ ์ ๊ฑฐํ๋ ๊ฒ์ด๊ณ ์ด๊ฑธ ๋ณ๋์ ์ ์ฅ์์ ๋ฃ์ผ๋ฉด ์ฑ์ ์ ๊ฑฐํด๋ ์ฌ์ฉ์ ๋ฐ์ดํฐ๊ฐ ๋จ์์๊ฒ ๋๋ค. ๋๋ฒ์งธ๋ก ๋คํธ์ํฌ ์ฐ๊ฒฐ ์ ๋ฌด์ ์๊ด ์์ด ์ฑ์ด ๋์ํ๋ค๋ ๊ฒ์ด๋ค. ๋ฐ์ดํฐ๊ฐ ๋คํธ์ํฌ์ ์์กด์ ์ด๋ฉด ์ด๋ ๊ฒ ๋์ํ์ง ์๋๋ค.
๋จ์ผ ์์ค ์ ์ฅ์ SSOT(Single source of truth)
์ ๋ฐ์ดํฐ๊ฐ ์ ์๋ ๋ ์ด ๋ฐ์ดํฐ๋ฅผ SSOT์ ํ ๋นํด์ SSOT๋ง ์์ ํ๊ฑฐ๋ ๋ณ๊ฒฝํ ์ ์๊ฒ ํด์ผํ๋ค. ์ด๊ฑธ ์ํด immutable type์ผ๋ก ์ฌ์ฉํด์ ๋ฐ์ดํฐ๋ฅผ ์ฝ๊ฒ ํด์ผํ๋ค. ๋จ์ผ ์์ค๋ฅผ ์ด์ฉํด์ ๋ฐ์ดํฐ์ ์ ๊ทผํ๊ธฐ ๋๋ฌธ์ ์๋ชป๋ ๋ฐ์ดํฐ ์ฌ์ฉ์ ๋ฐฉ์งํ๊ณ ๋ฐ์ดํฐ ๋ณ๊ฒฝ์ฌํญ ์ถ์ฒ์ ์ฝ๊ฒ ๋ง๋ค์ด ๋ฒ๊ทธ ๋ฐ๊ฒฌ์ ์ฉ์ดํ๋ค.. ๋ ํน์ ์ ํ ๋ฐ์ดํฐ์ ๋ชจ๋ ๋ณ๊ฒฝ์ฌํญ์ ํ๊ตฐ๋ฐ๋ก ๋ชจ์๋ค.
์ฌ๊ธฐ์ ๋งํ๋ ์์ค์ ํด๋นํ๋ ๊ฒ์ผ๋ก๋ DB
, ViewModel
, UI
๋ฑ์ด ์๋ค.
๋จ๋ฐฉํฅ ๋ฐ์ดํฐ ํ๋ฆ UDF(Unidirectional Data Flow)
๋ฌธ์์์ ์ฌ์ฌ์ฐฎ๊ฒ ๋ณผ ์ ์๋ ์ฉ์ด๋ค. SSOT๊ฐ UDFํจํด๊ณผ ํจ๊ป ์ฌ์ฉ๋๊ธฐ๋ ํ๋ค. UDF์์ ์ํ(state)๋ ๋จ๋ฐฉํฅ์ผ๋ก๋ง ํ๋ฅธ๋ค. ๋ฐ์ดํฐ๋ฅผ ์์ ํ๋ ํ๋ฆ์ธ ์ด๋ฒคํธ(event)๋ ์ํ์ ๋ฐ๋๋ฐฉํฅ์ผ๋ก ํ๋ฅธ๋ค. ๋ณดํต ์ํ๋ ๋ฐ์ดํฐ๋ ์์ ๋ฒ์์์ ํ์ ๋ฒ์๋ก ํ๋ฅธ๋ค. ์ด๋ฒคํธ๋ ํ์ ๋ฒ์์์ ํธ๋ฆฌ๊ฑฐ๋ผ์ ์ํธ์์ฉํ๋ ๋ฐ์ดํฐ์ SSOT์ ๋๋ฌํ๋ค.
App Data
-> UI, UI(ํฐ์น์ ๊ฐ์ ์ฌ์ฉ์ ์ด๋ฒคํธ)
-> SSOT์์ ๋ฐ์ดํฐ ์์
UDF๋ฅผ ์ฌ์ฉํ๋ฉด ๋ ์ ์ ์ค๋ฅ์ ๋ฐ์ดํฐ ์ผ๊ด์ฑ์ ๋ณด์ฅํ๋ค. ์ผ๊ด์ฑ์ ๋๋ฒ๊ทธ๋ฅผ ์ฝ๊ฒ ๋ง๋ ๋ค.
MVVMํจํด
MVVM์ Model
- View
- ViewModel
์ ์ฝ์๋ค.
๋ทฐ๋ UI๋ฅผ ์๊ฐํ๋ฉด ๋๊ณ , Model์ ๋น์ฆ๋์ค ๋ก์ง(๋ฐฑ์๋ ๋ก์ง)์ ์๊ฐํ๋ฉด ๋๋ค. ๋น์ฆ๋์ค ๋ก์ง์ ์ฑ์ ๋ฐ์ดํฐ ์์ฑ, ์ ์ฅ, ๋ณ๊ฒฝ ๋ฐฉ์ ๋ฑ์ ๊ฒฐ์ ํ๋ ๊ท์น์ด๋ค. ์ด ๋ทฐ์ ๋ชจ๋ธ์ ๋ถ๋ฆฌ์ํค๋ฉด ๋ทฐ๋ฅผ ์ด๋ ํน์ ๋ชจ๋ธ์ ์ข ์์ํค์ง ์์ ์ ์๋ค. ๋ถ๋ฆฌ์ํค๊ธฐ ์ ์๋ ํน์ ๋ชจ๋ธ์๋ ํน์ ๋ทฐ๊ฐ ์ข ์๋์ด์๋ ํํ๋ค. ๋ทฐ ๋ชจ๋ธ์ ๋ชจ๋ธ์ ๋ฐ์ดํฐ ๊ฐ์ฒด๋ฅผ ๋ทฐ๋ก ๋ณํํ๋ ๊ฐ ๋ณํ๊ธฐ๋ค. ๊ทธ๋์ ๋ทฐ ๋ชจ๋ธ์ ๋ทฐ๋ณด๋ค ๋ชจ๋ธ์ ๊ฐ๊น๊ณ ๋ทฐ์ ๋์คํ๋ ์ด ๋ก์ง ์ด์ธ์ ๋๋ถ๋ถ ์์ ์ ์ฒ๋ฆฌํ๋ค. MVVM์ ๋ชจ๋ธ - ๋ทฐ - ๋ฐ์ธ๋๋ผ๊ณ ๋ ํ๋๋ฐ ์ด๊ฑด ๊ตฌ์ฑ์์๋ฅผ ์ข ๋ ์ดํผ๋ฉด์ ์์๋ณด๊ฒ ๋ค.
๋ชจ๋ธ Model
๋ชจ๋ธ์ ์ค์ ์ํ/๋ฐ์ดํฐ ๋ด์ฉ์ ํํํ๋ ๋ฐ์ดํฐ ์ ๊ทผ ๊ณ์ธต์ ์ฐธ์กฐํ๋ค. ๋ฐ์ดํฐ์ ๊ฐ์ฅ ๊ฐ๊น์ด ๋ ์ด์ด๋ค.
๋ทฐ View
๋ทฐ๋ UI์ ํด๋นํ๋ค. ์ฌ์ฉ์๊ฐ ๋ณด๋ ๋ชจ๋ ๊ฒ์ ์ง์นญํ๋ฉฐ, ๋ชจ๋ธ์ ๋ณด์ฌ์ ํํํ๊ณ ๋ทฐ์ ์ฌ์ฉ์ ๊ฐ์ ์ด๋ฒคํธ๋ฅผ ์์ ํด์ ๋ทฐ-๋ทฐ๋ชจ๋ธ ์ฌ์ด์ ๋ฐ์ดํฐ ๋ฐ์ธ๋ฉ์ ํตํด ๋ทฐ๋ชจ๋ธ๋ก ์ด๋ฒคํธ๋ฅผ ์ ๋ฌํ๋ค.
๋ทฐ ๋ชจ๋ธ ViewModel
MVVMํจํด์ ํต์ฌ์ด๋ค. MVC์์ ์ปจํธ๋กค๋ฌ, MVP์์ ํ๋ฆฌ์ ํฐ๋ฅผ ๋์ ํ๋ ์ญํ ์ด๋ฉฐ ๋ชจ๋ธ์ ์๋ ๋ฐ์ดํฐ์ ์ํ๋ฅผ ๋ทฐ๋ก ๋ณํํ๋ ๊ฐ ๋ณํ๊ธฐ์ด๋ค. ํ๋ฆฌ์ ํฐ์ ๋ทฐ๋ชจ๋ธ์ ์ฐจ์ด์ ์ ๋ทฐ์ ๋ํ ์ฐธ์กฐ ์ ๋ฌด์ธ๋ฐ ๋ทฐ๋ชจ๋ธ์ ๋ทฐ๋ฅผ ์ฐธ์กฐํ์ง์๋๋ค. ๊ฐ์ ์ฐ๊ฒฐ์ธ ์ฐธ์กฐ๊ฐ ์๋๋ผ, ์ง์ ๋ฐ์ธ๋ฉ์ ํด์ ์ ๋ฐ์ดํธ๋ฅผ ์ฃผ๊ณ ๋ฐ๋๋ค. ๋ฐ๋ผ์ ๋ฐ์ธ๋๊ฐ ํ์ํ๋ค.
๋ฐ์ธ๋/์ฐ๊ฒฐ์ Binder
๋ฐ์ธ๋๋ ๋ทฐ๋ชจ๋ธ์ ์๋ ๋ทฐ์ ์ฐ๊ฒฐ๋ ์์ฑ๊ณผ ๋ทฐ ์ฌ์ด์ ํต์ ์ ๋ด๋นํ๋ค. ๋ฐ์ธ๋๊ฐ ์์ด์ผ ๋ฐ์ดํฐ๋ฐ์ธ๋ฉ์ ํตํด MVVMํจํด์ ๊ตฌํํ ์ ์๋ค.
์๋ ๋ฐฉ์
- View์์ ์ ์ ์ ์ด๋ฒคํธ ๋ฐ์
- ViewModel์ ์๋ ์์ฑ๊ณผ ๋ฐ์ดํฐ๋ฐ์ธ๋ฉ์ ํตํด ์ด๋ฒคํธ ์ ๋ฌ
- ViewModel์ด Model์๊ฒ ๋ฐ์ดํฐ ์์ฒญ
- Model์ด ViewModel์๊ฒ ๋ฐ์ดํฐ ์๋ต
- ViewModel์ด ๋ฐ์ ๋ฐ์ดํฐ๋ฅผ ๊ฐ๊ณต(View์ ์ธ ์ ์๊ฒ)
- View ์ ๋ฐ์ดํธ
๋ฐ์ดํฐ ๋ฐ์ธ๋ฉ์ ํตํด์ MVP์ ์๋ View์ ๋ํ ์์กด์ฑ์ ์์ด๋ค๊ณ ์์์ ๋งํ๋๋ฐ, ๋ทฐ๋ชจ๋ธ์ ๋ฐ์ดํฐ ๋ฐ์ธ๋ฉ์ ์ด์ฉํด ํ๋์ ํ ๊ฐ์ง ๋ทฐ ๋ชจ๋ธ์ ์ฌ๋ฌ๊ฐ์ ๋ทฐ๋ฅผ ๋ถ์ผ ์ ์๊ธฐ ๋๋ฌธ์ด๋ค. 1๋1 ๊ด๊ณ์๋ MVP์ View-Presenter์์ ViewModel์ด 1์ธ 1:N ๊ด๊ณ๋ก ๋ฐ์ ํ๋ค.
์ฆ MVVM์ MVC๊ฐ ๊ฐ๋ ์ฅ์ ์ธ ๊ธฐ๋ฅ์์ ๊ฐ๋ฐ์ ๋ถ๋ฆฌ์ MVP์ ๋จ์ ์ ์์ ์ค ๋ฐ์ดํฐ๋ฐ์ธ๋ฉ์ ํฉ์ณค๋ค๊ณ ๋ณผ ์ ์๋ค. ๋ฌธ์ ๋ ๊ฐ ์์๊ฐ ๋ ๋ฆฝ์ ์ด๋ค ๋ณด๋ ์ด๊ฑธ ๋ถ๋ฆฌํ๋๋ฐ ๋๋ ๋น์ฉ์ด ๋ ์ปค์ง ์ ์๋ค๋ ์ ๊ณผ ๊ทธ์ ๋ฐ๋ผ ViewModel์ ์ค๊ณ๊ฐ ์ด๋ ค์์ง๋ค๋ ๊ฒ์ด๋ค.
์ด์ MVVMํจํด์ ์ ์๋ฅผ ํ์ตํ์ผ๋ ์๋๋ก์ด๋ ๊ณต์๋ฌธ์์์ ๋งํ๋ ๊ถ์ฅ ์ฑ ์ํคํ ์ฒ๋ฅผ ๋ณด๊ฒ ๋ค.
๊ถ์ฅ ์ฑ ์ํคํ ์ฒ
์ผ๋ฐ ์ํคํ
์ฒ ์์น์์ ์๊ธฐํ๋ ๋ ์ด์ด๋ UI๋ ์ด์ด
์ ๋ฐ์ดํฐ ๋ ์ด์ด
๋ค. ์ฌ๊ธฐ์ ๋ ๋ ์ด์ด ๊ฐ ์ํธ์์ฉ์ ๊ฐ์ํํ๊ณ ์ฌ์ฌ์ฉํ๊ธฐ ์ํ, ์ฆ ์์กด์ฑ์ ๋ฎ์ถ๊ธฐ ์ํ ๋๋ฉ์ธ ๋ ์ด์ด
๋ฅผ ์ถ๊ฐ ํ ์ ์๋ค. ํ์ดํ๋ ์ข
์ ๊ด๊ณ๋ค. ๋๋ฉ์ธ ๋ ์ด์ด๊ฐ ๋ฐ์ดํฐ ๋ ์ด์ด์ ์ข
์๋๋ค๋ ์๋ฏธ๋ค.
UI ๋ ์ด์ด (ํ๋ ์ ํ ์ด์ ๋ ์ด์ด)
UI๋ UI elements์ State holders๋ก ๊ตฌ์ฑ๋๋ค.
UI elements๋ ํ๋ฉด์ ๋ฐ์ดํฐ๋ฅผ ๋ณด์ฌ์ฃผ๋ UI์์๋ก MVVM์ View์ ๋น์ทํ๊ณ , State holders๋ ๋ฐ์ดํฐ๋ฅผ ๋ณด์ ํ๊ณ UI์ ๋ฟ๋ฆด ๋ก์ง์ ์ฒ๋ฆฌํ๋ค.
๋ฐ์ดํฐ ๋ ์ด์ด
๋ฐ์ดํฐ ๋ ์ด์ด์๋ ๋น์ฆ๋์ค ๋ก์ง์ด ์๋ค. ์์คํ
๊ณผ ์ฑ ์ฌ์ด์์ ๋ฐ์ดํฐ ์์
์ ํ ๋ฐ์ดํฐ ์์ค์ ๊ทธ ๋ฐ์ดํฐ ์์ค๋ฅผ ํฌํจํ ๋ฆฌํฌ์งํ ๋ฆฌ(์ ์ฅ์)๋ก ๊ตฌ์ฑ๋๋ค. ์ฒ๋ฆฌํ๋ ๋ฐ์ดํฐ์ ์ ํ๋ณ๋ก ๋ฆฌํฌ์งํ ๋ฆฌ ํด๋์ค
๋ฅผ ๋ง๋ค์ด์ผํ๋ค.
๋ฐ์ดํฐ ๋ ์ด์ด๋ SSOT, UDF๋ฅผ ์ค์ํด์ผํ๋ค.
๋๋ฉ์ธ ๋ ์ด์ด
๋๋ฉ์ธ ๋ ์ด์ด๋ ๋ณต์กํ ๋น์ฆ๋์ค ๋ก์ง์ด๋ ์ฌ๋ฌ ViewModel์์ ์ฌ์ฌ์ฉ๋๋ ๊ฐ๋จํ ๋น์ฆ๋์ค ๋ก์ง์ ์บก์ํ๋ฅผ ๋ด๋นํ๋ค. MVVMํจํด ์กฐ๊ธ ์์ํ๊ฒ ๊ตฌํํ ์ ์๊ฒ ํด์ฃผ๋ ๋ ์ด์ด์ด๋ค. ๋๋ฉ์ธ ๋ ์ด์ด๋ฅผ ์ฌ์ฉํ๋ฉด
์ฝ๋ ์ค๋ณต, ๊ฐ๋ ์ฑ ๊ฐ์ , ํ ์คํธ ์ฉ์ด์ฑ, ์ฑ ์๋ถํ (๋ํ ํด๋์ค ๋ฐฉ์ง)
๊ฐ ๊ฐ๋ฅํ๋ค.
์ผ๋ฐ์ ์ผ๋ก ๋ฐ์ดํฐ ๋ ์ด์ด์ ๋ฆฌํฌ์งํ ๋ฆฌ ํด๋์ค์ ์ข
์๋์ด ์ฝ๋ฃจํด์ ์ฌ์ฉํด UI๋ ์ด์ด์ ํต์ ํ๋ค. ๋๋ฉ์ธ๋ ์ด์ด์ ํด๋์ค๋ UseCase
๋ผ๊ณ ์ด๋ฆ์ด ๋ถ๋๋ฐ ๊ฐ ํด๋์ค๋น ํ๋์ ๊ธฐ๋ฅ์ ๋ด๋นํด์ผํ๋ค. ๋ํ ๋๋ฉ์ธ ๋ ์ด์ด์ UseCase๋ main-safeํด์ผํ๋ฏ๋ก ๋ฉ์ธ์ค๋ ๋์์ ํธ์ถ๋์ด์ผ ํ๋ค. ๋ง์ฝ UseCase ํด๋์ค๊ฐ ์ค๋ซ๋์ blocking operation์ ํ๊ณ ์๋ค๋ฉด(๋์ฉ๋ ๋ฐ์ดํฐ ์์ ๊ณผ ๊ฐ์), ์ ์ ํ ์ค๋ ๋๋ก ๋ก์ง์ ์ฎ๊ธฐ๊ฒ ๋๋ค.
์ฎ๊ธฐ๊ธฐ ์ ์ ์ด๋ฏธ ๋ฐ์ดํฐ ๋ ์ด์ด์์ ๋ณต์กํ ์ฐ์ฐ์์ ์ ๋ด๋นํ๊ธฐ ๋๋ฌธ์, ๋์ฉ๋ ๋ชฉ๋ก์ ๋์์ผ๋ก ๊ฒฐ๊ณผ๋ฅผ ์บ์ฑํ์ฌ ์ฑ ์ฌ๋ฌ ๋ทฐ์์ ์ฌ์ฌ์ฉ์ด ํ์ํ ๊ฒฝ์ฐ์๋ ๋ฆฌ์์ค ์ง์ฝ์ ์ธ ์์ ์ด๊ธฐ ๋๋ฌธ์ ๋ฐ์ดํฐ ๋ ์ด์ด์ ๋ฐฐ์น๋๋ค.
/**
* This use case fetches the latest news and the associated author.
*/
class GetLatestNewsWithAuthorsUseCase(
private val newsRepository: NewsRepository,
private val authorsRepository: AuthorsRepository,
private val defaultDispatcher: CoroutineDispatcher = Dispatchers.Default
) {
suspend operator fun invoke(): List<ArticleWithAuthor> =
withContext(defaultDispatcher) {
val news = newsRepository.fetchLatestNews()
val result: MutableList<ArticleWithAuthor> = mutableListOf()
// This is not parallelized, the use case is linearly slow.
for (article in news) {
// The repository exposes suspend functions
val author = authorsRepository.getAuthor(article.authorId)
result.add(ArticleWithAuthor(article, author))
}
result
}
}
์์ ์ฝ๋์ธ๋ฐ ๋ฐ์ดํฐ ๋ ์ด์ด์ ์กด์ฌํ Repository ๊ฐ์ฒด๋ค์ ๋ฐ์์ ์ฝ๋ฃจํด์ธ withContext๋ก ์ฒ๋ฆฌํ๋ค. Dispatcher๋ฅผ Default๋ก ์ค์ ๋ฐฑ๊ทธ๋ผ์ด๋ ์ค๋ ๋๋ก ์ฎ๊ฒจ withContext๋ก ๋ฉ์ธ ์ค๋ ๋์๋ ๋ ๋ฆฝ์ ์ผ๋ก ์๋ํ๋ค.
withContext
withContext๋ ๋น๋๊ธฐ์์
์ ๋๊ธฐ์ ์ผ๋ก ์๋ํ๊ฒ ํ๋ ๋ฌธ๋ฒ์ด๋ค. withContext์ ํ๋ผ๋ฏธํฐ์ ์ฌ์ฉํ ๋์คํจ์ฒ๋ฅผ ๋ฃ๊ณ (์ฌ๊ธฐ์๋ Default๋ค), ํด๋น ์ค๋ ๋์์ ์์
์ด ๋๋๊ธฐ ์ ๊น์ง ๋ฉ์ธ ์ค๋ ๋์์ ์ํ๋๋ ์ฝ๋ฃจํด์ ์ผ์์ค๋จํ๋ค. ๋ ๋ง์ง๋ง ์ค์ ๋ฐํํ๊ธฐ ๋๋ฌธ์ return์ด ๋ฐ๋ก ์์ด๋ ์ ์ฝ๋์์ result
๊ฐ invoke()์ return ๊ฐ์ธ List<ArticleWithAuthor>
์ ๋ค์ด๊ฐ๋ค. ์ฆ ๊ฒฐ๊ณผ๊ฐ ์์ ์ด ํ์ํ ๊ฒฝ์ฐ withContext๋ฅผ ์ด์ฉํด ์์ ์ ํ์คํ ํ๊ณ ๊ฐ ์ ์๋ค๋ ์ฅ์ ์ด ์๋ค.
์ฐธ์กฐ:
https://developer.android.com/topic/architecture?authuser=1&hl=ko#common-principles
๋ชจ๋ธ-๋ทฐ-๋ทฐ๋ชจ๋ธ - ์ํค๋ฐฑ๊ณผ, ์ฐ๋ฆฌ ๋ชจ๋์ ๋ฐฑ๊ณผ์ฌ์
[๋์์ธํจํด] MVC, MVP, MVVM ๋น๊ต
https://developer.android.com/jetpack/guide/domain-layer?authuser=1&hl=ko
๋์์ด ๋๋ค๋ฉด ๋๊ธ์ด๋ ๊ณต๊ฐ ๋ฒํผ ํ ๋ฒ์ฉ ๋๋ฅด๊ณ ๊ฐ์ฃผ์ธ์! ๋ก๊ทธ์ธ ์ํด๋ ๋ฉ๋๋ค ^_^