๐Ÿ”ฅTIL๐Ÿ”ฅJetpack Compose | Recomposition

hyihyiยท2024๋…„ 4์›” 19์ผ
1

Compose

๋ชฉ๋ก ๋ณด๊ธฐ
4/4
post-thumbnail
post-custom-banner

๐Ÿ“– ์ปดํฌ์ฆˆ๋Š” ์–ด๋–ป๊ฒŒ ์ฝ”๋“œ๋ฅผ ํ™”๋ฉด์— ๋ณด์—ฌ์ฃผ๋Š”๊ฐ€?

  • ํ™”๋ฉด์„ ๊ทธ๋ฆฌ๋Š” ์‹œ์ ์— ํ•ด๋‹น ํ™”๋ฉด์— ์žˆ๋Š” ์ปดํฌ์ €๋ธ” ํ•จ์ˆ˜๋ฅผ ํŒŒ์‹ฑํ•ด์„œ ๋ฉ”๋ชจ๋ฆฌ์— UI ํŠธ๋ฆฌ๋ฅผ ๊ทธ๋ฆผ
    ์ด ๋•Œ ์ปดํฌ์ €๋ธ” ํ•จ์ˆ˜์˜ ์ฝ”๋“œ ๋ธ”๋Ÿญ์ด ์‹คํ–‰๋จ
  • ๋งŒ๋“ค์–ด์ง„ UI ํŠธ๋ฆฌ๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ๋ Œ๋”๋ง ๋กœ์ง์ด ์‹คํ–‰๋˜๋ฉด์„œ ํ™”๋ฉด์— ๋ทฐ๋ฅผ ๊ทธ๋ฆผ
    High Cost , ์ด ์ž‘์—…์€ ๋น„์šฉ์ด ์•„์ฃผ ํผ

๐Ÿ“ Composition

: ์ฝ”๋“œ๋ฅผ ๋ฉ”๋ชจ๋ฆฌ์— ํŠธ๋ฆฌ๋กœ ํ•ด์„ํ•˜๋Š” ๊ณผ์ •


๐Ÿ“ Recomposition

: data๊ฐ€ ๋ฐ”๋€Œ์–ด์„œ ํŠธ๋ฆฌ๋ฅผ ์ƒˆ๋กœ ๊ทธ๋ ค์•ผ ํ•˜๋Š” ๊ฒฝ์šฐ

ex) ์ธ์ž name์ด ๋ฐ”๋€Œ๋ฉด ์ƒˆ๋กœ Recomposition์ด ๋˜์–ด์•ผ ํ•จ

ํ•˜์ง€๋งŒ ์ด๋Ÿฌํ•œ Recomposition ๊ณผ์ •์€ ๋น„์šฉ์ด ํฌ๊ธฐ ๋•Œ๋ฌธ์— ํ•„์š”ํ•œ ๊ฒƒ๋งŒ ์ƒˆ๋กœ ๊ทธ๋ ค์•ผ ํ•œ๋‹ค.
๐Ÿ‘‰Idempotent : Data๊ฐ€ ๊ฐ™์œผ๋ฉด ๊ฒฐ๊ณผ๊ฐ€ ๊ฐ™๋„๋ก ์ž‘์„ฑํ•ด์•ผ ํ•œ๋‹ค.

๐Ÿ’ก์„ ์–ธํ˜• UI๋ฅผ ๊ฐœ๋ฐœํ•  ๋•Œ๋Š” Recomposition์„ ๊ณ ๋ คํ•ด์•ผ ํ•œ๋‹ค.

