๐ŸŒ€Jetpack Compose์˜ ํ•ต์‹ฌ, Recomposition

์ด์˜ํ›ˆยท2025๋…„ 4์›” 17์ผ
0

All About Compose

๋ชฉ๋ก ๋ณด๊ธฐ
2/5
post-thumbnail

Jetpack Compose์˜ recomposition(์žฌ๊ตฌ์„ฑ)์€ Compose์—์„œ ๊ฐ€์žฅ ์ค‘์š”ํ•œ ๊ฐœ๋… ์ค‘ ํ•˜๋‚˜์ž…๋‹ˆ๋‹ค.
UI๋ฅผ ์•„์ฃผ ๋˜‘๋˜‘ํ•˜๊ฒŒ ๋‹ค์‹œ ๊ทธ๋ ค์ฃผ๊ธฐ ๋•Œ๋ฌธ์— ์„ฑ๋Šฅ์ด ์ข‹๊ณ , ์„ ์–ธํ˜• UI๋ฅผ ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ๋Š” ๊ธฐ๋ฐ˜์ด ๋ฉ๋‹ˆ๋‹ค.


๐Ÿค” Recomposition์ด๋ž€?

@Composable ํ•จ์ˆ˜๋Š” UI๋ฅผ ๊ทธ๋ฆฌ๋Š” ํ•จ์ˆ˜์ž…๋‹ˆ๋‹ค.
๊ทธ๋Ÿฐ๋ฐ ์•ฑ์„ ์‚ฌ์šฉํ•˜๋‹ค ๋ณด๋ฉด, ๋ฐ์ดํ„ฐ๊ฐ€ ๋ฐ”๋€Œ๋Š” ๊ฒฝ์šฐ๊ฐ€ ๋งŽ์Šต๋‹ˆ๋‹ค.
์ด๋Ÿด ๋•Œ UI๋„ ๊ฐ™์ด ๋ฐ”๋€Œ์–ด์•ผ ์ž์—ฐ์Šค๋Ÿฝ๊ฒ ์ฃ ?

Compose์—์„œ๋Š” ๊ฐ’์ด ๋ฐ”๋€Œ๋ฉด ํ•ด๋‹น ์ปดํฌ์ €๋ธ” ํ•จ์ˆ˜๋ฅผ ๋‹ค์‹œ ์‹คํ–‰ํ•ด์„œ UI๋ฅผ ์ž๋™์œผ๋กœ ์—…๋ฐ์ดํŠธํ•ฉ๋‹ˆ๋‹ค.
์ด ๊ณผ์ •์„ ๋ฐ”๋กœ Recomposition์ด๋ผ๊ณ  ํ•ฉ๋‹ˆ๋‹ค.

์ฆ‰,

โ€œ์ž…๋ ฅ๊ฐ’(State ๋“ฑ)์ด ๋ฐ”๋€Œ๋ฉด ํ•ด๋‹น UI๋ฅผ ์ž๋™์œผ๋กœ ๋‹ค์‹œ ๊ทธ๋ ค์ค€๋‹คโ€


๐Ÿ” ์–ธ์ œ Recomposition์ด ๋ฐœ์ƒํ•˜๋‚˜์š”?

Recomposition์€ ์ปดํฌ์ €๋ธ” ํ•จ์ˆ˜์— ์ „๋‹ฌ๋œ ๊ฐ’์ด ๋ณ€๊ฒฝ๋˜์—ˆ์„ ๋•Œ ์ž๋™์œผ๋กœ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค.
์ฃผ๋กœ ์•„๋ž˜์™€ ๊ฐ™์€ ๊ฒฝ์šฐ์— ์ผ์–ด๋‚ฉ๋‹ˆ๋‹ค.

  1. remember, mutableStateOf๋กœ ์„ ์–ธํ•œ ๊ฐ’์ด ๋ฐ”๋€Œ์—ˆ์„ ๋•Œ
  2. StateFlow, LiveData๋ฅผ .collectAsState()๋กœ ๊ตฌ๋… ์ค‘์ผ ๋•Œ
  3. ์ปดํฌ์ €๋ธ”์˜ ํŒŒ๋ผ๋ฏธํ„ฐ๊ฐ€ ๋ณ€๊ฒฝ๋˜์—ˆ์„ ๋•Œ
  4. derivedStateOf, snapshotFlow ๋“ฑ์„ ์‚ฌ์šฉํ•œ ๊ฐ’์ด ๋ณ€๊ฒฝ๋˜์—ˆ์„ ๋•Œ

๐ŸŽฏ ์˜ˆ์‹œ๋กœ ์‰ฝ๊ฒŒ ์ดํ•ดํ•ด๋ณด์ž

