Skip to content

Latest commit

ย 

History

History
125 lines (89 loc) ยท 5.91 KB

File metadata and controls

125 lines (89 loc) ยท 5.91 KB

Clean-Android-Code

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 Pattern

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๋ž€?

์ฝ”๋“œ์—์„œ ๋‘ ๋ชจ๋“ˆ ๊ฐ„์˜ ์—ฐ๊ฒฐ. ๊ฐ์ฒด์ง€ํ–ฅ์–ธ์–ด์—์„œ๋Š” ๋‘ ํด๋ž˜์Šค ๊ฐ„์˜ ๊ด€๊ณ„๋ผ๊ณ ๋„ ๋งํ•จ. ์ผ๋ฐ˜์ ์œผ๋กœ ๋‘˜ ์ค‘ ํ•˜๋‚˜๊ฐ€ ๋‹ค๋ฅธ ํ•˜๋‚˜๋ฅผ ์–ด๋–ค ์šฉ๋„๋ฅผ ์œ„ํ•ด ์‚ฌ์šฉํ•จ.

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๋ž€ ๋ชจ๋“ˆ์˜ ์ธ์Šคํ„ด์Šค๋ฅผ ์ œ๊ณตํ•˜๋ฉฐ ์˜์กด์„ฑ์„ ์ฃผ์ž…ํ•˜๋Š” ๋ชจ๋“ˆ