โœ‹ Recomposition๋กœ ์ธํ•ด Composable ํ•จ์ˆ˜๊ฐ€ ๊ฐ€์ง€๋Š” ํŠน์„ฑ

  1. ์ˆœ์„œ๋Œ€๋กœ ์‹คํ–‰๋˜์ง€ ์•Š์„ ์ˆ˜ ์žˆ๋‹ค.
    ํ™”๋ฉด์— ์•ˆ ๋ณด์ด๋Š” UI๋ผ๋ฉด Recomposition์€ ๋‚ด๋ถ€์ ์ธ ์šฐ์„ ์ˆœ์œ„์— ๋”ฐ๋ผ ์ˆœ์„œ์™€ ๋ฌด๊ด€ํ•˜๊ฒŒ ์‹คํ–‰๋  ์ˆ˜ ์žˆ๋‹ค.
  2. ๋ฉ”์ธ ์Šค๋ ˆ๋“œ์—์„œ ์‹คํ–‰๋˜์ง€ ์•Š์„ ์ˆ˜ ์žˆ๋‹ค.
    Recomposition์€ ๋ Œ๋”๋ง์„ ํ•˜๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๋ผ์„œ ์—ฌ๋Ÿฌ ์Šค๋ ˆ๋“œ์—์„œ ๋™์‹œ์— ์‹คํ–‰๋  ์ˆ˜ ์žˆ๋‹ค.
  3. ๋น ๋ฅด๊ฒŒ ๋‹ค์‹œ ์‹คํ–‰๋  ์ˆ˜ ์žˆ๋‹ค.
    ์• ๋‹ˆ๋ฉ”์ด์…˜์„ ์ ์šฉํ•  ๋•Œ๋Š” ์•„์ฃผ ์งง์€ ์‹œ๊ฐ„์— data๊ฐ€ ๊ณ„์† ๋ฐ”๋€Œ๊ณ  Recomposition์€ ํŠธ๋ฆฌ ์ƒ์„ฑ ์ค‘์— ์ธ์ž๊ฐ€ ๋ฐ”๋€Œ๋ฉด ํ•˜๋˜ ์ž‘์—…์„ ์ทจ์†Œํ•˜๊ณ  ๋‹ค์‹œ ์ƒ์„ฑ์„ ์‹œ์ž‘ํ•œ๋‹ค.
    ์ด๋Ÿฌํ•œ ์ด์œ ๋กœ Composable ์ฝ”๋“œ๋Š” ์—ฌ๋Ÿฌ ๋ฒˆ ๋ฐ˜๋ณต ํ˜ธ์ถœ๋  ์ˆ˜ ์žˆ๋‹ค.

๐Ÿ“ Compose ์ƒํƒœ ๊ด€๋ฆฌ

data๊ฐ€ ๋ฐ”๋€Œ๋ฉด Recomposition์„ ํ•˜๋Š”๋ฐ ๋ชจ๋“  Data๋ฅผ ๋‹ค ๊ฐ์ง€ํ•  ์ˆ˜ ์žˆ๋Š” ๊ฑด ์•„๋‹ˆ๋‹ค.
Compose๋Š” ๊ธฐ๋ณธ์ ์œผ๋กœ ํ•จ์ˆ˜์˜ ์ธ์ž๋งŒ์„ ๊ด€์ฐฐํ•  ์ˆ˜ ์žˆ๋‹ค.

๊ด€์ฐฐ ๋Œ€์ƒ์— ๋ณ€์ˆ˜๋ฅผ ์ถ”๊ฐ€ํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” remember ํ•จ์ˆ˜์™€ mutableState ํƒ€์ž…์„ ์‚ฌ์šฉํ•ด์•ผ ํ•œ๋‹ค.


์œ„์˜ ๊ฒฝ์šฐ์—๋Š” Recomposition ์‹œ์ ์— ์ƒˆ๋กœ ํ•จ์ˆ˜๊ฐ€ ์‹คํ–‰๋˜์–ด๋„ ํ•ญ์ƒ 0์œผ๋กœ ์žฌ์„ค์ •๋œ๋‹ค.
์ฆ‰, ๋กœ์ปฌ ๋ณ€์ˆ˜๋Š” ์ƒํƒœ ์œ ์ง€๊ฐ€ ์•ˆ ๋œ๋‹ค.

๐Ÿค” ๊ทธ๋Ÿผ, ๊ด€์ฐฐ ๋Œ€์ƒ์— ํฌํ•จ์‹œํ‚ค๋ ค๋ฉด ์–ด๋–ป๊ฒŒ ํ•ด์•ผ ํ• ๊นŒ?

remember { mutableStateOf(data) }
: remember ํ•จ์ˆ˜์™€ mutableState ํƒ€์ž…์„ ์‚ฌ์šฉ
๐Ÿ‘‰ ๋กœ์ปฌ ๋ณ€์ˆ˜์— ๊ฐ’์„ ์ €์žฅํ•˜์ง€ ์•Š๊ณ  ์‹œ์Šคํ…œ ์บ์‹œ์— ๊ฐ’์„ ์ €์žฅ

Recomposition์ด ๋˜์–ด์„œ ํ•จ์ˆ˜๊ฐ€ ์ƒˆ๋กœ ๋ถˆ๋ ธ์„ ๋•Œ ์™ธ๋ถ€์˜ ์ „์—ญ ์บ์‹œ์—์„œ ๊ทธ ๊ฐ’์„ ๊ฐ€์ ธ์˜ค๊ณ 
์บ์‹œ๊ฐ€ ์—†์œผ๋ฉด ์ดˆ๊ธฐ๊ฐ’์œผ๋กœ ์„ค์ •์„ ํ•จ