@Composable
fun Counter() {
    var count by remember { mutableStateOf(0) }

    Column {
        Text("Count: $count") // ์ด ๋ถ€๋ถ„์ด recomposition ๋Œ€์ƒ
        Button(onClick = { count++ }) {
            Text("Click me")
        }
    }
}
  • ๋ฒ„ํŠผ์„ ํด๋ฆญํ•˜๋ฉด count++๋กœ ๊ฐ’์ด ์ฆ๊ฐ€ํ•˜๋ฉด์„œ, mutableStateOf๊ฐ€ Compose์—๊ฒŒ โ€œ๊ฐ’์ด ๋ฐ”๋€Œ์—ˆ์–ด!โ€๋ผ๊ณ  ์•Œ๋ ค์ค๋‹ˆ๋‹ค.
  • ๊ทธ๋Ÿฌ๋ฉด Compose๋Š” Text("Count: $count")๋ฅผ ๋‹ค์‹œ ์‹คํ–‰ํ•ด์„œ ๋ณ€๊ฒฝ๋œ ๊ฐ’์„ ๋ฐ˜์˜ํ•œ UI๋ฅผ ๊ทธ๋ ค์ค๋‹ˆ๋‹ค.
  • ๊ธฐ์กด ๋ฒ„ํŠผ์€ ๊ทธ๋Œ€๋กœ ์œ ์ง€๋˜๊ณ , ํ…์ŠคํŠธ ๋ถ€๋ถ„๋งŒ ์ƒˆ๋กœ ๊ทธ๋ ค์ง‘๋‹ˆ๋‹ค.
    โ†’ ํ•„์š”ํ•œ ๋ถ€๋ถ„๋งŒ ์—…๋ฐ์ดํŠธ๋˜๊ธฐ ๋•Œ๋ฌธ์— ์„ฑ๋Šฅ๋„ ๊ตฟ!

๐Ÿง  ๋‚ด๋ถ€ ์ž‘๋™ ๋ฐฉ์‹ (๊ฐ„๋‹จ ์š”์•ฝ)

  1. mutableStateOf(...) ๊ฐ™์€ ์ƒํƒœ ๊ฐ’์€ ๋‚ด๋ถ€์ ์œผ๋กœ Compose์—๊ฒŒ ๋ณ€๊ฒฝ์„ ๊ฐ์ง€์‹œํ‚ต๋‹ˆ๋‹ค.
  2. Compose๋Š” ์–ด๋–ค ์ปดํฌ์ €๋ธ”์ด ๊ทธ ๊ฐ’์„ ์ฝ์—ˆ๋Š”์ง€ ์ถ”์ ํ•ฉ๋‹ˆ๋‹ค.
  3. ํ•ด๋‹น ๊ฐ’์ด ๋ฐ”๋€Œ๋ฉด, ๊ด€๋ จ๋œ ์ปดํฌ์ €๋ธ”๋งŒ ๋‹ค์‹œ ์‹คํ–‰๋ฉ๋‹ˆ๋‹ค.
  4. ์ด๋•Œ ์‹ค์ œ๋กœ ๋ณ€๊ฒฝ๋œ UI๋งŒ ๋‹ค์‹œ ๊ทธ๋ ค์ฃผ๋Š” ๋˜‘๋˜‘ํ•œ ์ฒ˜๋ฆฌ(diffing)๊ฐ€ ์ด๋ฃจ์ง‘๋‹ˆ๋‹ค.

โš ๏ธ ์šฉ์–ด ์ •๋ฆฌ

์šฉ์–ด์„ค๋ช…
Composition์ปดํฌ์ €๋ธ”์ด ์ฒ˜์Œ ์‹คํ–‰๋˜์–ด UI๋ฅผ ๊ทธ๋ฆฌ๋Š” ๊ณผ์ •
Recomposition๊ฐ’์ด ๋ฐ”๋€Œ์–ด ํ•ด๋‹น ์ปดํฌ์ €๋ธ”์„ ๋‹ค์‹œ ์‹คํ–‰ํ•˜๋Š” ๊ณผ์ •
rememberrecomposition ์‹œ ๊ฐ’์„ ๊ธฐ์–ตํ•˜๋„๋ก ํ•ด์ฃผ๋Š” ํ‚ค์›Œ๋“œ
derivedStateOf๋‹ค๋ฅธ ์ƒํƒœ์— ์˜์กดํ•œ ๊ฐ’์„ ์ถ”์ ํ•  ๋•Œ ์‚ฌ์šฉ
key๋ฆฌ์ŠคํŠธ๋‚˜ ๋ฐ˜๋ณต๋œ UI์—์„œ recomposition ๋ฒ”์œ„๋ฅผ ์ œ์–ดํ•  ์ˆ˜ ์žˆ๋Š” ๊ธฐ์ค€ ๊ฐ’

