Sample demo to implement MVP, Dagger 2, RxJava and Retrofit 2
Edit -> Add ButterKnife.
See the tutorial at https://medium.com/@nurrohman/a-simple-android-apps-with-mvp-dagger-rxjava-and-retrofit-4edb214a66d7#.o8fsr2904
MVP ํจํด์ด๋? 1990๋ ๋ ์ด๊ธฐ MS์ฌ์์ ๊ณต๊ฐํ, MVC ๊ธฐ๋ฐ์ GUI๋ฅผ ์ฒ๋ฆฌํ๊ธฐ ์ํ ํจํด MVC ํจํด์ ๋นํด Model๊ณผ View ๊ฐ์ ๊ฒฐํฉ๋๋ฅผ ๋ฎ์ถ๋๋ฐ ์ด์ ์ ๋ง์ถค. View, Model, Presenter๋ก ๋๋จ
์ฅ์ : MVC ํจํด์ ๋นํด ํด๋์ค๋ณ ์ฝ๋๊ฐ ์งง์์ง. ์ฝ๋๋ฅผ ๋๋์ผ๋ก์จ TDD ์ฃผ๋ ๊ฐ๋ฐ์ด ์์ํด์ง View์ Model ๊ฐ์ ๊ตฌ๋ถ ๊ฐ๋ฅ Presenter์ ์ญํ ์ ํตํด View์ Model ๊ฐ์ ๊ฒฐํฉ๋๋ฅผ ๋ฎ์ถ ์ ์์ ๊ฒฐํฉ๋๊ฐ ๋ฎ์์ง์ ๋ฐ๋ผ ์๋ก์ด ๊ธฐ๋ฅ ์ถ๊ฐ ๋๋ ๋ณ๊ฒฝ ๋ฑ, ์ ์ง๋ณด์ ๋ฐ ํ์ฅ์ฑ์ด ์ข์์ง. View์ Model์ ์ฌ์ฉ๋ฒ์ด ๋ถ๋ฆฌ๋๋ฉด์ Clean Code๊ฐ ๊ฐ๋ฅํ๋ค. Presenter์ ์ญํ ์ ํตํด Model๊ณผ View ๊ฐ์ ๊ฒฐํฉ๋๋ฅผ ๋ฎ์ถ ์ ํด๋์ค์ ์ญํ ์ ๋ฐ๋ผ ์ฝ๋๋ฅผ ๋ถ๋ฐฐํ๋ ํจํด
(View, Presenter, Model) View ์ดํ๋ฆฌ์ผ์ด์ ์ ์ธํฐํ์ด์ค ์ฌ์ฉ์์๊ฒ๋ View๊ฐ ๊ณง Interface ์ค์ View์ ์ ๊ทผํ๊ณ ํ๋ฉด์ ๊ฐฑ์ ํ๋ ์ญํ ์ ์ํ Presenter์ ์์กด์ ์ด๋ฒคํธ๋ฅผ Presenter์ ์ ๋ฌ Presenter์์ ๋ฐ์ดํฐ๋ฅผ ์ ๋ฌ๋ฐ์์ ์ฌ์ฉ์์๊ฒ ์๋ง์ ํ๋ฉด ์ ๊ณต Presenter๊ฐ ๋ณด๋ด์ฃผ๋ ๋ฐ์ดํฐ์ ๋ฐ๋ผ ๋ก๋ฉ / ๊ฒฝ๊ณ / ๋ํ์ฐฝ ๋ฑ์ ํํ
Presenter Model๊ณผ View๋ฅผ ์ฐ๊ฒฐ (๋งค๊ฐ์ฒด) MVP์์ Presenter๋ ๊ธฐ๋ฅ/ํ๋ฆ์ ์ ๊ณต ์๊ตฌ์ฌํญ์ด Presenter์ ๊ธฐ๋ฅ์ ๋์ ์ฌ์ฉ์ ์์ฒญ์ ๋ฐ์ View์ ํ๋ฆ ์ ์ด
Model ๋ด๋ถ์ ์ผ๋ก ์ฌ์ฉ๋๋ ๋ฐ์ดํฐ๋ฅผ ์ ์ฅํ๊ณ , ์ฒ๋ฆฌํ๋ ์ญํ . โ๋น์ฆ๋์ค ๋ก์งโ๊ณผ โ์ดํ๋ฆฌ์ผ์ด์ ๋ฐ์ดํฐโ ์ธ์ฆ ์์น ๋ฐ์ดํฐ ๊ทธ ์ธ ๋คํธ์ํฌ ํต์ ๋ฑ Presenter๊ฐ ์์ฒญํ ์์ ์ ์ํ
View๋ ๋๋ค์ Interface์ View Component(๊ตฌํ์ฒด)๋ก ๊ตฌ๋ถํ ์์๋๋ฐ, Interface ์ฌ์ฉ์์๊ฒ ๋ณด์ฌ์ง ๊ธฐ๋ฅ์ ์ ์ Presenter๊ฐ ํธ์ถํ ๊ธฐ๋ฅ์ ์ ์
View Component Interface์ ์ ์ํ ๊ธฐ๋ฅ์ ๊ตฌํ ์ ๊ณต ์ฌ์ฉ์ ์ด๋ฒคํธ๋ฅผ Presenter์ ์ ๋ฌ
[MVP for Android: how to organize the presentation layer] - https://antonioleiva.com/mvp-android/
[์ํคํ ํธ ์ฝ์ค - Dependency Injection ์ดํดํ๊ธฐ] - http://imcreator.tistory.com/106
[Dagger2 ์๊ฐ, ์๋๋ก์ด๋์์ Dependency Injection ์ฌ์ฉํ๊ธฐ ์ ์] - http://www.kmshack.kr/2017/06/dagger-2-%EC%86%8C%EA%B0%9C-%EC%95%88%EB%93%9C%EB%A1%9C%EC%9D%B4%EB%93%9C%EC%97%90%EC%84%9C-dependency-injection-%EC%82%AC%EC%9A%A9%ED%95%98%EA%B8%B0%EC%A0%84%EC%97%90/
[Adapter, ๋๊ตฌ๋ ๋? - Data? View?] - https://medium.com/@jsuch2362/adapter-%EB%88%84%EA%B5%AC%EB%83%90-%EB%84%8C-data-view-2db7eff11c20
[Android MVP ๋ฌด์์ ๋ฐ๋ผํ๊ธฐ] - http://thdev.tech/androiddev/2016/10/12/Android-MVP-Intro.html
๊ด๋ จ ์์ https://github.com/antoniolg/androidmvp https://github.com/hitherejoe/Bourbon https://github.com/taehwandev/AndroidMVPSample https://medium.com/@nurrohman/a-simple-android-apps-with-mvp-dagger-rxjava-and-retrofit-4edb214a66d7
์ฝ๋์์ ๋ ๋ชจ๋ ๊ฐ์ ์ฐ๊ฒฐ. ๊ฐ์ฒด์งํฅ์ธ์ด์์๋ ๋ ํด๋์ค ๊ฐ์ ๊ด๊ณ๋ผ๊ณ ๋ ๋งํจ. ์ผ๋ฐ์ ์ผ๋ก ๋ ์ค ํ๋๊ฐ ๋ค๋ฅธ ํ๋๋ฅผ ์ด๋ค ์ฉ๋๋ฅผ ์ํด ์ฌ์ฉํจ.
Dependency๊ฐ ์ํํ ์ด์ ํ๋์ ๋ชจ๋์ด ๋ฐ๋๋ฉด ์์กดํ ๋ค๋ฅธ ๋ชจ๋๊น์ง ๋ณ๊ฒฝ์ด ์ด๋ฃจ์ด์ง๊ธฐ ๋๋ฌธ. ํ ์คํธ ๊ฐ๋ฅํ ์ดํ์ ๋ง๋ค ๋ ์์กด์ฑ์ด ์์ผ๋ฉด ์ ๋ํ ์คํธ ์์ฑ์ด ์ด๋ ค์. ์ ๋ํ ์คํธ์ ๋ชฉ์ ์์ฒด๊ฐ ๋ค๋ฅธ ๋ชจ๋๋ก๋ถํฐ ๋ ๋ฆฝ์ ์ผ๋ก ํ ์คํธํ๋ ๊ฒ์ ์๊ตฌํ๊ธฐ ๋๋ฌธ.(Mock ๊ฐ์ฒด๋ก ๋์ฒด๊ฐ๋ฅ)
Dependency Injection(์์กด์ฑ ์ฃผ์ )์ด ํ์ํ ์ด์ ์ Dependency๊ฐ ์ํํ ์ด์ ๋ฅผ ํด๊ฒฐํ๊ธฐ ์ํด์ ์ฌ์ฉ. โnewโ๋ฅผ ์ฌ์ฉํด ๋ชจ๋ ๋ด์์ ๋ค๋ฅธ ๋ชจ๋์ ์ด๊ธฐํํ์ง ์์ผ๋ ค๋ฉด ๊ฐ์ฒด ์์ฑ์ ๋ค๋ฅธ ๊ณณ์์ ํ๊ณ , ์์ฑ๋ ๊ฐ์ฒด๋ฅผ ์ฐธ์กฐํ๋ฉด ๋๋ค. ์์กด์ฑ ์ฃผ์ ์ Inversion of Control ๊ฐ๋ ์ ๋ฐํ์ผ๋ก ํฉ๋๋ค. ํด๋์ค๊ฐ ์ธ๋ถ๋ก๋ถํฐ ์์กด์ฑ์ ๊ฐ์ ธ์ผํฉ๋๋ค. ํด๋์ค๋ ๋ค๋ฅธ ํด๋์ค๋ฅผ ์ธ์คํด์คํํด์ผ ํ์ง๋ง, ๊ตฌ์ฑ ํด๋์ค์์ ์ธ์คํด์ค๋ฅผ ๊ฐ์ ธ์์ผ ํฉ๋๋ค. Java ํด๋์ค๊ฐ new ์ฐ์ฐ์๋ฅผ ํตํด ๋ค๋ฅธ ํด๋์ค์ ์ธ์คํด์ค๋ฅผ ์์ฑํ๋ฉด ํด๋น ํด๋์ค์ ๋ ๋ฆฝ์ ์ผ๋ก ํ ์คํธํ๊ณ ์ฌ์ฉํ ์ ์์ผ๋ฉฐ ์ด๋ฅผ ํ๋์ข ์์ฑ์ด๋ผ๊ณ ํฉ๋๋ค.
ํด๋์ค ์ธ๋ถ์์ ์ข ์์ฑ์ ์ ๊ณตํ๋ฉด ์๊ธฐ๋ ์ด์ ํด๋์ค๋ฅผ ์ฌ์ฌ์ฉ ํ ๊ฐ๋ฅ์ฑ์ ๋์ด๊ณ , ๋ค๋ฅธ ํด๋์ค์ ๋ ๋ฆฝ์ ์ผ๋ก ํด๋์ค๋ฅผ ํ ์คํธ ํ ์ ์์ต๋๋ค. ๋น์ฆ๋์ค ๋ก์ง์ ํน์ ๊ตฌํ์ด ์๋ ํด๋์ค๋ฅผ ์์ฑํ๋๋ฐ ๋งค์ฐ ํจ๊ณผ์
์์กด์ฑ ์ฃผ์ (Dependency Injection)์ ์ด๋ป๊ฒ ํ ๊ฒ์ธ๊ฐ? Contructor Injection : ์์ฑ์ ์ฝ์ Field Injection : ๋ฉค๋ฒ ๋ณ์ ์ฝ์ ( ๋น๊ณต๊ฐ ์๋จ) Method Injection : ๋ฉ์๋ ๋งค๊ฒ ๋ณ์ ์ฝ์ .
JSR330์ ๋ฐ๋ฅธ ์ข ์์ฑ ์ฃผ์ ์์ Constructor Field Method @Inject๋ก ์ฃผ์์ฒ๋ฆฌ๋ ๋ฉ์๋๋ ํ๋๊ฐ ํธ์ถ๋๋ ์์๋ JSR330์ ์ํด ์ ์๋์ง ์์ต๋๋ค.
์ข ์์ฑ ์๋น์๋ ์ปค๋ฅํฐ๋ฅผ ํตํด ์ข ์์ฑ ๊ณต๊ธ์์ ์ข ์์ฑ(Object)์ ํ์๋ก ํฉ๋๋ค.
Dependency provider : @Module ์ด๋ ธํ ์ด์ ๋ ํด๋์ค๋ ์ฝ์ ํ ์ ์๋ ๊ฐ์ฒด๋ฅผ ์ ๊ณตํฉ๋๋ค. ์ด๋ฌํ ํด๋์ค๋ @Provides ์ด๋ ธํ ์ด์ ๋ฉ์๋๋ฅผ ์ ์ํฉ๋๋ค(@Module -> @Provides) ์ด ๋ฉ์๋์ ๋ฆฌํด๋ ์ค๋ธ์ ํธ๋ ์ข ์์ฑ ์ฝ์ ์ ์ฌ์ฉ ๊ฐ๋ฅํฉ๋๋ค. Dependency consumer : @Inject ์ด๋ ธํ ์ด์ ์ ์์กด์ฑ์ ์ ์ํ๋๋ฐ ์ฌ์ฉ๋๋ค. Connecting consumer and producer : @Component ์ด๋ ธํ ์ด์ ์ธํฐํ์ด์ค๋ ๊ฐ์ฒด ์ ๊ณต์(Module)์ ์์กด ๊ด๊ณ๋ฅผ ํํํ๋ ๊ฐ์ฒด ์ฌ์ด์ ์ฐ๊ฒฐ์ ์ ์ํฉ๋๋ค. ์ด ์ฐ๊ฒฐ์ ๋ํ ํด๋์ค๋ Dagger์ ์ํด ์์ฑ๋ฉ๋๋ค.
Dependency Injector๋ ๋ชจ๋์ ์ธ์คํด์ค๋ฅผ ์ ๊ณตํ๋ฉฐ ์์กด์ฑ์ ์ฃผ์ ํ๋ ๋ชจ๋