์™ผ์ชฝ์€ ๋กœ์ปฌ ๋ณ€์ˆ˜์— ๊ฐ’์„ ์ €์žฅํ•จ. ์˜ค๋ฅธ์ชฝ์€ remember(์‹œ์Šคํ…œ ์บ์‹œ)์— ๊ฐ’์„ ์ €์žฅํ•จ.

โœ‹ ์ฃผ์š” ์ƒํƒœ API - MutableStateOf

MutableState ํƒ€์ž…์˜ ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•ด์ฃผ๋Š” ์ƒ์„ฑ ํ•จ์ˆ˜

โœ‹ ์ฃผ์š” ์ƒํƒœ API - MutableState<T>

State : Observer ํŒจํ„ด์—์„œ ์–ด๋–ค ์ด๋ฒคํŠธ๋‚˜ ๊ด€์ฐฐ์ž๊ฐ€ ๋ฐ”๋€Œ์—ˆ์„ ๋•Œ observerํ•œํ…Œ notify๋ฅผ ํ•ด์ฃผ๋Š”๋ฐ state๊ฐ€ ๊ทธ๋Ÿฐ ์—ญํ• ์„ ํ•จ
state๋ผ๋Š” ๊ด€์ฐฐ ๋Œ€์ƒ์ด ์žˆ์„ ๋•Œ state๊ฐ€ ๋ฐ”๋€Œ๋ฉด ๊ด€์ฐฐํ•˜๊ณ  ์žˆ๋‹ค๊ฐ€ ๋ทฐ๊ฐ€ ๋ฐ”๋€Œ๋Š” Flow.
๊ด€์ฐฐ ๋Œ€์ƒ์ด ๊ฐ–๊ณ  ์žˆ๋Š” ๊ฐ’์ด value.

โœ‹ ์ฃผ์š” ์ƒํƒœ API - State<T>

State๋ฅผ ์ƒ์†๋ฐ›๋Š” ๊ฒƒ๋“ค์€ MutableStateOf ๋ง๊ณ ๋„ flow, rxjava, livedata ๋“ฑ์ด ์žˆ๋Š”๋ฐ ๋ชจ๋‘ ๊ฐ’์„ ๊ด€์ฐฐํ•  ๋•Œ State ํ˜•ํƒœ๋กœ ๊ด€๋ฆฌ๋œ๋‹ค.

๐Ÿ’กCompose์—์„œ ๋ทฐ๋ฅผ ์ƒˆ๋กœ ๊ทธ๋ฆฌ๋Š” ๊ธฐ์ค€์€ State์˜ ๋ณ€๊ฒฝ ์—ฌ๋ถ€์ด๋‹ค.

โœ‹ ์ฃผ์š” ์ƒํƒœ API - remember

remember : Composeํ•œํ…Œ "์บ์‹œ ํ•ด ์ค˜!"๋ผ๊ณ  ํ•˜๋Š” ์—ญํ• . ๊ทธ๋ƒฅ ์บ์‹ฑํ•จ์ˆ˜๋ผ๊ณ  ์ƒ๊ฐํ•˜์ž.

๐Ÿค” remember๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ํ™”๋ฉด์ด ๋ณ€๊ฒฝ๋˜์–ด Activity๊ฐ€ ์ƒˆ๋กœ ์ƒ์„ฑ๋  ๋•Œ ๊ฐ’์ด ์œ ์ง€๋˜์ง€ ์•Š๊ณ  ์ƒํƒœ๊ฐ€ ์ดˆ๊ธฐํ™”๋œ๋‹ค. ์ด ๋ฌธ์ œ๋Š” ์–ด๋–ป๊ฒŒ ํ•ด๊ฒฐํ• ๊นŒ?

๐Ÿ‘‰ stroe์— restoreํ•˜๋Š” ์ถ”๊ฐ€ ์ž‘์—…์„ ํ•ด์ฃผ๋Š” rememberSaveable์„ ์‚ฌ์šฉํ•˜์ž

โœ‹ ์ฃผ์š” ์ƒํƒœ API - rememberSaveable

