Android - YunByungKwan/Fundamental GitHub Wiki

Android

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์€ ํ–‰์œ„ ๊ฒ€์ฆ์„ ํ•˜๋Š” ๋ชจ์˜ ๊ฐ์ฒด๋ฅผ ๋งํ•ฉ๋‹ˆ๋‹ค.

์ƒํƒœ ๊ฒ€์ฆ๊ณผ ํ–‰์œ„ ๊ฒ€์ฆ์— ๋Œ€ํ•ด์„œ ์„ค๋ช…

  • ์ƒํƒœ ๊ฒ€์ฆ์€ ๋ฉ”์„œ๋“œ๊ฐ€ ์ˆ˜ํ–‰๋œ ์ดํ›„ ์ฃผ์š” ๊ฐ์ฒด๋‚˜ ํ˜‘๋ ฅ ๊ฐ์ฒด์˜ ์ƒํƒœ๋ฅผ ์‚ดํŽด๋ด„์œผ๋กœ์จ ์˜ฌ๋ฐ”๋ฅด๊ฒŒ ๋™์ž‘ํ–ˆ๋Š”์ง€ ๊ฒ€์ฆํ•˜๋Š” ๊ฒƒ์„ ๋งํ•ฉ๋‹ˆ๋‹ค.
  • ํ–‰์œ„ ๊ฒ€์ฆ์€ ์ƒํƒœ ๊ฒ€์ฆ๊ณผ ๋‹ฌ๋ฆฌ ์ฃผ์š” ๊ฐ์ฒด๋‚˜ ํ˜‘๋ ฅ ๊ฐ์ฒด์˜ ํŠน์ • ๋ฉ”์„œ๋“œ๊ฐ€ ํ˜ธ์ถœ๋˜์—ˆ๋Š”์ง€์˜ ํ–‰์œ„๋ฅผ ๊ฒ€์ฆํ•˜๋Š” ๊ฒƒ์„ ๋งํ•ฉ๋‹ˆ๋‹ค.

โš ๏ธ **GitHub.com Fallback** โš ๏ธ