Android - YunByungKwan/Fundamental GitHub Wiki
Android ๊ธฐ๋ณธ
์๋๋ก์ด๋์ 4๋ ์ปดํฌ๋ํธ์ ๋ํด ์ค๋ช
์กํฐ๋นํฐ(Activity)๋ ์ฌ์ฉ์์๊ฒ ๋ณด์ฌ์ง๋ ํ๋ฉด์ ์ ๊ณตํ๋ ์ปดํฌ๋ํธ์ ๋๋ค.
์์ฒด์ ์ธ ์๋ช ์ฃผ๊ธฐ๋ฅผ ๊ฐ์ง๊ณ ์์ผ๋ฉฐ, ํ๋์ ์กํฐ๋นํฐ๋ง ํ๋ฉด์ ๋ณด์ฌ์ค ์ ์๋ ํน์ง์ด ์์ต๋๋ค.
์๋น์ค(Service)๋ ์กํฐ๋นํฐ์ ๋ฌ๋ฆฌ ๋์ ๋ณด์ด์ง ์๋ ์ปดํฌ๋ํธ์ ๋๋ค.
์๋น์ค์ ์ ํ์ ํฌ๊ทธ๋ผ์ด๋ ์๋น์ค, ๋ฐฑ๊ทธ๋ผ์ด๋ ์๋น์ค, ๋ฐ์ธ๋ ์๋น์ค 3๊ฐ์ง๊ฐ ์์ต๋๋ค.
์๋น์ค ์์ฒด๋ UI Thread์์ ์คํ๋๋ฉฐ ์ค๋ ๊ฑธ๋ฆฌ๋ ์์ ์ ์๋น์ค๋ก ํด์ผ ํ๋ ๊ฒฝ์ฐ์๋ ์๋น์ค ๋ด์
๋ณ๋์ ์ค๋ ๋๋ฅผ ๋ง๋ค์ด์ ์์ ํด์ผ ํฉ๋๋ค.
๋ธ๋ก๋์บ์คํธ ๋ฆฌ์๋ฒ(Broadcast Receiver)๋ ์๋๋ก์ด๋์์ ๋ฐ์ํ๋ ํน์ ์ด๋ฒคํธ๋ฅผ ์์ ํ ์ ์๋ ์ปดํฌ๋ํธ์ ๋๋ค.
์ฝํ ํธ ํ๋ก๋ฐ์ด๋(Content Provider)๋ ์ฑ์ ๋ฐ์ดํฐ๋ฅผ ์ธ๋ถ ๋ค๋ฅธ ์ฑ์ ๊ณต์ ํ ๋ ์ฌ์ฉ๋ฉ๋๋ค.
์ฝํ ํธ ํ๋ก๋ฐ์ด๋๋ฅผ ๊ตฌํํ ์ฑ์ ๋ฐ์ดํฐ๋ ๋ค๋ฅธ ์ฑ์์ contentResolver๋ฅผ ํตํด์ ์ ๊ทผ์ด ๊ฐ๋ฅํฉ๋๋ค.
Activity์ ๋ผ์ดํ ์ฌ์ดํด์ ๋ํด ์ค๋ช
๊ทธ๋ ค์ ์ธ์ฐ๊ธฐ.
Fragment์ ๋ผ์ดํ ์ฌ์ดํด์ ๋ํด ์ค๋ช
๊ทธ๋ ค์ ์ธ์ฐ๊ธฐ.
Fragment์ ๋ํด ์ค๋ช
Fragment๋ ํ๋ธ๋ฆฟ์ ๋ฑ์ฅ์ผ๋ก ํ๋ฉด ํฌ๊ธฐ๊ฐ ์ปค์ง๋ฉด์ ํ๋์ ํ๋ฉด์ ์ฌ๋ฌ ๊ฐ์ ํ๋ฉด์ ๊ตฌ์ฑํ๊ณ ,
๊ฐ ํ๋ฉด์ ์๋ช ์ฃผ๊ธฐ๋ฅผ ๊ด๋ฆฌํ๊ธฐ ์ํด์ ์๊ฒจ๋ฌ์ต๋๋ค.
Activity์ Fragment์ ์ฐจ์ด์ ์ค๋ช
Activity๋ ๋ ๋ฆฝ์ ์ผ๋ก ์กด์ฌํ ์ ์๋ ๋ฐ๋ฉด์, Fragment๋ ๋ ๋ฆฝ์ ์ผ๋ก ์กด์ฌํ ์ ์์ต๋๋ค.
Activity์ Fragment์ ํต์ ๋ฐฉ๋ฒ์ ๋ํด ์ค๋ช
ใ ใ
์๋น์ค(Service)๋ฅผ ์ฌ์ฉํ ์ ์๋์ง
์๋น์ค๋ FCM์ ์ฐ๋ํ ๋ PUSH ๋ฉ์์ง๋ฅผ ๋ฐ๊ธฐ ์ํด์ Service๋ฅผ ์ฌ์ฉํ์์ต๋๋ค.
์๋น์ค์ ์ ํ์ ๋ํด์ ์ค๋ช
1) ํฌ๊ทธ๋ผ์ด๋ ์๋น์ค: startForegroundService()๋ก ์์ํ๊ณ , ์๋์ ํ์ํด์ผ ํฉ๋๋ค.
2) ๋ฐฑ๊ทธ๋ผ์ด๋ ์๋น์ค: ์ฌ์ฉ์์๊ฒ ์ง์ ๋ณด์ด์ง ์๋ ์์ ์ ์ํํ๋ ์๋น์ค์ ๋๋ค.
(Android 8.0๋ถํฐ ๋ฐฑ๊ทธ๋ผ์ด๋์ ๋ํ ์ ํ์ด ์์)
3) ๋ฐ์ธ๋ฉ ์๋น์ค: ์๋ฒ-ํด๋ผ์ด์ธํธ๋ก ์ํธ์์ฉํ ์ ์๋ ์๋น์ค์ ๋๋ค.
(์๋น์ค๋ ์์ ์ ํธ์คํ ํ๋ก์ธ์ค์ ๊ธฐ๋ณธ ์ค๋ ๋์์ ์์ํจ!!!)
๋ธ๋ก๋์บ์คํธ๋ฆฌ์๋ฒ(Broadcast Receiver)์ ๋ฑ๋ก ๋ฐฉ๋ฒ์ ๋ํด ์ค๋ช
์ ์ ์ธ ๋ฑ๋ก ๋ฐฉ๋ฒ๊ณผ ๋์ ์ธ ๋ฑ๋ก ๋ฐฉ๋ฒ์ด ์์ต๋๋ค.
์ ์ ์ธ ๋ฑ๋ก ๋ฐฉ๋ฒ์ ๋งค๋ํ์คํธ ํ์ผ์์ ๋ฑ๋กํ๊ณ , ๋์ ์ธ ๋ฑ๋ก ๋ฐฉ๋ฒ์ ์ฝ๋ ์์์ ๋ฑ๋กํฉ๋๋ค.
์ฝํ ํธ ํ๋ก๋ฐ์ด๋(ContentProvider)๋ฅผ ์ฌ์ฉํ ์ ์๋์ง
๋ค, ์ฌ์ฉํ๋ ์ ์ด ์์ต๋๋ค. ์ ๋ ์จ๋ฒ์์ ์ด๋ฏธ์ง๋ฅผ ๋ถ๋ฌ์ฌ ๋ ์ฌ์ฉํ์๊ณ , Android github์ ์๋ ์ฝํ ํธ ํ๋ก๋ฐ์ด๋ ์ํ์ฑ์ ๋ด๋ถ ๋๋น์ ์ ์ฅ๋ ๋ฐ์ดํฐ๋ฅผ ๋ถ๋ฌ์ค๋ ๊ฒ์ ๊ตฌํํ์ต๋๋ค.
๋ค๋ฅธ ์กํฐ๋นํฐ๊ฐ ์ผ๋ถ๋ง ๊ฐ๋ฆฌ๋ฉด ์ด๋ค LifeCycle ๋ฉ์๋๊ฐ ํธ์ถ๋๋์ง?
onPause()๊น์ง ํธ์ถ๋ฉ๋๋ค.
๊ฐ๋ฆฐ ์กํฐ๋นํฐ๊ฐ ์ข ๋ฃ๋์ด ์๋ ์กํฐ๋นํฐ๋ก ๋์์ค๋ฉด ์ด๋ค LifeCycle ๋ฉ์๋๊ฐ ํธ์ถ๋๋์ง?
onResume()์ด ํธ์ถ๋ฉ๋๋ค.
์ ์ฒด๋ฅผ ๊ฐ๋ฆฌ๋ฉด ์ด๋ค LifeCycle ๋ฉ์๋๊ฐ ํธ์ถ๋๋์ง?
onStop()๊น์ง ํธ์ถ๋ฉ๋๋ค.
์ ์ฒด๋ฅผ ๊ฐ๋ ธ๋ค๊ฐ ๋ค์ ๋์์ค๋ฉด ์ด๋ค LifeCycle ๋ฉ์๋๊ฐ ํธ์ถ๋๋์ง?
onRestart() -> onStart()๊ฐ ํธ์ถ๋ฉ๋๋ค.
์ผ์ด์ค ๋ณ๋ก ์๋ช ์ฃผ๊ธฐ ๋ฉ์๋๊ฐ ํธ์ถ๋๋ ์์(์๊ธฐํ ๊ฒ)
- ์์ํ ๋: onCreate -> onStart -> onResume
- ํ๋ฉด ํ์ ํ ๋: onPause -> onStop -> onDestroy -> onCreate -> onStart -> onResume
- ๋ค๋ฅธ ์กํฐ๋นํฐ๊ฐ ์์ ๋ฐ ๋/์ ์ ํค๋ก ํ๋ฉด OFFํ ๋/ํ ํค: onPause -> onStop
- ๋ฐฑ ํค๋ก ์กํฐ๋นํฐ ์ข ๋ฃ: onPause -> onStop -> onDestroy
- ๋ฐฑ ํค๋ก ๊ธฐ์กด ์กํฐ๋นํฐ์ ๋์์ฌ ๋/ํ ํค๋ก ๋๊ฐ๋ค๊ฐ ๋์์ฌ ๋: onRestart -> onStart -> onResume
- ๋ค์ด์ผ๋ก๊ทธ ํ ๋ง ์กํฐ๋นํด ํฌ๋ช ์กํฐ๋นํฐ๊ฐ ์์ ๋ฐ ๋: onPause
์กํฐ๋นํฐ ๋ผ์ดํํ์(์๊ธฐํ ๊ฒ)
- ์ ์ฒด ๋ผ์ดํํ์: onCreate < onStart, onResume, onPause, onStop < onDestory
- ๊ฐ์ ๋ผ์ดํํ์: onStart < onResume, onPause < onStop
- ํฌ๊ทธ๋ผ์ด๋ ๋ผ์ดํํ์: onResume < < onPause
onDestory()๊ฐ ํธ์ถ๋๋ ๊ฒฝ์ฐ๊ฐ ์ธ์ ์ธ์ง ์ค๋ช
onDestroy()๊ฐ ํธ์ถ๋๋ ๊ฒฝ์ฐ๋ finish() ๋ฉ์๋๊ฐ ํธ์ถ๋๋ ๊ฒฝ์ฐ ๋๋ ์์คํ ์ ์ํด์ ์ข ๋ฃ๋ ๋ ํธ์ถ๋ฉ๋๋ค.
์์คํ ์ ์ํด ์ข ๋ฃ๋๋ ๊ฒฝ์ฐ๋ ์ฑ์ด ์ฌ๋ฌ ๊ฐ์ ํ์คํฌ๋ฅผ ์ฌ์ฉ ์ค์ผ ๋
๋ฉ๋ชจ๋ฆฌ๊ฐ ๋ถ์กฑํ๋ฉด ๋ฐฑ๊ทธ๋ผ์ด๋์ ํ์คํฌ์์ ์กํฐ๋นํฐ๋ฅผ ์ข ๋ฃํฉ๋๋ค.
ํ์คํฌ๊ฐ ๋ฌด์์ธ์ง ์ค๋ช
ํ์คํฌ๋ ์กํฐ๋นํฐ ์์ ๋ฌถ์ ๋จ์์ ๋๋ค.
์๋ฅผ ๋ค์ด A, B, C ์กํฐ๋นํฐ๊ฐ ์ฐจ๋ก๋๋ก ์คํ๋๋ค๋ฉด ์กํฐ๋นํฐ ๋ฐฑ์คํ์ A,B,C์กํฐ๋นํฐ๊ฐ ์ฐจ๋ก๋๋ก ์์ด๊ณ ์ด๊ฒ์ด ํ๋์ ํ์คํฌ๊ฐ ๋ฉ๋๋ค.
์กํฐ๋นํฐ์ launch mode์ ๋ํด ์ค๋ช
Launch mode๋ ํธ์ถ์ ์กํฐ๋นํฐ(ํธ์ถํ๋ ์กํฐ๋นํฐ), ํผํธ์ถ์ ์กํฐ๋นํฐ(๋ถ๋ ค์ง๋ ์กํฐ๋นํฐ)๊ฐ ์์ ๋, ํผํธ์ถ์ ์กํฐ๋นํฐ์ ์ ์ฉํ๋ ์์ฑ์ผ๋ก 4๊ฐ์ง๊ฐ ์์ต๋๋ค.
- standard: ํ์คํฌ์ TopActivity์ ๋งค๋ฒ ์๋ก์ด ์กํฐ๋นํฐ ์ธ์คํด์ค๋ฅผ ์์ฑํฉ๋๋ค.
- singleTop: ํ์คํฌ์ TopActivity์ ์ด๋ฏธ ์๋ ๊ฒฝ์ฐ onNewIntent() ๋ฉ์๋๋ก ํธ์ถ์ ์กํฐ๋นํฐ๊ฐ Intent๋ฅผ ์ ๋ฌํฉ๋๋ค. TopActivity์ ์์ ๋๋ standard์ ๋์ผํฉ๋๋ค. (onNewIntent๋ onCreate์ฒ๋ผ overrideํ๋ ํจ์์ด๊ณ onNewIntent -> onResume์ผ๋ก ๋์ด๊ฐ)
- singleTask: A์ launchMode๊ฐ singleTask์ด๊ณ , A B C A ์์๋๋ก ํธ์ถํ์ ๊ฒฝ์ฐ, A๋ง ๋จ๊ฒ ๋ฉ๋๋ค.
- singleInstance: A์ launchMode๊ฐ singleInstance์ด๊ณ , A B C A๋ฅผ ํธ์ถํ์ ๊ฒฝ์ฐ, B C/ A๋ก ๋๊ฐ์ ํ์คํฌ๊ฐ ๋ฉ๋๋ค.
taskAffinity์ ๋ํด์ ์ค๋ช
์กํฐ๋นํฐ๊ฐ ๊ด๋ จ๋ ํ์คํฌ์ ๋ค์ด๊ฐ ๋ ์ฐธ๊ณ ํ๋ ๊ฐ์ ๋๋ค. ๋ณ๋๋ก ์ง์ ํ์ง ์์ผ๋ฉด ์ฑ์ ํจํค์ง๋ช ์ด ๋ค์ด๊ฐ๋๋ค.
Intent์ ๋ํด ์ค๋ช
Intent๋ ์ดํ๋ฆฌ์ผ์ด์ ์ ์ปดํฌ๋ํธ ๊ฐ์ ์์ ์ํ์ ์ํ ์ ๋ณด๋ฅผ ์ ๋ฌํ๋ ์ญํ ์ ํฉ๋๋ค.
๊ธฐ๋ณธ์ ์ผ๋ก ์ก์ ๊ณผ ๋ฐ์ดํฐ๋ก ๊ตฌ์ฑ๋์ด ์์ผ๋ฉฐ, ์ก์ ์ ์ํํ ๊ธฐ๋ฅ, ๋ฐ์ดํฐ๋ ์ก์ ์ด ์ํ๋ ๋์ ๋ฐ์ดํฐ๋ฅผ ๋งํฉ๋๋ค.
๋ช ์์ Intent์ ์์์ Intent์ ์ฐจ์ด์ ์ ๋ํด ์ค๋ช
๋ช ์์ Intent๋ ์ธํ ํธ์ ํด๋์ค ๊ฐ์ฒด๋ ์ปดํฌ๋ํธ ์ด๋ฆ์ ์ง์ ํด์ ํธ์ถ๋ ๋์์ ํ์คํ ์ ์ ์๋ Intent๋ฅผ ๋งํฉ๋๋ค.
์์์ Intent๋ ํธ์ถ๋ ๋์์ ์์ฑ๋ค์ ์ง์ ํ์ง๋ง, ํธ์ถ๋ ๋์์ด ๋ฌ๋ผ์ง ์ ์๋ Intent๋ฅผ ๋งํฉ๋๋ค.
์์์ Intent์ ํ๊ฐ์ง ์๋ก Intent.ACTION_VIEW๊ฐ ์์ต๋๋ค.
Intent Filter์ ๋ํด ์ค๋ช
Intent Filter๋ ์์ ํ๊ณ ์ ํ๋ ์์์ ์ธํ ํธ๋ฅผ ์ ์ํ๋ ๊ฒ์ ๋งํฉ๋๋ค.
Intent Filter๋ action, data, category์์ฑ์ ์์ ํ ์์์ ์ธํ ํธ์ ๋น๊ตํ์ฌ ํํฐ๋ง ์ฌ๋ถ๋ฅผ ๊ฒ์ฌํฉ๋๋ค.
Application ํด๋์ค์ ๋ํด ์ค๋ช
Applicationํด๋์ค๋ ์ฑ ํ๋ก์ธ์ค์์ ๊ฐ์ฅ ๋จผ์ ์์๋๋ ํด๋์ค์ ๋๋ค.
์ฑ ํ๋ก์ธ์ค๊ฐ ๋ ์์ง ์์ ์ํ์์ ๋ค๋ฅธ ์ปดํฌ๋ํธ๊ฐ ์์ฒญ์ ๋ฐ์ผ๋ฉด ์ฑ ํ๋ก์ธ์ค๊ฐ ์์ฑ๋๊ณ
Application์ด ๋จผ์ ์์๋ฉ๋๋ค.
onTrimMemory() ๋ฉ์๋์ ๋ํด ์ค๋ช
onTrimMemory() ๋ฉ์๋๋ ์ ์ฒด ์์คํ ์ ๋ฉ๋ชจ๋ฆฌ๊ฐ ๋ถ์กฑํด์ ์ํ๋ ๋งํผ ๋ฐฑ๊ทธ๋ผ์ด๋ ํ๋ก์ธ์ค๋ฅผ ์คํํ ์ ์์ ๋
์ด์ ์ฒด์ ์ ์ํด์ ํธ์ถ๋๋ ๋ฉ์๋์ ๋๋ค.
onLowMemory() ๋ฉ์๋์ ๋ํด ์ค๋ช
onLowMemory() ๋ฉ์๋๋ ์ ์ฒด ์์คํ ์ ๋ฉ๋ชจ๋ฆฌ๊ฐ ๋ถ์กฑํ ๋ ํธ์ถ๋๋ฉฐ,
์ผ๋ฐ์ ์ผ๋ก ๋ชจ๋ ๋ฐฑ๊ทธ๋ผ์ด๋ ํ๋ก์ธ์ค๊ฐ ์ ๊ฑฐ๋์์ ๋ ํธ์ถ๋ฉ๋๋ค.
์๋๋ก์ด๋์ ์ปค๋์ ๋ํด ์ค๋ช
์๋๋ก์ด๋์ ์ปค๋์ ๋ฆฌ๋ ์ค ์ปค๋์ ๊ธฐ๋ฐ์ผ๋ก ๋ถํ์ํ ๊ฒ์ ์ ๊ฑฐํ๊ณ
ํ์ํ ๊ธฐ๋ฅ(low memory killer ๋ฑ)์ ํ์ฅ ํจ์นํ ๊ฒ์ ๋๋ค.
compileSdkVersion, targetSdkVersion, minSdkVersion ์ ๋ํด ์ค๋ช
compileSdkVersion๋ ์ปดํ์ผ์ ์ด๋ ๋ฒ์ ์ android.jar๋ฅผ ์ฌ์ฉํ ๊ฒ์ธ์ง ์ง์ ํ๋ API๋ ๋ฒจ์ ์๋ฏธํฉ๋๋ค.
์ปดํ์ผ์์๋ง ์ ์ฉ๋๋ฉฐ ๋ฐํ์์๋ ์ํฅ์ ๋ผ์น์ง ์์ต๋๋ค.
targetSdkVersion์ ์ ํ๋ฆฌ์ผ์ด์ ์ด ๊ธฐ๊ธฐ์์ ๋์ํ ๋(๋ฐํ์) ์ฌ์ฉ๋๋ API๋ ๋ฒจ์ ์๋ฏธํฉ๋๋ค.
OS๋ฒ์ < targetSdkVersion์ผ ๊ฒฝ์ฐ, OS๋ฒ์ ์ผ๋ก ๋์
OS๋ฒ์ > targetSdkVersion์ผ ๊ฒฝ์ฐ, targetSdkVersion์ผ๋ก ๋์
minSdkVersion์ ์ ํ๋ฆฌ์ผ์ด์ ์ ์คํํ๋๋ฐ ํ์ํ ์ต์ API๋ ๋ฒจ์ ์๋ฏธํฉ๋๋ค.
๊ธฐ๊ธฐ์ OS๋ฒ์ ์ด minSdkVersion๋ณด๋ค ๋ฎ์ ๊ฒฝ์ฐ, ์ ํ๋ฆฌ์ผ์ด์ ์ด ์ค์น๋์ง ์์ต๋๋ค.
RTL์ด ๋ฌด์์ธ์ง ์ค๋ช
์๋์ด์ ๊ฒฝ์ฐ๋ ํ ์คํธ๋ฅผ ์ฝ๋ ๋ฐฉํฅ์ด ์ค๋ฅธ์ชฝ์์ ์ผ์ชฝ์ผ๋ก ์ฝ๋ RTL์ ๋๋ค.
๊ทธ๋์ ์๋์ด๊ฐ์ RTL ์ธ์ด๋ก ์๋น์ค๋ฅผ ์ ๊ณตํ ๊ฒฝ์ฐ ์ด๋ฅผ ์ค์ ํด์ผ ํ๋ ๊ฒ์ผ๋ก ์๊ณ ์์ต๋๋ค.
LMK(Low Memory Killer)์ ๋ํด ์ค๋ช
LMK(Low Memory Killer)๋ ๊ฐ์ฉ ๋ฉ๋ชจ๋ฆฌ๊ฐ ์ค์ ๋ Threshold ์ดํ๋ก ๋จ์ด์ง๊ฒ ๋๋ฉด, ์ฐ์ ์์์ ๋ฐ๋ผ์ ํ๋ก์ธ์ค๋ฅผ ์ข
๋ฃ์ํค๋ ์ญํ ์ ํฉ๋๋ค.
์๋๋ก์ด๋์์ ๋ ์ด์์์ด ๊ทธ๋ ค์ง๋ ๊ณผ์ ์ ๋ํด ์ค๋ช
Activity๊ฐ ํฌ์ปค์ค๋ฅผ ์ป๊ฒ ๋๋ฉด ์์คํ
์ Activity์ Root Node๋ฅผ ์์ฒญํฉ๋๋ค. (setContentView์ ์ธํ
ํ ๋ ์ด์์์ด Root Node)
View๋ ๋ ์ด์์์ Root Node๋ฅผ ์์์ผ๋ก ๋ ์ด์์ ํธ๋ฆฌ๋ฅผ ์ํํ๋ฉด์ View๋ฅผ ๊ทธ๋ฆฌ๊ธฐ ์์ํฉ๋๋ค.
View๋ฅผ ๊ทธ๋ฆฌ๋ ๊ณผ์ ์ Measure[๋ฉ์ ธ]->Layout->Draw 3๋จ๊ณ๋ก ์งํ์ด ๋ฉ๋๋ค.
์ธก์ (Measure) ๋จ๊ณ์์ ๋ทฐ์ ํฌ๊ธฐ๋ฅผ ์ธก์ ํ๊ณ , ๋ ์ด์์(Layout) ๋จ๊ณ์์ ๋ทฐ์ ํฌ๊ธฐ์ ์์น๋ฅผ ๊ฒฐ์ ํ๊ณ , ๊ทธ๋ฆฌ๊ธฐ(Draw) ๋จ๊ณ์์ ๋ทฐ๋ฅผ ํ๋ฉด์ ๊ทธ๋ฆฝ๋๋ค.
View์ ViewGroup์ ์ฐจ์ด์ ์ ๋ํด์ ์ค๋ช
View๋ Button, EditText, TextView์ ๊ฐ์ด ์๋๋ก์ด๋์์ UI๋ฅผ ๊ตฌ์ฑํ๋ ๊ธฐ๋ณธ ์์๋ฅผ ๋งํฉ๋๋ค.
ViewGroup์ ConstraintLayout, LinearLayout๊ณผ ๊ฐ์ด View ๋๋ ViewGroup์ ํฌํจํ๋ ์์๋ฅผ ๋งํฉ๋๋ค.
Display, Window, Surface, Canvas์ ๋ํด์ ์ค๋ช
- Display๋ ์๋๋ก์ด๋์ ํ๋ฉด์ ์๋ฏธํฉ๋๋ค.
- Window๋ 1๊ฐ์ Surface๋ฅผ ๊ฐ์ง ํ์ด๋ผ๊ณ ํ ์ ์์ต๋๋ค. Window์ ์์๋ก๋ Dialog, Activity, status bar ๋ฑ์ด ์์ต๋๋ค.
- Surface๋ ํฝ์
๋ค์ ๊ฐ์ง๊ณ ์๋ ๊ฐ์ฒด์
๋๋ค. ์ผ๋ฐ์ ์ผ๋ก 2๊ฐ์ ๋ฒํผ๋ฅผ ๊ฐ์ง๊ณ ๋์ํฉ๋๋ค.
- Canvas๋ ์ค์ UI๋ฅผ ๊ทธ๋ฆฌ๊ธฐ ์ํ ๊ณต๊ฐ์ผ๋ก ๋นํธ๋งต์ด ๊ทธ๋ ค์ง๋ ๊ณต๊ฐ์
๋๋ค.
Surface์ ์ด์ค ๋ฒํผ ๋ ๋๋ง์ ๋ํด์ ์ค๋ช
์คํฌ๋ฆฐ์ ์ถ๋ ฅ๋ ํ๋ฉด ๋ฐ์ดํฐ๋ ํ๋ ์ ๋ฒํผ์ ์ ์ฅ๋ฉ๋๋ค.
๊ทธ๋ฐ๋ฐ ํ๋์ ๋ฒํผ๋ง ๊ฐ์ง๋ ๊ฒฝ์ฐ, ์ด๋ฏธ์ง๋ฅผ ๋ฐ๋ณตํด์ ๊ทธ๋ฆฌ๊ฑฐ๋ ๋ค ๊ทธ๋ ค์ง์ง ์์ ์ฑ๋ก ๋ ๋๋งํด์ผ ๋ ๋๊ฐ ์๋๋ฐ
์ด๋ ๊น๋ฐ์ ํ์์ด ๋ฐ์ํ ์ ์์ต๋๋ค.
์ด๋ฅผ ํด๊ฒฐํ๊ธฐ ์ํด ํ๋ ์ ๋ฒํผ์ ๋ฐ๋ก ๋ ๋๋ง ํ์ง ์๊ณ , ๋ค๋ฅธ ๋ฒํผ๋ฅผ ํ๋ ๋ง๋ค์ด์ ๊ทธ ๋ฒํผ์ ๋ ๋๋ง์ ์๋ฃ ํ๊ณ
๋ค์ ํ๋ ์ ๋ฒํผ์ ์ฎ๊ธฐ๋ ๋ฐฉ์์ ์ฌ์ฉํ์ฌ Flicker ํ์์ ํด๊ฒฐํ ์ ์์ต๋๋ค.
SurfaceView์ ๋ํด์ ์ค๋ช
๊ฒ์์ฒ๋ผ ๋ณต์กํ๊ณ ๋น ๋ฅธ ๊ทธ๋ํฝ ์ฒ๋ฆฌ๊ฐ ์๊ตฌ๋๋ ์ ํ๋ฆฌ์ผ์ด์ ์ SurfaceView๊ฐ ์ฌ์ฉ๋ฉ๋๋ค.
SurfaceView๋ ๋ฐฑ๊ทธ๋ผ์ด๋ ์ค๋ ๋์์ ๊ฐ์ ๋ก ํ๋ฉด์ ๊ทธ๋ฆฝ๋๋ค.
SurfaceView๋ Canvas๊ฐ ์๋ Surface(= ๊ฐ์ ๋ฉ๋ชจ๋ฆฌ ํ๋ฉด)์ ๊ทธ๋ฆฌ๊ณ ๊ทธ๋ ค์ง Surface๋ฅผ ํ๋ฉด์ ๋ฟ๋ฆฌ๊ธฐ ๋๋ฌธ์ ๊ฒ์์ด๋ ์นด๋ฉ๋ผ ๊ฐ์ ๋์ ๋ฐ์์ฑ์ด ํ์ํ UI ์์ ์ด ํ์ํ ๊ฒฝ์ฐ ์ฌ์ฉํ ์ ์์ต๋๋ค
SurfaceView๋ ๋๋ธ ๋ฒํผ๋ง ๊ธฐ๋ฒ์ ์ฌ์ฉํฉ๋๋ค.
SurfaceView์ ๊ตฌ์กฐ๋ Surface์ SurfaceHolder ๋ก ๊ตฌ์ฑ๋๋ฉฐ, SurfaceHolder๊ฐ Surface์ ๋ฏธ๋ฆฌ ๊ทธ๋ฆฌ๊ณ , ์ด Surface๊ฐ SurfaceView์ ๋ฐ์ํ๋ ๊ตฌ์กฐ์ ๋๋ค.
NDK์ ๋ํด์ ์ค๋ช
NDK๋ ์๋๋ก์ด๋์์ C๋ C++ ๊ฐ์ ๋ค์ดํฐ๋ธ ์ฝ๋๋ฅผ ์ฌ์ฉํ ์ ์๋๋ก ๋์์ฃผ๋ ํดํท์ ๋๋ค.
์๋๋ก์ด๋ key hash๊ฐ์ ๋ํด์ ์ค๋ช
Key Hash๋ ์ฑ์ signing key๋ฅผ ํด์ ํจ์๋ฅผ ๊ฑฐ์ณ ๋์จ ํด์ํค๊ฐ์ ๋งํฉ๋๋ค.
signing key๋ ์๋๋ก์ด๋ ์คํ๋์ค ์ค์น ํ ํ๋ฒ์ด๋ผ๋ ๋น๋๋ฅผ ํ๋ฉด ์๋์ผ๋ก ์์ฑ๋๋ ํค๊ฐ์ด๋ฉฐ
PC๋ง๋ค ๊ณ ์ ํ ๊ฐ์ ๋๋ค.
FCM(Firebase Cloud Messaging)์ ์๋ฆฌ
FCM์ ๋จผ์ ์ฑ์ FCM ๊ด๋ จ ์ค์ ๊ณผ ์๋น์ค๋ฅผ ๊ตฌํํฉ๋๋ค.
๊ทธ๋ฌ๋ฉด ์๋์ผ๋ก Firebase ์๋ฒ์ token์ ์์ฒญํ๊ณ Firebase ์๋ฒ๋ ์ฑ์ผ๋ก token์ ์ ๋ฌํฉ๋๋ค.
๊ทธ๋ฌ๋ฉด ๊ตฌํํ ์๋น์ค๊ฐ ์คํ๋๋ฉด์ token๊ฐ์ ๋ฐ์ต๋๋ค.
๋ณดํต ์ด token๊ฐ์ ์ฑ์ ์๋ฒ DB์ ์ ์ฅํฉ๋๋ค.
๊ทธ๋ฆฌ๊ณ ํธ์ ์๋ฆผ์ ๋ณด๋ด์ผ ํ ๊ฒฝ์ฐ, ์ฑ ์๋ฒ์์ token๊ณผ ๋ฐ์ดํฐ๋ฅผ Firebase ์๋ฒ๋ก ์ ๋ฌํฉ๋๋ค.
Firebase ์๋ฒ์์ ์ฑ์ ํธ์ ์๋ฆผ์ ์ ์กํฉ๋๋ค.
Android ๋ฐํ์
์๋๋ก์ด๋ ๋ฐํ์(Android RunTime, ART)์ ๋ํด ์ค๋ช
๊ธฐ์กด์ ๋ฌ๋น ๊ฐ์ ๋จธ์ (Dalvik VM)์ ํ๊ณ์ ์ ํด๊ฒฐํ๊ธฐ ์ํด์ ์๋ก ๋์จ ๋ฐํ์์ ๋๋ค.
์๋๋ AOT์ปดํ์ผ๋ฌ๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ์๋ํ๋ฉฐ, ์ต๊ทผ์๋ JIT์ปดํ์ผ๋ฌ์ AOT ์ปดํ์ผ๋ฌ๊ฐ ๊ฐ์ด ์ฌ์ฉ๋ฉ๋๋ค.
๋ฌ๋น (Dalvik VM)๊ณผ ART(Android RunTime)์ ์ฐจ์ด์ ์ ๋ํด ์ค๋ช
๋ฌ๋น ๊ฐ์ ๋จธ์ (Dalvik VM)์ JIT ์ปดํ์ผ๋ฌ๋ฅผ ์ฌ์ฉํ๊ณ
ART(Android RunTime)๋ JIT ์ปดํ์ผ๋ฌ์ AOT ์ปดํ์ผ๋ฌ๋ฅผ ํจ๊ป ์ฌ์ฉํฉ๋๋ค.
JIT(Just In Time)์ปดํ์ผ๋ฌ์ AOT(Ahead Of Time)์ปดํ์ผ๋ฌ์ ์ฐจ์ด์ ์ ๋ํด ์ค๋ช
JIT(Just In Time)์ปดํ์ผ๋ฌ๋ ์ฑ ์ต์ด ์คํ์ ์๋ฐ ์ฝ๋๊ฐ ์ผ์ ๋ถ๋ถ ํ๊บผ๋ฒ์ ๋ณํ์ด ๋๋ฉฐ,
๋ณํ๋ ๋ด์ฉ์ ๋ฉ๋ชจ๋ฆฌ์ ์ฌ๋ ค๋ก๋๋ค.
JIT์ ๋จ์ ์ JIT์ปดํ์ผ๋ฌ๊ฐ ๋์๊ฐ๋ ๋์์ ํ๋์จ์ด ๋ถํ๊ฐ ํฌ๊ฒ ๋ฐ์ํ๊ณ ๋ฐฐํฐ๋ฆฌ ์๋ชจ๊ฐ ์ฌํ ๋จ์ ์ด ์์ต๋๋ค.
๋ํ, ์ ํ๋ฆฌ์ผ์ด์ ์คํ์ ์คํ ๋ถ๋ถ ์ ์ฒด๋ฅผ RAM์ ์์ฃผ์์ผ์ผ ํฉ๋๋ค.
AOT(Ahead Of Time) ์ปดํ์ผ๋ฌ๋ ์ ํ๋ฆฌ์ผ์ด์ ์ค์น์ ํ๋ฒ์ ์ปดํ์ผํ์ฌ ๋ฐ์ดํธ ์ฝ๋๋ก ๋ณํํด๋๊ณ ์๋ค๊ฐ
ํ๋ก๊ทธ๋จ ์คํ์ ๋ณํ๋ ์ฝ๋๋ฅผ ์ฝ์ด ๋ค์ด๋ ๋ฐฉ์์ ๋๋ค.
AOT๋ ์ค์น ๊ณต๊ฐ์ ๋ ๋ง์ด ์ฐจ์งํ๊ณ , ์ ํ๋ฆฌ์ผ์ด์ ์ค์น ์๊ฐ์ด ๋๋ฆฌ๋ค๋ ๋จ์ ์ด ์์ต๋๋ค.
Android Jetpack
WebView๊ด๋ จ
WebViewClient์ onPageStarted(),shouldOverrideUrlLoading(),onPageFinished()์ ํธ์ถ ์์
shouldOverrideUrlLoading() -> onPageStarted() -> onPageFinished() ์์ผ๋ก ํธ์ถ๋ฉ๋๋ค.
- shouldOverrideUrlLoading(): WebView์์ ์๋ก์ด URL์ด ๋ก๋๋ ๋ ์ด๋ฅผ ์ปจํธ๋กคํ ์ ์๋ ํจ์์ ๋๋ค.
- onPageStarted(): ํ์ด์ง ๋ก๋ฉ์ ์์ํ ๋ ํธ์ถ๋๋ ์ฝ๋ฐฑ ํจ์์ ๋๋ค.
- onPageFinished(): ํ์ด์ง ๋ก๋ฉ์ ๋๋์ ๋ ํธ์ถ๋๋ ์ฝ๋ฐฑ ํจ์์ ๋๋ค.
shouldOverrideUrlLoading()์ ๋ฆฌํด๊ฐ์ด true/false์ ์ฐจ์ด์
1) WebViewClient๋ฅผ ์ ๊ณตํ ๊ฒฝ์ฐ
- shouldOverrideUrlLoading()๊ฐ true๋ฅผ ๋ฆฌํด: ํ์ฌ WebView๊ฐ URL๋ก๋๋ฅผ ์ค๋จํ๋ค.
- shouldOverrideUrlLoading()๊ฐ false๋ฅผ ๋ฆฌํด: WebView๋ ์ ์์ ์ผ๋ก URL๋ก๋๋ฅผ ์งํํ๋ค.
2) WebViewClient๋ฅผ ์ ๊ณตํ์ง ์์ ๊ฒฝ์ฐ
- WebView๋ Activity Manager์๊ฒ URL์ ๋ํ ์ ์ ํ ์ฒ๋ฆฌ๊ธฐ๋ฅผ ์ ํํ๋๋ก ์์ฒญํ๋ค.
JNI(Java Native Interface)์ ๋ํด์ ์ค๋ช
JNI๋ Java์ ๋ค์ดํฐ๋ธ ์ธ์ด ์ฌ์ด๋ฅผ ์ฐ๊ฒฐ์์ผ ์ฃผ๋ ์ธํฐํ์ด์ค์ ๋๋ค.
JavaScript์ WebView์์ ํต์ ๋ฐฉ๋ฒ์ ๋ํด์ ์ค๋ช
JavaScript์์ Android์ ๋ฉ์๋๋ฅผ ํธ์ถํ๊ธฐ ์ํด์ JavaScriptInterface ์ด๋ ธํ ์ด์ ์ ์ฌ์ฉํฉ๋๋ค.
๊ทธ๋ฆฌ๊ณ ์๋๋ก์ด๋์์ ์น์ ํธ์ถํ ๋๋ loadUrl() ๋ฉ์๋๋ฅผ ์ฌ์ฉํฉ๋๋ค.
DI(Dependency Injection)
์์กด์ฑ ์ฃผ์ (Dependency Injection)์ ๋ํด ์ค๋ช
์์กด์ฑ ์ฃผ์ (Dependency Injection)์ ๋ค๋ฅธ ํด๋์ค์ ์ธ์คํด์ค๋ฅผ ์์ฑ์๋ ํ๋๋ฅผ ํตํด์ ์ฃผ์ ๋ฐ๋ ๊ฒ์ ๋งํฉ๋๋ค.
Dagger์ ๋ํด์ ์ค๋ช
Dagger๋ ์ปดํ์ผ ํ์์ ์์กด์ฑ์ ์ฃผ์ ํ๋ ์์กด์ฑ ์ฃผ์ ํ๋ ์์ํฌ์ ๋๋ค.
- @Module: ํด๋์ค์๋ง ๋ถ์ธ๋ค. ์์กด์ฑ ์ฃผ์ ์ ํ์ํ ๊ฐ์ฒด๋ค์ Provide๋ฉ์๋๋ฅผ ํตํด ๊ด๋ฆฌํ๋ค.
- @Provide: @Moduleํด๋์ค ์์ ์ ์ธ๋ ๋ฉ์๋์๋ง ๋ถ์ธ๋ค. ์ปดํฌ๋ํธ์๊ฒ ๊ฐ์ฒด๋ฅผ ์ ๊ณตํ๋ ์ญํ ์ ํ๋ค.
- @Inject: ํ๋, ์์ฑ์, ๋ฉ์๋์ ๋ถ์ฌ์ ์ปดํฌ๋ํธ๋ก๋ถํฐ ๊ฐ์ฒด๋ฅผ ์ฃผ์ ๋ฐ์ ์ ์๊ฒ ํ๋ค.(์ธํฐํ์ด์ค, ์จ๋ํํฐ ๋ผ์ด๋ธ๋ฌ๋ฆฌ ํด๋์ค์๋ ์ฌ์ฉํ ์ ์๋ค.)
- @Component: interface ๋๋ abstract ํด๋์ค์ ๋ถ์ผ ์ ์๋ค. ์ปดํ์ผ ํ์์ ์ด๋ ธํ ์ด์ ํ๋ก์ธ์์ ์ํด ์์ฑ๋ ํด๋์ค๋ ์ ๋์ด Dagger์ @Component๊ฐ ๋ถ์ ํด๋์ค์ด๋ฆ์ด ํฉ์ณ์ง ํ์์ ์ด๋ฆ์ ๊ฐ๋๋ค. @Component ์ด๋ ธํ ์ด์ ์ด ๋ฌ๋ฆฐ interfacce ๋๋ abstract ํด๋์ค์๋ ์ ์ด๋ ํ๋์ ์ถ์ ์ปดํฌ๋ํธ ๋ฉ์๋๊ฐ ์์ด์ผ ํ๋ค. ์ปดํฌ๋ํธ ๋ฉ์๋์๋ Provision ๋ฉ์๋์ Member-Injection ๋ฉ์๋๊ฐ ์๋ค.
- Provision Method: ๋งค๊ฐ๋ณ์๊ฐ ์๊ณ , ๋ชจ๋์ด ์ ๊ณตํ๋ ๊ฐ์ฒด์ ํ์ ์ ๋ฐํํ์ผ๋ก ๊ฐ๋๋ค. ์์ฑ๋ ์ปดํฌ๋ํธ ํด๋์ค์์ ์ด ๋ฉ์๋๋ฅผ ์ด์ฉํ์ฌ ๊ฐ์ฒด๋ฅผ ์ป์ ์ ์์ต๋๋ค.
- Member-Injection Method: ์์กด์ฑ์ ์ฃผ์ ์ํฌ ๊ฐ์ฒด๋ฅผ ๋ฉ์๋์ ํ๋ผ๋ฏธํฐ๋ก ๋๊ธฐ๋ ๋ฐฉ๋ฒ์ ๋๋ค. ๋ฉค๋ฒ์ธ์ ์ ๋ฉ์๋๋ฅผ ํธ์ถ ํ๊ฒ ๋๋ฉด ํ๊ฒ ํด๋์ค ๋ด์ @Inject ํ๋์ ๊ฐ์ฒด๋ฅผ ์ฃผ์ ๋ฐ๊ฒ ๋ฉ๋๋ค.
- @Component.Builder: ์ปดํฌ๋ํธ๋ฅผ ์์ฑํ๊ธฐ ์ํ Builder์ฉ ์ ๋ ธํ ์ด์ ์ ๋๋ค. Component ๋ด์ abstract ํด๋์ค ๋๋ interface์ ์ด ์ ๋ ธํ ์ด์ ์ ๋ถ์ ๋๋ค. ๋ค์๊ณผ ๊ฐ์ด Builder๋ฅผ ์ ์ ํ ์ ์์ต๋๋ค.
Koin์ ๋ํด์ ์ค๋ช
Koin์ ์์ ์ฝํ๋ฆฐ์ผ๋ก ๊ฐ๋ฐ๋ ์์กด์ฑ ์ฃผ์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ๋๋ค.
Koin์ lazyํค์๋๋ฅผ ํตํด์ ๋ฐํ์์ ์์กด์ฑ์ ์ฃผ์ ํฉ๋๋ค.
Koin์ ์ฅ/๋จ์ ์ ๋ํด ์ค๋ช
Koin์ ์ฅ์ ์ ํ๋ก์ ํธ์ ๋น ๋ฅด๊ฒ ์ ์ฉํ ์ ์๋ค๋ ์ ์ด ๊ฐ์ฅ ํฌ๊ณ , ๋ณ๋์ ์ด๋ ธํ ์ด์ ์ ์ฌ์ฉํ์ง ์๊ธฐ ๋๋ฌธ์ ์ปดํ์ผ ์๊ฐ์ด ๋จ์ถ๋๋ค๋ ์ฅ์ ์ด ์์ต๋๋ค.
๋ฐ๋ฉด์ ๋จ์ ์ ๋ฐํ์์์ ์๋ฌ๊ฐ ๋ ๊ฐ๋ฅ์ฑ์ด ์กด์ฌํ๋ค๋ ๊ฒ์ด ๋จ์ ์ ๋๋ค.
Koin๊ณผ dagger์ ์ฐจ์ด์ ์ ๋ํด ์ค๋ช
Dagger๋ ์ด๋ ธํ ์ด์ ์ ํตํด์ ์ปดํ์ผํ์์ ์์กด์ฑ์ ์ฃผ์ ํฉ๋๋ค.
๊ทธ๋ ๊ธฐ ๋๋ฌธ์ ์ปดํ์ผ ๊ณผ์ ์ด ๋๋ ค์ง ์ ์์ง๋ง ๋ฐํ์์ ์๋ฌ๊ฐ ๋ ๊ฐ๋ฅ์ฑ์ด ์ ๋ค๋ ์ฅ์ ์ด ์์ต๋๋ค.
๋ฐ๋ฉด์ Koin์ ๋ฐํ์์ ์์กด์ฑ์ ์ฃผ์ ํฉ๋๋ค.
๊ทธ๋ ๊ธฐ ๋๋ฌธ์ ์ปดํ์ผ ๊ณผ์ ์์์ ์ค๋ฒํค๋๋ ์์ง๋ง ๋ฐํ์์์ ์๋ฌ๊ฐ ๋ ๊ฐ๋ฅ์ฑ์ด ์กด์ฌํฉ๋๋ค.
Retrofit
Retrofit์ ๋ํด ์ค๋ช
Retrofit์ HTTPํต์ ์ ์ฌ์ฉ๋๋ ํด๋ผ์ด์ธํธ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ด๊ณ , OkHttp๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ๋คํธ์ํฌ ๋ ์ด์ด๋ก ์ฌ์ฉํ๊ณ ์์ต๋๋ค.
Retrofit์ ๋์ ์๋ฆฌ์ ๋ํด์ ์ค๋ช
Retrofit์ ์ฌ์ฉํ๊ธฐ ์ํด์ ๋จผ์ ์ฌ์ฉํ API๋ฅผ ์ธํฐํ์ด์ค๋ก ์ ์ํฉ๋๋ค. ๊ทธ๋ฆฌ๊ณ ๋ ํธ๋กํ ๋น๋์ create ๋ฉ์๋๋ฅผ ํตํด์ ์ธํฐํ์ด์ค์ ๊ตฌํ์ฒด๋ฅผ ์์ฑํฉ๋๋ค. ๊ตฌํ์ฒด์ ์์ฑ์๋ ํ๋ก์์ ๋ฆฌํ๋ ์
์ด ์ฌ์ฉ๋ฉ๋๋ค. ๊ตฌํ์ฒด๋ฅผ ์์ฑํ๋ ๊ณผ์ ์ ๋ฐํ์์ ์ด๋
ธํ
์ด์
์ ํ์ฑํด์ ๋ฆฌํ๋ ์
์ ํตํด ์ ์ํ ์ธํฐํ์ด์ค๋ฅผ ์ฝ๊ณ ์ด๋ฅผ ๋ฐํ์ผ๋ก ํ๋ก์ ํด๋์ค๋ฅผ ๋ง๋ค๊ณ ๊ทธ ๊ตฌํ์ฒด๋ฅผ ์์ฑํฉ๋๋ค. ์ดํ ์์ฑ๋ ๊ตฌํ์ฒด๋ฅผ ํตํด ๋คํธ์ํฌ ํต์ ์ ์งํํฉ๋๋ค.
OkHttp์ ๋์ ์๋ฆฌ์ ๋ํด์ ์ค๋ช
OkHttp๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ ๋ด๋ถ์ ์ผ๋ก ์ฌ๋ฌ ์ธํฐ์
ํฐ๋ค์ ์ฒด์ด๋์ผ๋ก ๋์ํฉ๋๋ค. BridgeInterceptor, CacheInterceptor๋ฑ์ ๊ฑฐ์ณ์ ๋ง์ง๋ง์ CallServerInterceptor์์ request๋ฅผ ๋ ๋ฆฌ๊ณ response๋ฅผ ๋ฐ์ ํต์ ํ๋ ๊ฒ์ผ๋ก ์๊ณ ์์ต๋๋ค.
Gson์ ๋ํด ์ค๋ช
Gson์ ์๋ฐ ์ค๋ธ์ ํธ์ JSON๊ฐ์ ๋ณํ์ ๋์์ฃผ๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์
๋๋ค.
Glide
Glide์ ๋ํด์ ์ค๋ช
Glide๋ ์๋๋ก์ด๋์ ์ด๋ฏธ์ง ๋ก๋ฉ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ๋๋ค.
๋ด๋ถ์ ์ผ๋ก ์ปค์คํ ๋ HttpUrlConnection์ ์ฌ์ฉํ๋ฉฐ
Volley๋ OkHttp๋ฅผ ์ฐ๊ฒฐํ ์ ์๋ ์ ํธ๋ฆฌํฐ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ ํฌํจํ๊ณ ์์ต๋๋ค.
Glide ์บ์์ ๋ํด์ ์ค๋ช
Glide ์บ์๋ ๋ฉ๋ชจ๋ฆฌ ์บ์์ ๋์คํฌ ์บ์๊ฐ ์ฌ์ฉ๋ฉ๋๋ค.
Glide๋ฅผ ํตํด์ ์ด๋ฏธ์ง๋ฅผ ๋ถ๋ฌ์ฌ ๊ฒฝ์ฐ, ๋จผ์ ๋ฉ๋ชจ๋ฆฌ ์บ์๋ฅผ ํ์ธํด์ ๋ฐ์ดํฐ๊ฐ ์์ผ๋ฉด ๋ฉ๋ชจ๋ฆฌ ์บ์์์ ๊ฐ์ ธ์ต๋๋ค.
๋ฉ๋ชจ๋ฆฌ ์บ์์ ์์ ๊ฒฝ์ฐ ๋์คํฌ ์บ์๋ฅผ ํ์ธํฉ๋๋ค.
๋์คํฌ ์บ์์ ์์ผ๋ฉด ๋ฉ๋ชจ๋ฆฌ ์บ์์ ์ ์ฅํ ํ ๋ฐ์ดํฐ๋ฅผ ๊ฐ์ ธ์ต๋๋ค.
๋์คํฌ ์บ์์ ์์ผ๋ฉด ๋คํธ์ํฌ ํต์ ์ ํตํด์ ๋ฐ์ดํฐ๋ฅผ ๊ฐ์ ธ์ต๋๋ค.
๊ทธ๋์ ๋์คํฌ ์บ์์ ์ ์ฅํ๊ณ ๊ทธ๋ค์ ๋ฉ๋ชจ๋ฆฌ ์บ์์ ์ ์ฅํ ๋ค์ ๋ฐ์ดํฐ๋ฅผ ๊ฐ์ ธ์ต๋๋ค.
Glide ๋ฉ๋ชจ๋ฆฌ ์บ์์ ๋์คํฌ ์บ์์ ์ด๋ค ์๊ณ ๋ฆฌ์ฆ ์ฌ์ฉ๋๋์ง ์ค๋ช
LRU์๊ณ ๋ฆฌ์ฆ์ด ์ฌ์ฉ๋ฉ๋๋ค. LRU์๊ณ ๋ฆฌ์ฆ์ ๊ฐ์ฅ ์ค๋ซ๋์ ์ฐธ์กฐ๋์ง ์์ ๊ฒ์ ๋์ฒดํ๋ ์๊ณ ๋ฆฌ์ฆ์ ๋๋ค.
Coroutines
์ฝ๋ฃจํด ๋น๋: launch, async, runBlocking - ์ผ์ ์ค๋จ ์๊ณ ๋ฆฌ์ฆ์ ๋ง๋๋๋ฐ ์ฌ์ฉ๋จ. ์ฝ๋ฃจํด ๋น๋๋ฅผ ํธ์ถํ ๋ ์ ๋ฌํ๋ ์ฝ๋๋ ์ผ์ ์ค๋จ ๋๋ค์ด๋ค.
์ผ์ ์ค๋จ ํจ์(suspending functions)
- ์ผ์ ์ค๋จ ํจ์๋ฅผ ๋ง๋๋ ค๋ฉด suspend ์ ์ด์๋ง ์ถ๊ฐํ๋ฉด ๋๋ค.
- ์ผ์ ์ค๋จ ํจ์๋ delay()์ ๊ฐ์ ๋ค๋ฅธ ์ผ์ ์ค๋จ ํจ์๋ฅผ ์ง์ ํธ์ถํ ์ ์๋ค.
- ์ผ์ ์ค๋จ ํจ์๋ ์ฝ๋๋ฅผ ์ฝ๋ฃจํด ๋น๋ ์์ ๊ฐ์ ํ์๊ฐ ์๊ธฐ ๋๋ฌธ์ ๋ช ํํ๊ณ ๊ฐ๋ ์ฑ ์์.
- ์ผ์ ์ค๋จ ์ฐ์ฐ์ ๋ค๋ฅธ ์ผ์ ์ค๋จ ์ฐ์ฐ์์๋ง ํธ์ถ๋ ์ ์๋ค.
- ๋น ์ผ์ ์ค๋จ ์ฝ๋์์ ์ผ์ ์ค๋จ ํจ์๋ฅผ ํธ์ถํ๋ ค๋ฉด ์ฝ๋ฃจํด ๋น๋๋ก ๊ฐ์ธ์ผ ํ๋ค.
์ฝ๋ฃจํด ์ปจํ ์คํธ(Coroutine Context)
์ฝ๋ฃจํด์ ํญ์ ์ปจํ ์คํธ ์์์ ์คํ๋๋ค.
์ปจํ ์คํธ๋ ์ฝ๋ฃจํด์ด ์ด๋ป๊ฒ ์คํ๋๊ณ ๋์ํด์ผ ํ๋์ง๋ฅผ ์ ์ํ ์ ์๊ฒ ํด์ฃผ๋ ์์๋ค์ ๊ทธ๋ฃน์ด๋ค.
- ๋์คํจ์ฒ(Dispatcher): ์ฝ๋ฃจํด์ด ์คํ๋ ์ค๋ ๋๋ฅผ ๊ฒฐ์ (์์๋ ๊ณณ๊ณผ ์ค๋จ ํ ์ฌ๊ฐ๋ ๊ณณ์ ๋ชจ๋ ํฌํจ)
-- CommonPool
์ฑ๋
Test
AndroidTest์ Test์ ์ฐจ์ด์ ์ ๋ํด์ ์ค๋ช
AndroidTest๋ ํ๋์จ์ด๋ ์๋ฎฌ๋ ์ดํฐ์์ ์คํ๋๋ ํ ์คํธ์ ๋๋ค. ๋ฐ๋ฉด์ Test๋ ์ปดํจํฐ์ JVM ์์์ ์คํ๋๋ ํ ์คํธ์ ๋๋ค.
Mockito์ ๋ํด์ ์ค๋ช
Mockito๋ ๋ชจ์ ๊ฐ์ฒด๋ฅผ ์ฃผ์
ํด์ฃผ๋ ์๋ฐ ๊ธฐ๋ฐ์ ํ๋ ์์ํฌ์
๋๋ค.
Mockito๋ ์ ์ฌ์ฉํ๋์
์ ๋ํ
์คํธ์ ์ค์ ๊ฐ์ฒด๊ฐ ์๋๋ผ ๋ชจ์ ๊ฐ์ฒด๋ฅผ ํตํด์ ํ
์คํธํ๊ธฐ ์ํด์ ์ฌ์ฉํ์ต๋๋ค.
- ํ ์คํธํ ๋ ๋ชจ์ ๊ฐ์ฒด๋ฅผ ์ฌ์ฉํ์ ์ด์ ๊ฐ ์๋์. ์์ฆ์ ์ ๋ํ ์คํธ ๊ณต๋ถ์ค์ด๋ค โ> ์ฒ์์๋ ์ค์ ๊ฐ์ฒด๋ก ํ ์คํธํด์ผ ๋๋ค๊ณ ์๊ฐํ๋ค โ> ํด๋ณด๋ ์ ์๋๋ค โ> ์ฐพ์๋ณด๋ ๋ชจ์ ๊ฐ์ฒด๋ฅผ ๋ง์ด ์ฌ์ฉํ๋๋ผ โ> ํ ์คํธ ๋๋ธ์ด๋ผ๋ ์ฉ์ด๋ ์๊ฒ ๋จ โ> mockito๋ฅผ ์ฌ์ฉํด์ stubbing ํ์ TDD(Test Driven Development)์ ๋ํด ์ค๋ช TDD(Test Driven Development)๋ ํ๋ก๊ทธ๋จ ์ค๊ณ ํ ํ ์คํธ ์ฝ๋๋ฅผ ๋จผ์ ์์ฑํด์ ์ค๊ณ๋ฅผ ๋ณด์ํ๊ณ , ์ด๋ฅผ ํ ๋๋ก ์ฝ๋๋ฅผ ์์ฑํ๋ ๊ฐ๋ฐ ๋ฐฉ๋ฒ๋ก ์ ๋งํฉ๋๋ค.
Hamcrest์ ๋ํด ์ค๋ช
Hamcrest๋ ์กฐ๊ธ ๋ ๊ฐ๋
์ฑ ์๋ ํ
์คํธ ์ฝ๋๋ฅผ ์งค ์ ์๋๋ก ๋์์ฃผ๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์
๋๋ค.
ํ
์คํธ ๋๋ธ(Test Doubles)์ ๋ํด ์ค๋ช
ํ
์คํธ ๋๋ธ์ ์ค์ ๊ฐ์ฒด๋ก ํ
์คํธ๊ฐ ์ด๋ ค์ด ๊ฒฝ์ฐ ์ด๋ฅผ ๋์ ํด์ ์ฌ์ฉํ ์ ์๋ ๊ฐ์ฒด๋ค์ ๋งํฉ๋๋ค.
ํ
์คํธ ๋๋ธ์ ์ข
๋ฅ์ ๊ทธ ์ข
๋ฅ๋ค์ ๋ํด ์ค๋ช
ํ
์คํธ ๋๋ธ์ ํฌ๊ฒ Dummy, Fake, Stub, Spy, Mock์ผ๋ก ๋๋ฉ๋๋ค.
- Dummy๋ ์ธ์คํด์คํ๋ ๊ฐ์ฒด๋ง ํ์ํ๊ณ ๊ฐ์ฒด์ ๊ธฐ๋ฅ์ ํ์ํ์ง ์์ ๋ ์ฌ์ฉ๋ฉ๋๋ค.
- Fake๋ ์ค์ ๊ตฌํ์ ๋จ์ํ์์ผ์ ๋ง๋ ํ ์คํธ ๊ฐ์ฒด๋ฅผ ๋งํฉ๋๋ค.
- Stub์ ํ ์คํธ์์ ํธ์ถ๋ ์์ฒญ์ ๋ํด์ ๋ฏธ๋ฆฌ ์ค๋นํด๋ ๊ฒฐ๊ณผ๋ฅผ ์ ๊ณตํ๋ ๊ฒ์ ๋งํฉ๋๋ค. Android์์ ์์ฃผ ์ฌ์ฉ๋๋ Mockito ์ญ์ Stub์ ๋๋ค.
- Spy๋ Stub์ ์ญํ ์ ๊ฐ์ง๋ฉด์ ํธ์ถ๋ ๋ด์ฉ์ ๋ํด ์ฝ๊ฐ์ ์ ๋ณด๋ฅผ ๊ธฐ๋กํฉ๋๋ค. Mockito์ verify๊ฐ ์ด์ ๊ฐ์ ์ญํ ์ ํฉ๋๋ค.
- Mock์ ํ์ ๊ฒ์ฆ์ ํ๋ ๋ชจ์ ๊ฐ์ฒด๋ฅผ ๋งํฉ๋๋ค.
์ํ ๊ฒ์ฆ๊ณผ ํ์ ๊ฒ์ฆ์ ๋ํด์ ์ค๋ช
- ์ํ ๊ฒ์ฆ์ ๋ฉ์๋๊ฐ ์ํ๋ ์ดํ ์ฃผ์ ๊ฐ์ฒด๋ ํ๋ ฅ ๊ฐ์ฒด์ ์ํ๋ฅผ ์ดํด๋ด์ผ๋ก์จ ์ฌ๋ฐ๋ฅด๊ฒ ๋์ํ๋์ง ๊ฒ์ฆํ๋ ๊ฒ์ ๋งํฉ๋๋ค.
- ํ์ ๊ฒ์ฆ์ ์ํ ๊ฒ์ฆ๊ณผ ๋ฌ๋ฆฌ ์ฃผ์ ๊ฐ์ฒด๋ ํ๋ ฅ ๊ฐ์ฒด์ ํน์ ๋ฉ์๋๊ฐ ํธ์ถ๋์๋์ง์ ํ์๋ฅผ ๊ฒ์ฆํ๋ ๊ฒ์ ๋งํฉ๋๋ค.