Configuration Change๋กœ Activity๊ฐ€ ์žฌ์ƒ์„ฑ๋˜์–ด๋„ ์ƒํƒœ๋ฅผ ๊ธฐ์–ตํ•˜๋„๋ก State๋ฅผ ์บ์‹ฑํ•˜๋Š” ํ•จ์ˆ˜


๐Ÿ“ Kotlin Property Delegation

val count = remember { mutableStatOf(0) }

์œ„์˜ ์ฝ”๋“œ๋ฅผ ์•„๋ž˜์ฒ˜๋Ÿผ ์“ฐ๋ฉด ๋œ๋‹ค.

var count by remember { mutableStatOf(0) }

property์— getter์™€ setter๋ฅผ ์œ„์ž„ํ•˜๋Š” ๊ฒƒ.
value๋ฅผ ๋ช…์‹œํ•˜์ง€ ์•Š์•„๋„ ์ž๋™์œผ๋กœ ๋ถˆ๋Ÿฌ์คŒ


๐Ÿ“ ์ƒํƒœ๊ฐ€ ๋ณ€๊ฒฝ๋  ๋•Œ์˜ Recomposition ๊ณผ์ •


1. ํด๋ฆญ ์ด๋ฒคํŠธ๊ฐ€ ๋ฐœ์ƒํ•ด count์˜ ์ƒํƒœ๊ฐ€ ๋ฐ”๋€œ
2. count์˜ ๊ฐ’์ด ๋ฐ”๋€Œ๋ฉด Compose์—๊ฒŒ ์ƒํƒœ๊ฐ€ ๋ฐ”๋€Œ์—ˆ๋‹ค๊ณ  ์•Œ๋ฆผ์ด ๊ฐ€๊ณ  Recomposition์ด ์ผ์–ด๋‚จ

3. recomposition์ด ์ผ์–ด๋‚˜๋ฉด ๋ณ€๊ฒฝ๋œ ๊ฐ’์„ ์ฐธ์กฐํ•˜๋Š” ๋ถ€๋ถ„์„ ์ฐพ์•„ ๋‹ค์‹œ ๊ทธ๋ฆผ

์š”์•ฝ

๋ฐ”๋€Œ์—ˆ์„ ๋•Œ ๋ทฐ๋ฅผ ์ƒˆ๋กœ ๊ทธ๋ ค์•ผ๋˜๋Š” ๊ด€๊ณ„๋ฅผ state๋กœ ์ •์˜ํ•˜๊ณ  state ๊ฐ’์„ ๋ฐ”๊พธ๋ฉด Compose๋Š” ์ง€์ผœ๋ณด๊ณ  ์žˆ๋‹ค๊ฐ€ ์ฐธ์กฐํ•˜๊ณ  ์žˆ๋Š” ๊ฑธ ๋ฐ”๊พธ๋Š” ํ˜•ํƒœ๋กœ Recomposition์ด ์ผ์–ด๋‚จ


๐Ÿ“ Stateful VS Stateless

Stateful ํ•จ์ˆ˜ : ์ปดํฌ์ €๋ธ” ํ•จ์ˆ˜ ๋‚ด์— ์ƒํƒœ๊ฐ€ ์žˆ์Œ

Stateful ํ•จ์ˆ˜๋Š” ์žฌ์‚ฌ์šฉ์„ฑ์ด ๋–จ์–ด์ง€๊ณ  ํ…Œ์ŠคํŠธ๊ฐ€ ์–ด๋ ค์›€

์žฌ์‚ฌ์šฉ์„ฑ์„ ์œ„ํ•ด์„œ๋Š” ํ•„์š”ํ•  ๋•Œ๋งŒ State๋ฅผ ์‚ฌ์šฉํ•˜์ž


๐Ÿ“ State hoisting

๋‚ด๋ถ€์— ์žˆ๋Š” ๊ฐ’(count)๊ณผ ์ด๋ฒคํŠธ(onClick)๋ฅผ ์™ธ๋ถ€๋กœ ์ถ”์ถœ

์žฌ์‚ฌ์šฉ์„ฑ์„ ์œ„ํ•ด์„œ ํ•จ์ˆ˜๋ฅผ Statelessํ™” ์‹œํ‚ฌ ๋•Œ ์‚ฌ์šฉํ•˜๋Š” ๊ธฐ๋ฒ•

profile
๋‚ด๊ฐ€ ์ดํ•ดํ•˜๊ธฐ ์‰ฝ๊ฒŒ ์“ฐ๋Š” ๋ธ”๋กœ๊ทธ
post-custom-banner

0๊ฐœ์˜ ๋Œ“๊ธ€