โœ… Recomposition์„ ์ค„์ด๋ ค๋ฉด?

๋ถˆํ•„์š”ํ•œ ์žฌ๊ตฌ์„ฑ์„ ์ค„์ด๋ฉด ์•ฑ์ด ํ›จ์”ฌ ๋” ๋ถ€๋“œ๋Ÿฝ๊ณ  ํšจ์œจ์ ์œผ๋กœ ๋™์ž‘ํ•ฉ๋‹ˆ๋‹ค.
Tips !

  • remember๋ฅผ ์ ๊ทน ํ™œ์šฉํ•ด ๊ณ„์‚ฐ ๋น„์šฉ์ด ํฐ ์ž‘์—…์„ ์บ์‹œํ•œ๋‹ค.
  • ์ƒํƒœ๋ฅผ ๊ฐ€๋Šฅํ•œ ์ž‘์€ ๋‹จ์œ„๋กœ ์ชผ๊ฐœ์„œ ๊ด€๋ฆฌํ•œ๋‹ค.
  • UI ์ปดํฌ์ €๋ธ”์„ ์ž˜๊ฒŒ ๋‚˜๋ˆ ์„œ ํ•„์š”ํ•œ ๋ถ€๋ถ„๋งŒ ์žฌ๊ตฌ์„ฑ๋˜๊ฒŒ ํ•œ๋‹ค.
  • LaunchedEffect, SideEffect ๋“ฑ ์‚ฌ์ด๋“œ ์ดํŽ™ํŠธ ๊ด€๋ จ ๋„๊ตฌ๋ฅผ ์ ์ ˆํžˆ ์‚ฌ์šฉํ•œ๋‹ค.

๐Ÿ” ์˜ˆ: Recomposition ๋ฒ”์œ„ ์ตœ์ ํ™”

@Composable
fun Parent() {
    var count by remember { mutableStateOf(0) }

    Column {
        Button(onClick = { count++ }) {
            Text("Increase")
        }
        Child() // ์ด ํ•จ์ˆ˜๋Š” count์™€ ๋ฌด๊ด€ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๋‹ค์‹œ ์‹คํ–‰๋˜์ง€ ์•Š์Œ
        Text("Count: $count") // ์ด ๋ถ€๋ถ„๋งŒ ๋‹ค์‹œ ๊ทธ๋ ค์ง
    }
}

@Composable
fun Child() {
    Log.d("Recomp", "Child recomposed!") // ๋กœ๊ทธ ์•ˆ ์ฐํž˜
}
  • count ๊ฐ’์ด ๋ฐ”๋€Œ์–ด๋„ Child()๋Š” ์˜ํ–ฅ์„ ๋ฐ›์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์—, ๋ถˆํ•„์š”ํ•œ recomposition์„ ํ”ผํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๐Ÿงต ๋งˆ๋ฌด๋ฆฌํ•˜๋ฉฐ

Jetpack Compose์˜ Recomposition์€ ์„ ์–ธํ˜• UI์˜ ํ•ต์‹ฌ์ด๋ฉฐ,
ํšจ์œจ์ ์ด๊ณ  ์ง๊ด€์ ์ธ UI ๊ฐœ๋ฐœ์„ ๊ฐ€๋Šฅํ•˜๊ฒŒ ๋งŒ๋“ค์–ด์ค๋‹ˆ๋‹ค.

โ€œ์ž…๋ ฅ๊ฐ’์ด ๋ฐ”๋€Œ๋ฉด ๊ด€๋ จ๋œ ๋ถ€๋ถ„๋งŒ ๋‹ค์‹œ ๊ทธ๋ฆฐ๋‹ค.โ€
์ด ๋‹จ์ˆœํ•œ ์›์น™์ด Compose์˜ ๋ชจ๋“  ๋™์ž‘์„ ์ด๋Œ๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

์ด๋ฅผ ์ดํ•ดํ•˜๊ณ  ์ž˜ ํ™œ์šฉํ•˜๋ฉด, ์„ฑ๋Šฅ๋„ ์žก๊ณ  ์œ ์ง€๋ณด์ˆ˜๋„ ์‰ฌ์šด UI ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค ๐Ÿ˜Ž

profile
์•ˆ๋“œ๋กœ์ด๋“œ ๊ฐœ๋ฐœ์ž์ž…๋‹ˆ๋‹น

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