๋ณธ๋ฌธ์œผ๋กœ ๊ฑด๋„ˆ๋›ฐ๊ธฐ

๐Ÿ‘‰ React Native

โ“ React Native old architecture์˜ ์–ด๋– ํ•œ ๋ฌธ์ œ ๋–„๋ฌธ์— new architecture๊ฐ€ ๋‚˜์˜ค๊ฒŒ ๋˜์—ˆ๋‚˜?โ€‹

๊ธฐ์กด์— react native์˜ old architecture๋Š” bridge ํ†ต์‹ ์˜ ๊ทผ๋ณธ์ ์ธ ํ•œ๊ณ„๊ฐ€ ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค.
javascript์™€ native ๋ ˆ์ด์–ด ๊ฐ„์— ๋ชจ๋“  ํ†ต์‹ ์ด bridge๋ผ๋Š” ์ค‘๊ฐ„ ๋งค๊ฐœ์ฒด๋ฅผ ํ†ตํ•ด ๋น„๋™๊ธฐ์ ์œผ๋กœ ์ฒ˜๋ฆฌํ•˜์˜€๋Š”๋ฐ javascript ๋ ˆ์ด์–ด๊ฐ€ ๋ฐ์ดํ„ฐ๋ฅผ bridge๋กœ ๋ณด๋‚ด๊ณ  native ๋ ˆ์ด์–ด๋Š” ์ด ์ฒ˜๋ฆฌ๋ฅผ ๊ธฐ๋‹ค๋ ค์•ผ ํ•ฉ๋‹ˆ๋‹ค.
์ด๋กœ ์ธํ•ด์„œ ๋ถˆํ•„์š”ํ•œ ์ง€์—ฐ์ด ๋ฐœ์ƒํ•˜๊ณ  ๋ฐ˜์‘์„ฑ์ด ๋–จ์–ด์ง€๊ฒŒ ๋˜๋Š” ๋ฌธ์ œ๊ฐ€ ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค.

๋˜ํ•œ, bridge๋ฅผ ํ†ต๊ณผํ• ๋•Œ ๋ชจ๋“  ๋ฐ์ดํ„ฐ๋Š” JSON ํ˜•ํƒœ๋กœ ์ง๋ ฌํ™”๋˜์–ด์•ผํ•˜๋Š”๋ฐ ๋ณต์žกํ•œ javascript ๊ฐ์ฒด๋ฅผ ๋ฌธ์ž์—ด๋กœ ๋ณ€ํ™˜๋˜๊ณ  ์ „์†ก๋˜๊ณ  ๋‹ค์‹œ ํŒŒ์‹ฑํ•˜๋Š” ๊ณผ์ •์—์„œ ์„ฑ๋Šฅ์ด ์†์‹ค๋ฉ๋‹ˆ๋‹ค.
์ด๋Ÿฌํ•œ ๋ฌธ์ œ ๋•Œ๋ฌธ์— ๋Œ€์šฉ๋Ÿ‰ ๋ฐ์ดํ„ฐ ์ฒ˜๋ฆฌ์‹œ ์ง๋ ฌํ™”/์—ญ์ง๋ ฌํ™” ๊ณผ์ •์—์„œ ์‹ฌ๊ฐํ•œ ๋ณ‘๋ชฉ ํ˜„์ƒ์ด ๋ฐœ์ƒํ•˜๊ฒŒ ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

๊ทธ๋ฆฌ๊ณ  ์Šค๋ ˆ๋“œ ๋ฐ ์„ฑ๋Šฅ ๋ฌธ์ œ๋„ ์กด์žฌํ–ˆ๋Š”๋ฐ, bridge๊ฐ€ ๋‹จ์ผ ์Šค๋ ˆ๋“œ๋กœ ๋™์ž‘ํ•˜์—ฌ ๊ณผ๋ถ€ํ•˜ ์‹œ ๋ณ‘๋ชฉ ํ˜„์ƒ์ด ๋ฐœ์ƒํ•˜์—ฌ ๋งŽ์€ ๋ฐ์ดํ„ฐ๊ฐ€ bridge๋ฅผ ํ†ต๊ณผํ•  ๋•Œ ์ง๋ ฌํ™” ๋Œ€๊ธฐ ์ƒํ™ฉ์ด ๋ฐœ์ƒํ–ˆ์Šต๋‹ˆ๋‹ค.

๋˜ํ•œ, UI ๋ Œ๋”๋ง ์ง€์—ฐ ๋ฌธ์ œ๋„ ์žˆ์—ˆ๋Š”๋ฐ, ๋น ๋ฅธ ์Šคํฌ๋กค ์‹œ JavaScript์™€ Native ๊ฐ„ ๋น„๋™๊ธฐ ํ†ต์‹ ์œผ๋กœ ์ธํ•œ ๋นˆ ๊ณต๊ฐ„ ํ‘œ์‹œ๊ฐ€ ๋˜๋Š” ๋ฌธ์ œ๊ฐ€ ์žˆ์—ˆ๊ณ , ํŠนํžˆ ๊ธด ๋ฆฌ์ŠคํŠธ์—์„œ ๋งŽ์€ ์ปดํฌ๋„ŒํŠธ๋ฅผ ๋ Œ๋”๋งํ•  ๋•Œ ์„ฑ๋Šฅ ์ €ํ•˜๊ฐ€ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค.

bridge์˜ ๋‹จ์ผ ์Šค๋ ˆ๋“œ๋กœ ์ธํ•ด Bridge๋ฅผ ํ†ตํ•ด ๋„ค์ดํ‹ฐ๋ธŒ ๋ฉ”์„œ๋“œ๋ฅผ ํ˜ธ์ถœํ•  ๋•Œ ๊ฒฐ๊ณผ๋ฅผ ๊ธฐ๋‹ค๋ฆฌ๋Š” ๋™์•ˆ ๋ฉ”์ธ ์Šค๋ ˆ๋“œ๊ฐ€ ๋ฉˆ์ถฐ ์•ฑ ๋ฐ˜์‘์„ฑ์ด ์ €ํ•˜๋ฉ๋‹ˆ๋‹ค. ์ด ์‹œ๊ฐ„ ๋™์•ˆ UI ์—…๋ฐ์ดํŠธ, ํ„ฐ์น˜ ์ด๋ฒคํŠธ ์ฒ˜๋ฆฌ, ์• ๋‹ˆ๋ฉ”์ด์…˜์ด ๋ชจ๋‘ ์ค‘๋‹จ๋˜๋Š” ๋ฌธ์ œ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.
์ด๋Ÿฌํ•œ ๋ฌธ์ œ ๋•Œ๋ฌธ์— ์•ฑ์ด ์•ˆ์ •์ ์œผ๋กœ 60FPS๋ฅผ ๋‹ฌ์„ฑํ•˜๊ธฐ ์–ด๋ ค์› ์Šต๋‹ˆ๋‹ค. 60FPS๋Š” ๋ถ€๋“œ๋Ÿฌ์šด ์• ๋‹ˆ๋ฉ”์ด์…˜์˜ ๊ธฐ์ค€์ธ๋ฐ, ์ด๋ฅผ ๋‹ฌ์„ฑํ•˜์ง€ ๋ชปํ•˜๋ฉด ์‚ฌ์šฉ์ž๊ฐ€ ์•ฑ์ด ๋А๋ฆฌ๋‹ค๊ณ  ๋А๋ผ๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.

์ด์ „ ์•„ํ‚คํ…์ฒ˜์—์„œ๋Š” ์ด๋Ÿฌํ•œ ๊ทผ๋ณธ์ ์ธ ๋ฌธ์ œ๋กœ ์ธํ•ด react 18์—์„œ ์ง€์›ํ•˜๋Š” ๋™์‹œ์„ฑ ๊ธฐ๋Šฅ๋“ค์„ ์ œ๋Œ€๋กœ ์ง€์›ํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

โ“ ๊ทธ๋ž˜์„œ new architecture๋Š” ์ด๋Ÿฌํ•œ ๋ฌธ์ œ๋ฅผ ์–ด๋–ป๊ฒŒ ๊ฐœ์„ ํ•˜์˜€๋‚˜?โ€‹

bridge๋ฅผ ์™„์ „ ์ œ๊ฑฐํ•˜๊ณ , JSI(JavaScript Interface) ๋ฅผ ํ†ตํ•ด ๋น„๋™๊ธฐ์ ์ธ ํ†ต์‹ ์„ ํ•ด๊ฒฐํ•˜์˜€์Šต๋‹ˆ๋‹ค. JavaScript์™€ ๋„ค์ดํ‹ฐ๋ธŒ ์ฝ”๋“œ ๊ฐ„ ์ง์ ‘์ ์ด๊ณ  ๋™๊ธฐ์ ์ธ ์ƒํ˜ธ์ž‘์šฉ์„ ๊ฐ€๋Šฅํ•˜๊ฒŒ ํ•˜๊ณ , ๊ธฐ์กด์˜ bridge๋ฅผ ํ†ตํ•œ ์ง๋ ฌํ™”๋œ ๋น„๋™๊ธฐ ํ˜ธ์ถœ์— ์˜์กดํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์ด๋ ‡๊ฒŒ ๋™๊ธฐ์ ์œผ๋กœ ๊ฐ€๋Šฅํ•œ ์ด์œ ๋Š” ๋„ค์ดํ‹ฐ๋ธŒ ๋ฉ”์„œ๋“œ๋“ค์ด react native๊ฐ€ ์ž‘๋™ํ•˜๋Š” ํ˜„์žฌ ์‹คํ–‰ ์ค‘์ธ JavaScript ์—”์ง„์— ๋“ฑ๋ก๋˜์–ด์„œ ์ง์ ‘ ํ˜ธ์ถœํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋ฉ๋‹ˆ๋‹ค. ๋•Œ๋ฌธ์— ๋ธŒ๋ฆฌ์ง€๊ฐ€ ์—†์–ด์„œ ๋งค์šฐ ๋น ๋ฆ…๋‹ˆ๋‹ค.

JSI๊ฐ€ ๋™๊ธฐ์ ์œผ๋กœ ๋™์ž‘ํ•  ์ˆ˜ ์žˆ๋Š” ์ด์œ ๋Š” JavaScript ๋Ÿฐํƒ€์ž„(Hermes, V8)๊ณผ Native ์ฝ”๋“œ๊ฐ€ ๋ชจ๋‘ ๋™์ผํ•œ C++ ๋ฉ”๋ชจ๋ฆฌ ๊ณต๊ฐ„์—์„œ ์‹คํ–‰๋˜์–ด ์ง์ ‘์ ์ธ ๋ฉ”๋ชจ๋ฆฌ ์ฐธ์กฐ๋ฅผ ํ†ตํ•ด ํ†ต์‹ ํ•˜๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค.
HostObject๊ฐ€ C++ ๋ฉ”๋ชจ๋ฆฌ์—์„œ ๊ด€๋ฆฌ๋˜๊ณ  JS ๋Ÿฐํƒ€์ž„์— ์˜ํ•ด ์ง์ ‘ ์ฐธ์กฐ๋˜๊ธฐ ๋•Œ๋ฌธ์—, ์ง๋ ฌํ™”๋‚˜ ์—ญ์ง๋ ฌํ™”๊ฐ€ ํ•„์š” ์—†์Šต๋‹ˆ๋‹ค. JavaScript๊ฐ€ HostObject์˜ ๋ฉ”์„œ๋“œ๋ฅผ ์ง์ ‘ ํ˜ธ์ถœํ•˜๊ณ , ๋ฐ˜ํ™˜๊ฐ’์€ JS ํƒ€์ž…(jsi::Value)์œผ๋กœ ๋งคํ•‘๋ฉ๋‹ˆ๋‹ค.
์ด๋Š” ์›น ๋ธŒ๋ผ์šฐ์ €์—์„œ JavaScript๊ฐ€ DOM API๋ฅผ ๋™๊ธฐ์ ์œผ๋กœ ํ˜ธ์ถœํ•˜๋Š” ๊ฒƒ๊ณผ ๋ณธ์งˆ์ ์œผ๋กœ ๋™์ผํ•œ ๋ฉ”์ปค๋‹ˆ์ฆ˜์ž…๋‹ˆ๋‹ค.

old architecture์—์„œ์˜ ์•ฑ ์‹œ์ž‘์‹œ ์‚ฌ์šฉํ•˜์ง€๋„ ์•Š์„ native ๋ชจ๋“ˆ๋“ค์„ ๋ชจ๋‘ ๋ชจ๋”œํ•˜์—ฌ ์•ฑ ์‹œ์ž‘ ์‹œ๊ฐ„์ด ๊ธธ์–ด์ง€๊ณ  ๋ถˆํ•„์š”ํ•œ ๋ฉ”๋ชจ๋ฆฌ ์‚ฌ์šฉ ๋ฐ ๋ฐฐํ„ฐ๋ฆฌ ์†Œ๋ชจ๊ฐ€ ์ฆ๊ฐ€ํ•˜๋Š” ๋ฌธ์ œ๊ฐ€ ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค. ์ด๋Ÿฌํ•œ ๋ฌธ์ œ๋ฅผ TurboModules๋ฅผ ํ†ตํ•ด ๋„ค์ดํ‹ฐ๋ธŒ ๋ชจ๋“ˆ์ด ๋“ฑ๋ก๋˜๊ณ  ์ ‘๊ทผ๋˜๋Š” ๋ฐฉ์‹์„ ์žฌ๊ตฌ์„ฑํ•˜์—ฌ, ์ง€์—ฐ ๋กœ๋”ฉ๊ณผ ํšจ์œจ์ ์ธ ์ดˆ๊ธฐํ™”๋ฅผ ํ•  ์ˆ˜ ์žˆ๋„๋ก ๊ฐœ์„ ํ•˜์˜€์Šต๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ํ•„์š” ์‹œ์—๋งŒ ์ดˆ๊ธฐํ™”๊ฐ€ ๊ฐ€๋Šฅํ•˜์—ฌ ์‚ฌ์šฉํ•˜์ง€ ์•Š๋Š” ๋ชจ๋“ˆ์„ ๋กœ๋“œํ•˜์ง€ ์•Š์•„ ์•ฑ ๋กœ๋“œ ์‹œ๊ฐ„์„ ์ค„์ผ ์ˆ˜ ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค.

old architecture์—์„œ ๋ ˆ์ด์•„์›ƒ์ด ๋น„๋™๊ธฐ์ ์ด์—ฌ์„œ ๋ Œ๋”๋ง๋œ ๋ทฐ๋ฅผ ์ž„๋ฒ ๋“œํ•  ๋•Œ ๋ ˆ์ด์•„์›ƒ ์ ํ”„ ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ–ˆ์Šต๋‹ˆ๋‹ค. new architecture์—์„œ๋Š” useLayoutEffect hook์„ ์‚ฌ์šฉํ•˜์—ฌ ๋ ˆ์ด์•„์›ƒ ์—…๋ฐ์ดํŠธ๋ฅผ ๋™๊ธฐ์ ์œผ๋กœ ์ธก์ •ํ•˜๊ณ  ์ ์šฉํ•  ์ˆ˜ ์žˆ์–ด์„œ ์‹œ๊ฐ์  ์ ํ”„๋ฅผ ํ”ผํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋Ÿฌํ•œ ๋ฌธ์ œ๋ฅผ Fabric ๋ Œ๋”๋Ÿฌ๊ฐ€ ํ•ด๊ฒฐํ•ด์ฃผ์—ˆ๋Š”๋ฐ fabric์€ ๋˜ํ•œ ๋™์‹œ ๋ Œ๋”๋ง์„ ์ง€์›ํ•˜์—ฌ UI ์—…๋ฐ์ดํŠธ๊ฐ€ ๋ฉ”์ธ ์Šค๋ ˆ๋“œ๋ฅผ ๋ธ”๋กœํ‚นํ•˜์ง€ ์•Š๊ณ  ์ผ์‹œ์ •์ง€, ์žฌ๊ฐœ, ๋˜๋Š” ์ค‘๋‹จ๋  ์ˆ˜ ์žˆ๊ฒŒ ํ•ฉ๋‹ˆ๋‹ค. ์ด๋Ÿฌํ•œ ํ•ด๊ฒฐ ๋•๋ถ„์— react native ์•ฑ์ด ์ด์ œ ์—ฌ๋Ÿฌ ui ์—…๋ฐ์ดํŠธ๋ฅผ ๋™์‹œ์— ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋˜ํ•œ fabric์€ ์–ด๋–ค UI์—…๋ฐ์ดํŠธ๊ฐ€ ์šฐ์„ ์ˆœ์œ„๋ฅผ ๊ฐ€์ ธ์•ผ ํ•˜๊ณ  ์–ด๋–ค ์—…๋ฐ์ดํŠธ๊ฐ€ ๊ธฐ๋‹ค๋ ค์•ผ ํ•˜๋Š”์ง€ ๊ฒฐ์ •ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
fabric ์•„ํ‚คํ…์ฒ˜์—์„œ ์Šคํฌ๋กค์ด๋‚˜ ํƒญ ๊ฐ™์€ ์‚ฌ์šฉ์ž ์ƒํ˜ธ์ž‘์šฉ์— ์ตœ์šฐ์„  ์ˆœ์œ„๋ฅผ ๋ถ€์—ฌํ•˜์—ฌ ์ด๋Ÿฌํ•œ ์ž‘์—…๋“ค์€ ์ฆ‰์‹œ ์ฒ˜๋ฆฌ๋˜๋Š” ๋ฐ˜๋ฉด, API ์š”์ฒญ ๊ฐ™์€ ๋œ ๊ธด๊ธ‰ํ•œ ์ž‘์—…๋“ค์€ ํ•˜๋‚˜์”ฉ ๋‚ฎ์€ ์šฐ์„ ์ˆœ์œ„๋กœ ์ฒ˜๋ฆฌ๋ฉ๋‹ˆ๋‹ค.
fabric์€ ๋˜ํ•œ react suspense, react native์—์„œ react ๋™์‹œ ๊ธฐ๋Šฅ ํ™œ์„ฑํ™”, ์ž๋™ ๋ฐฐ์นญ, useTransition๊ณผ useDeferredValue๋ฅผ react 18์— ๋„์ž…๋œ ๊ธฐ๋Šฅ๋“ค์„ ํ™œ์šฉํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

์ถ”๊ฐ€์ ์œผ๋กœ Codegen ๊ธฐ๋Šฅ๋„ ์ถ”๊ฐ€๋˜์—ˆ๋Š”๋ฐ ์ด๋Š”, ๊ธฐ์กด์— javascript์˜ ํƒ€์ž…๊ณผ ๋„ค์ดํ‹ฐ๋ธŒ๊ฐ„์˜ ํƒ€์ž…์ด ๋‹ค๋ฅธ ๋ฌธ์ œ๋กœ ์ธํ•ด ์•ˆ์ •์„ฑ์„ ๋ณด์žฅํ•˜์ง€ ๋ชปํ•˜๋Š” ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•ฉ๋‹ˆ๋‹ค. Codegen์€ ๋นŒ๋“œ ์‹œ์ ์— JavaScript ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ์ƒ์„ฑํ•˜์—ฌ ํƒ€์ž… ์•ˆ์ „์„ฑ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•ฉ๋‹ˆ๋‹ค. ์ด ์ธํ„ฐํŽ˜์ด์Šค๋“ค์€ ๋„ค์ดํ‹ฐ๋ธŒ ์ฝ”๋“œ๊ฐ€ JavaScript ๋ ˆ์ด์–ด์—์„œ ์ „๋‹ฌ๋œ ๋ฐ์ดํ„ฐ์™€ ๋™๊ธฐํ™”๋œ ์ƒํƒœ๋กœ ์œ ์ง€๋˜๋„๋ก ๋ณด์žฅํ•ฉ๋‹ˆ๋‹ค.

โ“ react native์˜ animated์™€ react-native-reanimated์˜ ์ฐจ์ดโ€‹

React Native๋Š” Animated API๋Š” ๊ธฐ๋ณธ์ ์œผ๋กœ JavaScript ์Šค๋ ˆ๋“œ์—์„œ ์‹คํ–‰๋˜์ง€๋งŒ, useNativeDiver: true ์˜ต์…˜์„ ์‚ฌ์šฉํ•˜์—ฌ ๋„ค์ดํ‹ฐ๋ธŒ ์Šค๋ ˆ๋“œ์—์„œ ์‹คํ–‰์ด ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ, ๋„ค์ดํ‹ฐ๋ธŒ ๋“œ๋ผ์ด๋ฒ„ ์‚ฌ์šฉ ์‹œ์—๋„ ๋ชจ๋“  ์†์„ฑ์ด ์ง€์›๋˜์ง€๋Š” ์•Š๋Š” ๋‹จ์ ์ด ์žˆ์Šต๋‹ˆ๋‹ค. ๋น„๋ ˆ์ด์•„์›ƒ ์†์„ฑ๋งŒ ์• ๋‹ˆ๋ฉ”์ด์…˜ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.(transform๊ณผ opacity๋Š” ์ž‘๋™ํ•˜์ง€๋งŒ Flexbox์™€ position ์†์„ฑ์€ ์ž‘๋™ํ•˜์ง€ ์•Š์Œ.)

๊ทธ์— ๋น„ํ•ด react native reanimated๋Š” ๊ธฐ๋ณธ์ ์œผ๋กœ UI ์Šค๋ ˆ๋“œ์—์„œ ์‹คํ–‰๋˜๋ฉฐ, javascript ์Šค๋ ˆ๋“œ์— ๋ถ€ํ•˜๋ฅผ ์ƒ์„ฑํ•˜์ง€ ์•Š๊ณ  ๋ชจ๋“  ๋„ค์ดํ‹ฐ๋ธŒ ์†์„ฑ์˜ ์• ๋‹ˆ๋ฉ”์ด์…˜์„ ์ง€์›ํ•ฉ๋‹ˆ๋‹ค. ๋˜ํ•œ, Animated API ๊ฐ™์€ ๊ฒฝ์šฐ 60FPS์—์„œ ์• ๋‹ˆ๋ฉ”์ด์…˜์„ ์ˆ˜ํ–‰ํ•˜๋„๋ก ํ•˜๋“œ์ฝ”๋”ฉ๋˜์–ด ์žˆ์–ด ๊ทธ ์ด์ƒ์˜ ๋ถ€๋“œ๋Ÿฌ์šด ์• ๋‹ˆ๋ฉ”์ด์…˜์ด ์ œํ•œ์ ์ด์ง€๋งŒ, reanimated๋Š” ์ตœ๋Œ€ 120FPS ์ด์ƒ์˜ ๋ถ€๋“œ๋Ÿฌ์šด ์• ๋‹ˆ๋ฉ”์ด์…˜์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.

Reanimated๋Š” React Native์˜ ๋ฉ”์ธ JavaScript ์Šค๋ ˆ๋“œ๋ฅผ ์™„์ „ํžˆ ์šฐํšŒํ•˜์—ฌ ์• ๋‹ˆ๋ฉ”์ด์…˜์„ ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•ฉ๋‹ˆ๋‹ค. ์• ๋‹ˆ๋ฉ”์ด์…˜ ๋Ÿฌ๋„ˆ๊ฐ€ ์™„์ „ํžˆ ๊ฒฉ๋ฆฌ๋˜์–ด ์žˆ์–ด์„œ, ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๋กœ์ง(์ปดํฌ๋„ŒํŠธ ๋ Œ๋”๋ง, ๋ฐ์ดํ„ฐ ๊ฐ€์ ธ์˜ค๊ธฐ ๋ฐ ์ฒ˜๋ฆฌ ๋“ฑ)์ด ์• ๋‹ˆ๋ฉ”์ด์…˜ ์„ฑ๋Šฅ์— ์˜ํ–ฅ์„ ์ฃผ์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

์ถ”๊ฐ€์ ์œผ๋กœ react native reanimated์—๋Š” worklets์˜ ๊ฐœ๋…์ด ์žˆ๋Š”๋ฐ worklets์€ UI ์Šค๋ ˆ๋“œ์—์„œ ์‹คํ–‰๋˜๋Š” JavaScript ํ•จ์ˆ˜์ž…๋‹ˆ๋‹ค. ์ด๋ฅผ ํ†ตํ•ด ๋ธŒ๋ฆฌ์ง€ ๋น„์šฉ์„ ๊ฑฑ์ •ํ•˜์ง€ ์•Š๊ณ  javascript๋กœ ๋„ค์ดํ‹ฐ๋ธŒ ์ˆ˜์ค€์˜ ์• ๋‹ˆ๋ฉ”์ด์…˜ ๋ช…๋ น์„ ์ •์˜ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ธฐ๋Šฅ์€ ๋งค์šฐ ๊ฐ•๋ ฅํ•˜์ง€๋งŒ, ์ถ”๋ก ํ•˜๊ธฐ ์–ด๋ ค์šธ ์ˆ˜ ์žˆ๋Š”๊ฒŒ ๋‹จ์ ์ž…๋‹ˆ๋‹ค.

๋˜ํ•œ, react native reanimated shared value๋Š” Animated.Values์™€ ๋น„๊ตํ•  ์ˆ˜ ์žˆ๋Š”๋ฐ ์ด๋“ค์€ "์• ๋‹ˆ๋ฉ”์ด์…˜ ๊ฐ€๋Šฅํ•œ" ๋ฐ์ดํ„ฐ๋ฅผ ์šด๋ฐ˜ํ•˜๊ณ , ๋ฐ˜์‘์„ฑ์˜ ๊ฐœ๋…์„ ์ œ๊ณตํ•˜๋ฉฐ, ์• ๋‹ˆ๋ฉ”์ด์…˜์„ ๊ตฌ๋™ํ•˜๋Š” ์œ ์‚ฌํ•œ ๋ชฉ์ ์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.
shared values๊ฐ€ ํ•„์š”ํ•œ ์ด์œ ๋Š” ๊ณต์œ  ๋ฉ”๋ชจ๋ฆฌ ๊ฐœ๋…์„ ์ œ๊ณตํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. useSharedValue๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ shared value๋ฅผ ์ƒ์„ฑํ•˜๋ฉด, ๋„ค์ดํ‹ฐ๋ธŒ ์ธก์— ๋ฉ”๋ชจ๋ฆฌ ๋ธ”๋ก์„ ํ• ๋‹นํ•˜๊ณ  ๊ฑฐ๊ธฐ์— ๊ฐ’์„ ์ €์žฅํ•ฉ๋‹ˆ๋‹ค.

๋„ค์ดํ‹ฐ๋ธŒ ์ธก์˜ ์ •ํ™•ํ•œ ์œ„์น˜๋Š” worklet runtime(UI ์Šค๋ ˆ๋“œ์—์„œ ์‹คํ–‰๋˜๋Š” ๋ณ„๋„์˜ javascript ๋Ÿฐํƒ€์ž„), JSI C++ Layer(์Šค๋ ˆ๋“œ ๊ฐ„ ํ†ต์‹ ๊ณผ ๋ฉ”๋ชจ๋ฆฌ ๊ด€๋ฆฌ๋ฅผ ๋‹ด๋‹นํ•˜๋Š” C++ ๋ ˆ์ด์–ด), ์‹ค์ œ ๋„ค์ดํ‹ฐ๋ธŒ ํ”Œ๋žซํผ(iOS/Android์˜ ๋„ค์ดํ‹ฐ๋ธŒ UI ์‹œ์Šคํ…œ)์œผ๋กœ Shared Value์˜ ์‹ค์ œ ๋ฐ์ดํ„ฐ๋Š” Worklet Runtime์— ์ €์žฅ๋˜๋ฉฐ, JSI C++ ๋ ˆ์ด์–ด๋ฅผ ํ†ตํ•ด React Native JS ์Šค๋ ˆ๋“œ์™€ ๋™๊ธฐํ™”๋ฉ๋‹ˆ๋‹ค. ์ด๋ฅผ ํ†ตํ•ด ์• ๋‹ˆ๋ฉ”์ด์…˜์ด React์˜ ๋ Œ๋”๋ง ์‚ฌ์ดํด๊ณผ ๋…๋ฆฝ์ ์œผ๋กœ UI ์Šค๋ ˆ๋“œ์—์„œ ๋ถ€๋“œ๋Ÿฝ๊ฒŒ ์‹คํ–‰๋  ์ˆ˜ ์žˆ๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

๊ทธ๋ ‡๊ธฐ ๋•Œ๋ฌธ์— shared values๋Š” UI ์Šค๋ ˆ๋“œ์—์„œ ์—…๋ฐ์ดํŠธ๋˜๊ณ  ์ฝํžˆ๋„๋ก ์ตœ์ ํ™”๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ UI์Šค๋ ˆ๋“œ์—์„œ ์ˆ˜ํ–‰๋˜๋Š” ์ฝ๊ธฐ์™€ ์“ฐ๊ธฐ๋Š” ๋ชจ๋‘ ๋™๊ธฐ์ ์ž…๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ ์ด๋Ÿฌํ•œ ์„ ํƒ์œผ๋กœ JS ์Šค๋ ˆ๋“œ์—์„œ ์ˆ˜ํ–‰๋œ ์—…๋ฐ์ดํŠธ๋Š” ๋ชจ๋‘ ๋น„๋™๊ธฐ์ ์ž…๋‹ˆ๋‹ค. ์—…๋ฐ์ดํŠธ๋Š” ์ฆ‰์‹œ ์ด๋ฃจ์–ด์ง€๋Š” ๋Œ€์‹ , Reanimated ์ฝ”์–ด๋Š” UI ์Šค๋ ˆ๋“œ์—์„œ ์ˆ˜ํ–‰๋  ์—…๋ฐ์ดํŠธ๋ฅผ ์Šค์ผ€์ค„๋งํ•˜์—ฌ ๋™์‹œ์„ฑ ๋ฌธ์ œ๋ฅผ ๋ฐฉ์ง€ํ•ฉ๋‹ˆ๋‹ค.
์ด๋Ÿฌํ•œ ์ด์œ ๋Š” shared value๋Š” ๋‹จ์ˆœํ•œ javascript ๊ฐ์ฒด์ด๋ฏ€๋กœ ์ผ๋ฐ˜์ ์ธ React ๋ฆฌ๋ Œ๋”๋ฅผ ํŠธ๋ฆฌ๊ฑฐํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์ด๊ฒƒ์ด ๋ฐ”๋กœ Shared Values๊ฐ€ ์„ฑ๋Šฅ์ƒ ์ด์ ์„ ์ œ๊ณตํ•˜๋Š” ํ•ต์‹ฌ ์ด์œ ๋กœ, ์• ๋‹ˆ๋ฉ”์ด์…˜ ๊ฐ’์ด ๋ณ€๊ฒฝ๋˜์–ด๋„ React ์ปดํฌ๋„ŒํŠธ๊ฐ€ ๋ฆฌ๋ Œ๋”๋˜์ง€ ์•Š์œผ๋ฏ€๋กœ, ์• ๋‹ˆ๋ฉ”์ด์…˜์ด React์˜ ๋ Œ๋”๋ง ์‚ฌ์ดํด๊ณผ ๋…๋ฆฝ์ ์œผ๋กœ UI ์Šค๋ ˆ๋“œ์—์„œ ๋ถ€๋“œ๋Ÿฝ๊ฒŒ ์‹คํ–‰๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

โ“ FlatList๋ž‘ ScrollView์˜ ์ฐจ์ด๋Š” ๋ฌด์—‡์ด๊ณ  ์–ด๋–ค ์ƒํ™ฉ์—์„œ ์‚ฌ์šฉํ•˜๋Š”์ง€?โ€‹

ScrollView๋Š” ๋ชจ๋“  ์ž์‹ ์ปดํฌ๋„ŒํŠธ๋ฅผ ํ•œ ๋ฒˆ์— ๋ Œ๋”๋งํ•˜๋ฉฐ, ํ™”๋ฉด์— ๋ณด์ด์ง€ ์•Š๋Š” ์š”์†Œ๋“ค๋„ ๋ชจ๋‘ ๋ฉ”๋ชจ๋ฆฌ์— ๋กœ๋“œํ•ฉ๋‹ˆ๋‹ค. ๋•Œ๋ฌธ์— ๋ชจ๋“  ์•„์ดํ…œ์„ ํ•œ ๋ฒˆ์— ๋ Œ๋”๋งํ•˜๋ฏ€๋กœ ์ดˆ๊ธฐ ๋ Œ๋”๋ง ์‹œ๊ฐ„์ด ๊ธธ์–ด์ง€๊ณ  ๋ฉ”๋ชจ๋ฆฌ ์‚ฌ์šฉ๋Ÿ‰์ด ์ฆ๊ฐ€ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋ž˜์„œ ScrollView๋Š” ์ž‘๊ณ  ๊ณ ์ •๋œ ๊ฐœ์ˆ˜์˜ ์•„์ดํ…œ์„ ํ‘œ์‹œํ•˜๊ฑฐ๋‚˜ ์ •์ ์ธ ์ฝ˜ํ…์ธ ์ผ ๊ฒฝ์šฐ์— ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋ฐ˜๋ฉด์— FlatList๋Š” ๊ฐ€์ƒ ์Šคํฌ๋กค๋ง์„ ์‚ฌ์šฉํ•˜์—ฌ ํ˜„์žฌ ๋ณด์ด๋Š” ์•„์ดํ…œ๋“ค๋งŒ ๋ Œ๋”๋งํ•˜๊ณ , ํ™”๋ฉด์—์„œ ๋ฒ—์–ด๋‚œ ์•„์ดํ…œ๋“ค์€ ๋นˆ๊ณต๊ฐ„์œผ๋กœ ์ฒ˜๋ฆฌํ•˜์—ฌ, ๊ธฐ๋ณธ์ ์œผ๋กœ 10๊ฐœ ์•„์ดํ…œ๋งŒ ๋ Œ๋”๋งํ•˜๊ณ  ์Šคํฌ๋กคํ•  ๋•Œ๋งˆ๋‹ค ํ•„์š”ํ•œ ์•„์ดํ…œ์„ ๋™์ ์œผ๋กœ ๋กœ๋“œํ•˜์—ฌ ๋ฉ”๋ชจ๋ฆฌ์— ํšจ์œจ์ ์ž…๋‹ˆ๋‹ค. ์ด๋Ÿฌํ•œ ํŠน์„ฑ ๋–„๋ฌธ์— FlatList๋Š” ํ™”๋ฉด์—์„œ ๋ฒ—์–ด๋‚œ ์ปดํฌ๋„ŒํŠธ๋ฅผ ์–ธ๋งˆ์šดํŠธํ•˜๊ณ  ๋‹ค์‹œ ๋Œ์•„์˜ฌ ๋•Œ ์žฌ์ƒ์„ฑํ•˜๋ฏ€๋กœ ๋‚ด๋ถ€ ์ƒํƒœ๊ฐ€ ์ดˆ๊ธฐํ™”๋ฉ๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ๋Œ€๋Ÿ‰์˜ ๋ฐ์ดํ„ฐ๋‚˜ ๋™์  ๋ฆฌ์ŠคํŠธ๋ฅผ ํ‘œ์‹œํ•˜๊ฑฐ๋‚˜ ๋ฌดํ•œ ์Šคํฌ๋กค์ด๋‚˜ ์ง€์—ฐ ๋กœ๋”ฉ์ด ํ•„์š”ํ•  ๋•Œ, ์„ฑ๋Šฅ ์ตœ์ ํ™”๊ฐ€ ์ค‘์š”ํ•œ ๊ธด ๋ฆฌ์ŠคํŠธ์ธ ๊ฒฝ์šฐ์— ์‚ฌ์šฉํ•˜๋ฉด ์ข‹์Šต๋‹ˆ๋‹ค.

๊ทธ๋ ‡๋‹ค๋ฉด, FlatList๋ณด๋‹ค FlashList ์ข‹๋‹ค๋Š”๋ฐ FlashList๋Š” FlatList์˜ ์–ด๋–ค ๋ฌธ์ œ๋ฅผ ๊ฐœ์„ ํ•˜์—ฌ ์„ฑ๋Šฅ์ด ๋” ์ข‹์€๊ฑด์ง€?โ€‹

FlatList๋Š” ๊ฐ€์ƒํ™” ๊ธฐ์ˆ ์„ ์‚ฌ์šฉํ•˜์—ฌ ํ˜„์žฌ ๋ณด์ด๋Š” ์•„์ดํ…œ๋“ค๋งŒ ๋ Œ๋”๋งํ•˜๊ณ , ๋ทฐํฌํŠธ ์™ธ์šฐ์˜ ์•„์ดํ…œ๋“ค์€ ์–ธ๋งˆ์šดํŠธํ•˜์—ฌ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ์ ˆ์•ฝํ•˜๊ณ  ์„ฑ๋Šฅ์„ ํ–ฅ์ƒ ์‹œํ‚ต๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ ์ด ๋ฐฉ์‹์€ ์ปดํฌ๋„ŒํŠธ๋ฅผ ๋งˆ์šดํŠธํ•˜๊ณ  ์–ธ๋งˆ์šดํŠธํ•˜๋Š” ๊ณผ์ •์—์„œ ๋””๋ฐ”์ด์Šค ๋ฆฌ์†Œ์Šค๋ฅผ ์†Œ๋ชจํ•˜๋Š” ์˜ค๋ฒ„ํ—ค๋“œ๊ฐ€ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค.

์ด๋Ÿฌํ•œ ๋ฌธ์ œ๋ฅผ FlashList๋Š” ๊ฐ€์ƒํ™” ๋Œ€์‹  Cell Recycling ์ „๋žต์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. ๋ฉ”๋ชจ๋ฆฌ์— ๊ณ ์ •๋œ ์ปดํฌ๋„ŒํŠธ ์ธ์Šคํ„ด์Šค ํ’€์„ ์œ ์ง€ํ•˜๊ณ , ์•„์ดํ…œ์ด ํ™”๋ฉด์—์„œ ๋ฒ—์–ด๋‚  ๋•Œ ๊ฐ™์€ ์ปดํฌ๋„ŒํŠธ๋ฅผ ์ƒˆ๋กœ์šด ๋ฐ์ดํ„ฐ๋กœ ์žฌ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. ๋ณด์ด์ง€ ์•Š๋Š” ์•„์ดํ…œ์€ ๋ฉ”๋ชจ๋ฆฌ์—์„œ ํ•ด์ œํ•˜๋Š” ๊ฒƒ์€ ๋” ๋งŽ์€ ๊ฐ์ฒด ์ƒ์„ฑ๊ณผ ๊ฐ€๋น„์ง€ ์ปฌ๋ ‰์…˜์„ ์œ ๋ฐœํ•˜๋ฏ€๋กœ, FlashList๋Š” ๋ฆฌ์‚ฌ์ดํด๋ง์ด ์„ฑ๋Šฅ์ด๋‚˜ ๋ฉ”๋ชจ๋ฆฌ ํšจ์œจ์„ฑ์„ ์†์ƒ์‹œํ‚ค์ง€ ์•Š์œผ๋ฉด์„œ ๋ฌดํ•œ ๋ฆฌ์ŠคํŠธ๋ฅผ ๋ Œ๋”๋งํ•˜๋Š” ์ตœ์ƒ์˜ ๋ฐฉ๋ฒ•์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.

FlashList๋ฅผ ์‚ฌ์šฉํ• ๋•Œ ์„ฑ๋Šฅ ์ตœ์ ํ™” ํ•  ์ˆ˜ ์žˆ๋Š” ํŒ์ด ์žˆ๋‹ค๋ฉด?โ€‹

FlashList๋Š” ๋ทฐํฌํŠธ ๋ฒ—์–ด๋‚  ๋•Œ ์ปดํฌ๋„ŒํŠธ๊ฐ€ ํŒŒ๊ดด๋˜์ง€ ์•Š๊ณ  ๋‹ค๋ฅธ item prop์œผ๋กœ ๋‹ค์‹œ ๋ Œ๋”๋ง ๋ฉ๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ๋ฆฌ์‚ฌ์ดํด๋ง ์‹œ ๊ฐ€๋Šฅํ•œ ํ•œ ์ ์€ ๊ฒƒ๋“ค์ด ๋‹ค์‹œ ๋ Œ๋”๋ง๋˜๊ณ  ์žฌ๊ณ„์‚ฐ๋˜๋„๋ก ์ตœ์ ํ™”ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

์•„์ดํ…œ ๋‚ด๋ถ€์— key prop์ด ์žˆ๋‹ค๋ฉด ์ œ๊ฑฐํ•˜๋Š”๊ฒŒ ์ข‹์Šต๋‹ˆ๋‹ค. react์—์„œ๋Š” list item์— key๋ฅผ ์„ค์ •ํ•˜๋Š”๊ฒƒ์„ ๊ถŒ์žฅํ•˜์ง€๋งŒ FlashList์˜ ํ•ต์‹ฌ ์„ฑ๋Šฅ ์ด์ ์€ ์ปดํฌ๋„ŒํŠธ๋ฅผ ์ƒ์„ฑํ•˜๊ณ  ํŒŒ๊ดดํ•˜๋Š” ๊ฒƒ ๋Œ€์‹  ์žฌํ™œ์šฉํ•˜๋Š” ๊ฒƒ์ธ๋ฐ, ์„œ๋กœ ๋‹ค๋ฅธ ๋ฐ์ดํ„ฐ ์•„์ดํ…œ ๊ฐ„์— ๋ณ€๊ฒฝ๋˜๋Š” key prop์„ ์ถ”๊ฐ€ํ•˜๋ฉด react๊ฐ€ ์ปดํฌ๋„ŒํŠธ๋ฅผ ์™„์ „ํžˆ ๋‹ค๋ฅธ ๊ฒƒ์œผ๋กœ ์ทจ๊ธ‰ํ•˜์—ฌ ์ปดํฌ๋„ŒํŠธ ํŠธ๋ฆฌ๋ฅผ ์™„์ „ํžˆ ์žฌ์ƒ์„ฑํ•˜๊ฒŒ ๋ฉ๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ FlashList์˜ ์žฌํ™œ์šฉํ•˜๋Š” ์ด์ ์„ ์ œ๋Œ€๋กœ ๋ˆ„๋ฆด์ˆ˜ ์—†๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.

์„œ๋กœ ๋‹ค๋ฅธ ํƒ€์ž…์˜ ์…€ ์ปดํฌ๋„ŒํŠธ๊ฐ€ ์žˆ์„๋•Œ, getItemType์„ ํ™œ์šฉํ•ด์„œ ์„œ๋กœ ๋‹ค๋ฅธ ํƒ€์ž…์˜ ์•„์ดํ…œ์„ ์žฌํ™œ์šฉํ•˜์ง€ ์•Š์•„ ์žฌ๋ Œ๋”๋ง์ด ๋” ๋นจ๋ผ์ง‘๋‹ˆ๋‹ค.

์•„์ดํ…œ์— ์ง์ ‘ ์˜์กดํ•˜์ง€ ์•Š๋Š” ๋ฌด๊ฑฐ์šด ์ปดํฌ๋„ŒํŠธ๋Š” memo๋กœ ๊ฐ์Œ‰๋‹ˆ๋‹ค.

๋งŽ์€ ๋ฆฌ์†Œ์Šค๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ณ„์‚ฐ์ด ์žˆ๋‹ค๋ฉด ๋ฉ”๋ชจ์ด์ œ์ด์…˜์„ ๊ณ ๋ คํ•˜๊ฑฐ๋‚˜ ๋” ๋น ๋ฅด๊ฒŒ ๋งŒ๋“ค๊ฑฐ๋‚˜ ์™„์ „ํžˆ ์ œ๊ฑฐํ•˜๋Š”๊ฒŒ ์ข‹์Šต๋‹ˆ๋‹ค.

โ“ React Native์˜ ๋ Œ๋”๋ง ๊ณผ์ • feat. virtual domโ€‹

๊ฐ€์ƒ ๋”์€ ๋ธŒ๋ผ์šฐ์ € ๋…๋ฆฝ์ ์ธ ๋ฐฉ์‹์œผ๋กœ ๋™์ž‘ํ•ฉ๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ virtual dom์˜ ๊ฐœ๋…์€ react ๋ฟ๋งŒ ์•„๋‹ˆ๋ผ React Native์™€ ๊ฐ™์€ ํ”Œ๋žซํผ์—์„œ๋„ ํ™œ์šฉ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋‹ค๋ฅธ ๊ธฐ์ˆ ๊ณผ ํ•จ๊ป˜ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ, ๋‹ค์–‘ํ•œ ํ™˜๊ฒฝ์—์„œ ๋ Œ๋”๋งํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•ด์ค๋‹ˆ๋‹ค.
React Native์—์„œ๋„ React์™€ ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ virtual dom์„ ์‚ฌ์šฉํ•˜์ง€๋งŒ, ์ตœ์ข… ๋ Œ๋”๋ง ๋Œ€์ƒ์ด ์›น ๋ธŒ๋ผ์šฐ์ €์˜ DOM์ด ์•„๋‹Œ ๋„คํ‹ฐ์ด๋ธŒ ์ปดํฌ๋„ŒํŠธ๋ผ๋Š” ์ฐจ์ด๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.

old architecture

  1. javascript ์‹คํ–‰: javascript thread์—์„œ react ์ปดํฌ๋„ŒํŠธ ๋กœ์ง๊ณผ UI ์—…๋ฐ์ดํŠธ๋ฅผ ์ฒ˜๋ฆฌํ•ฉ๋‹ˆ๋‹ค.
  2. Bridge๋ฅผ ํ†ตํ•œ ๋น„๋™๊ธฐ ํ†ต์‹ : JavaScript์™€ Native๊ฐ„ ํ†ต์‹ ์€ ๋น„๋™๊ธฐ Bridge๋ฅผ ํ†ตํ•ด ์ด๋ฃจ์–ด์กŒ์œผ๋ฉฐ, ๋ชจ๋“  ๋ฐ์ดํ„ฐ๋Š” JSON ํ˜•ํƒœ๋กœ ์ง๋ ฌํ™”๋˜์–ด ์ „์†ก๋˜์—ˆ์Šต๋‹ˆ๋‹ค.
  3. Shadow Thread์—์„œ ๋ ˆ์ด์•„์›ƒ ๊ณ„์‚ฐ: Shadow Thread์—์„œ Yoga Engine์„ ์‚ฌ์šฉํ•ด Flexbox ์Šคํƒ€์ผ์„ ๋„ค์ดํ‹ฐ๋ธŒ ๋ ˆ์ด์•„์›ƒ์œผ๋กœ ๋ณ€ํ™˜ํ•˜๊ณ  ์œ„์น˜๋ฅผ ๊ณ„์‚ฐํ•ฉ๋‹ˆ๋‹ค.
  4. Native UI ๋ Œ๋”๋ง: Native Thread์—์„œ ๊ณ„์‚ฐ๋œ ๋ ˆ์ด์•„์›ƒ์„ ๋ฐ”ํƒ•์œผ๋กœ ์‹ค์ œ ๋„ค์ดํ‹ฐ๋ธŒ ์ปดํฌ๋„ŒํŠธ๋ฅผ ํšŒ๋ฉด์— ๋ Œ๋”๋งํ•ฉ๋‹ˆ๋‹ค.

Old architecture๋Š” bridge ํ†ต์‹ ๊ณผ ๋ชจ๋“  ๋ฐ์ดํ„ฐ ์ง๋ ฌํ™”/์—ญ์ง๋ ฌํ™”๋กœ ์ธํ•œ ์„ฑ๋Šฅ ์ €ํ•˜๋กœ ์ธํ•ด ๋ณ‘๋ชฉ๋˜์–ด 60+FPS ๋‹ฌ์„ฑ์ด ์–ด๋ ค์› ๊ณ , JavaScript์™€ Native ๋ ˆ์ด์–ด ๊ฐ„ ๋™๊ธฐํ™” ๋ฌธ์ œ๋กœ ์ธํ•œ UI ์ ํ”„ ํ˜„์ƒ, ๋‹จ์ผ ์Šค๋ ˆ๋“œ์—์„œ๋งŒ ๋ ˆ์ด์•„์›ƒ ๊ณ„์‚ฐ์ด ๊ฐ€๋Šฅํ•œ ๋ฌธ์ œ์ ๋“ค์ด ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค.

New architecture์—์„œ์˜ ๋ Œ๋”๋ง ๊ณผ์ •์€ ๋ Œ๋”๋Ÿฌ์ธ Fabric์ด ๋‹ด๋‹นํ•ฉ๋‹ˆ๋‹ค.

  1. Render Phase:
    1. React๊ฐ€ JavaScript์—์„œ React Element Tree๋ฅผ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค. ์ด๋Š” ํšŒ๋ฉด์— ๋‚˜ํƒ€๋‚  ๋‚ด์šฉ์„ ์„ค๋ช…ํ•˜๋Š” ํ‰๋ฒ”ํ•œ JavaScript ๊ฐ์ฒด๋“ค์ž…๋‹ˆ๋‹ค.
    2. Fabric ๋ Œ๋”๋Ÿฌ๊ฐ€ React Element Tree๋ฅผ ๋ฐ”ํƒ•์œผ๋กœ C++์—์„œ React Shadow Tree๋ฅผ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค. ๊ฐ React Shadow Node(๋ถˆ๋ณ€ ๊ฐ์ฒด)๋Š” ๋งˆ์šดํŠธ๋  React Host Component๋ฅผ ๋‚˜ํƒ€๋‚ด๋ฉฐ, JavaScript์—์„œ ์˜จ Props ์ •๋ณด๋ฅผ ํฌํ•จํ•ฉ๋‹ˆ๋‹ค.
  2. Commit Phase:
    1. Yoga ์—”์ง„์ด ๊ฐ Shadow Node์˜ ๋ ˆ์ด์•„์›ƒ์„ ๊ณ„์‚ฐํ•ฉ๋‹ˆ๋‹ค.
    2. Tree Promotion์œผ๋กœ ์ƒˆ๋กœ์šด Shadow Tree๋ฅผ ๋‹ค์Œ ๋งˆ์šดํŠธ ๋Œ€์ƒ์œผ๋กœ ์Šน๊ฒฉ์‹œํ‚ต๋‹ˆ๋‹ค.
  3. Mount Phase:
    1. React Shadow Tree๊ฐ€ Host View Tree๋กœ ๋ณ€ํ™˜ํ•ฉ๋‹ˆ๋‹ค.
    2. ์‹ค์ œ ๋„ค์ดํ‹ฐ๋ธŒ ๋ทฐ ์ƒ์„ฑ ๋ฐ ํ™”๋ฉด์— ๋งˆ์šดํŠธ ํ•ฉ๋‹ˆ๋‹ค.

Old architecture์—์„œ๋Š” shadow thread์˜ ๋ฐฑ๊ทธ๋ผ์šด๋“œ ์Šค๋ ˆ๋“œ๋กœ UI ์š”์†Œ๋“ค์˜ ๋ ˆ์ด์•„์›ƒ์„ ๋ Œ๋”๋ง ์ „์— ๊ณ„์‚ฐํ•˜๋Š” ์ค‘์š”ํ•œ ์ž‘์—…์„ ์ˆ˜ํ–‰์—ˆ์Šต๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ, new architecture์—์„œ๋Š” shadow thread๊ฐ€ ์ œ๊ฑฐ ๋˜์—ˆ๋Š”๋ฐ, ๊ทธ ์ด์œ ๋Š” ๋ฉ”๋ชจ๋ฆฌ ๊ณต์œ  ๋ฐฉ์‹์— ๋ณ€ํ™”๊ฐ€ ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค.
old์—์„œ javascript์™€ native ์Šค๋ ˆ๋“œ์—์„œ ๊ฐ€๊ฐ ๋ณ„๋„์˜ ๊ณ„์ธต/DOM ๋…ธ๋“œ ๋ณต์‚ฌ๋ณธ์„ ์œ ์ง€ํ•˜์—ฌ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ์‚ฌ์šฉํ–ˆ์–ด์•ผ ํ–ˆ๋Š”๋ฐ New architecture์—์„œ๋Š” Fabric ๋ Œ๋”๋Ÿฌ๊ฐ€ C++ ์„ธ๊ณ„(UI ์Šค๋ ˆ๋“œ)์— ์กด์žฌํ•˜๋Š” ๋ Œ๋”๋Ÿฌ๋กœ, React๊ฐ€ C++์—์„œ ์ƒ์„ฑํ•œ virtual DOM์— ๋Œ€ํ•œ ์ฐธ์กฐ๋ฅผ ๊ฐ€์ง€๋ฉฐ, ๊ฐ์ฒด๋“ค์ด UI(๋„คํ‹ฐ์ด๋ธŒ)์™€ JS ์Šค๋ ˆ๋“œ ๊ฐ„์— ๊ณต์œ ๋˜์–ด Shadow Thread์˜ ํ•„์š”์„ฑ์„ ์ œ๊ฑฐํ•ฉ๋‹ˆ๋‹ค.

๊ทธ๋ ‡๋‹ค๋ฉด yoga engine์€ ๋ฌด์—‡์ธ๊ฐ€?โ€‹

yoga๋Š” ์ž„๋ฒ ๋“œ ๊ฐ€๋Šฅํ•œ ํฌ๋กœ์Šค ํ”Œ๋žซํผ ๋ ˆ์ด์•„์›ƒ ์—”์ง„์œผ๋กœ Flexbox ๊ธฐ๋ฐ˜์œผ๋กœ ๋งŒ๋“ค์–ด์กŒ์œผ๋ฉฐ, ๋ฐ•์Šค๋“ค์˜ ํฌ๊ธฐ์™€ ์œ„์น˜๋งŒ์„ ๊ฒฐ์ •ํ•˜๋Š” ๊ฒƒ์ด ์ฃผ๋œ ์—ญํ• ์ž…๋‹ˆ๋‹ค. yoga ์ž์ฒด๋Š” UI ํ”„๋ ˆ์ž„์›Œํฌ๊ฐ€ ์•„๋‹ˆ๋ฉฐ ์ง์ ‘ ๊ทธ๋ฆฌ๊ธฐ ์ž‘์—…์€ ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

yoga์˜ ํ•ต์‹ฌ ๊ธฐ๋Šฅ์œผ๋กœ Flexbox ๋ ˆ์ด์•„์›ƒ ์‹œ์Šคํ…œ์œผ๋กœ Flexbox ๋ ˆ์ด์•„์›ƒ ๋ชจ๋ธ์„ ๊ตฌํ˜„ํ•˜์—ฌ ์ปดํฌ๋„ŒํŠธ๋“ค์ด ์–ด๋–ป๊ฒŒ ์œ„์น˜ํ•˜๊ณ  ํฌ๊ธฐ๊ฐ€ ์ •ํ•ด์ง€๋Š”์ง€๋ฅผ ๊ณ„์‚ฐํ•ฉ๋‹ˆ๋‹ค. ๋˜ํ•œ, ํฌ๋กœ์Šค ํ”Œ๋žซํผ ์ง€์›์œผ๋กœ yoga๋Š” android, ios UIKit, .net, swift, c++์˜ ์—ฌ๋Ÿฟ ํ”Œ๋žซํผ์„ ์ง€์›ํ•ฉ๋‹ˆ๋‹ค.

๋˜ํ•œ, yoga๋Š” ์„ฑ๋Šฅ์„ ๊ณ ๋ คํ•˜์—ฌ ์„ค๊ณ„๋˜์—ˆ๋Š”๋ฐ, ๋ ˆ์ด์•„์›ƒ์„ ๊ณ„์‚ฐํ•  ๋•Œ ํ…์ŠคํŠธ ๋ทฐ๋‚˜ ๋ผ๋ฒจ๊ณผ ๊ฐ™์ด ์ธก์ •ํ•˜๋Š”๋ฐ ์‹œ๊ฐ„์ด ์˜ค๋ž˜ ๊ฑธ๋ฆฌ๋Š” ์š”์†Œ๋“ค์„ ๊ฐ€๋Šฅํ•œ ํ•œ ์ ๊ฒŒ, ์ด์ƒ์ ์œผ๋กœ๋Š” ํ•œ ๋ฒˆ๋งŒ ์ธก์ •ํ•˜๋„๋ก ๋ณด์žฅํ•ฉ๋‹ˆ๋‹ค.

โ“ react native์—์„œ ๊ฐœ๋ฐœํ•  ๋•Œ ๋นˆ ํ™”๋ฉด์ด ๋‚˜์˜ค๋Š” ์—๋Ÿฌ์˜ ์ด์œ ์™€ crash๋‚˜๋Š” ์—๋Ÿฌ์˜ ์ฐจ์ด๋Š”?โ€‹

๋ณดํ†ต ๋นˆ ํ™”๋ฉด์ด ๋‚˜์˜จ๋А ๊ฒฝ์šฐ์—๋Š” JavaScript์—์„œ ๋ฐœ์ƒํ•˜๋Š” ์—๋Ÿฌ๊ฐ€ ์ผ๋ฐ˜์ ์ž…๋‹ˆ๋‹ค. ๋˜๋Š” api๊ฐ€ ํ˜ธ์ถœ์— ์‹คํŒจํ•˜์—ฌ ๋นˆํ™”๋ฉด์ด ๋…ธ์ถœ๋  ์ˆ˜๋„ ์žˆ๊ฑฐ๋‚˜, ๋ฒˆ๋“ค๋ง ๋ฌธ์ œ๋„ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด ๊ฒฝ์šฐ์—๋Š” ์•ฑ์€ ์‹คํ–‰์ค‘์ด์ง€๋งŒ UI๊ฐ€ ์—†๋Š” ๊ฒฝ์šฐ๋ผ ErrorBoundary๋ฅผ ์‚ฌ์šฉํ•˜๊ฑฐ๋‚˜ JS ๋””๋ฒ„๊ฑฐ๋ฅผ ํ™œ์šฉํ•˜์—ฌ ๋””๋ฒ„๊น…์„ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

crash๊ฐ€ ๋‚˜๋Š” ์—๋Ÿฌ์ธ ๊ฒฝ์šฐ์—๋Š” ๋„ค์ดํ‹ฐ๋ธŒ ๋ชจ๋“ˆ์— ์—๋Ÿฌ๊ฐ€ ๋ฐœ์ƒํ•˜๋Š” ๊ฒฝ์šฐ๋‚˜ ๋ฉ”๋ชจ๊ฐ€ ๋ถ€์กฑํ•˜์—ฌ ์—๋Ÿฌ๊ฐ€ ๋‚˜๋Š” ๊ฒฝ์šฐ ์ž…๋‹ˆ๋‹ค. ์•ฑ์ด crash๊ฐ€ ๋‚˜๋Š” ๊ฒฝ์šฐ์—๋Š” ์•ฑ์ด ์™„์ „ํžˆ ์ข…๋ฃŒ๋˜์–ด ํ™ˆ ํ™”๋ฉด์œผ๋กœ ๋Œ์•„๊ฐ€๋ฉฐ ๋„ค์ดํ‹ฐ๋ธŒ ํฌ๋ž˜์‹œ ๋กœ๊ทธ๋ฅผ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค. ์ด ๊ฒฝ์šฐ์—๋Š” ๊ฐ os๋ณ„๋กœ ํฌ๋ž˜์‹œ๊ฐ€ ๋ฐœ์ƒํ•˜๋Š” ํฌ๋ž˜์‹œ ๋กœ๊ทธ๋ฅผ ํ™•์ธํ•˜์—ฌ ์—๋Ÿฌ๋ฅผ ํ™•์ธํ•˜๊ฑฐ๋‚˜ ๋ฉ”๋กœ๋ฆฌ ๊ด€๋ จ ํฌ๋ž˜์‹œ ์ธ ๊ฒฝ์šฐ์—๋Š” react-native-performance์˜ ๋„๊ตฌ๋ฅผ ํ™œ์šฉํ•˜์—ฌ ๋ฉ”๋กœ๋ฆฌ ๊ด€๋ จ ํฌ๋ž˜์‹œ๋ฅผ ํŒŒ์•…ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ํ”„๋กœ๋•์…˜ ํฌ๋ž˜์‹œ ๋Œ€์‘์œผ๋กœ๋Š” sentry์™€ ๊ฐ™์€ ๋ฆฌํฌํŒ…๋ฅผ ํ™œ์šฉํ•˜์—ฌ ๋””๋ฒ„๊น…ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

โ“ code push(OTA)์˜ ๋™์ž‘ ์›๋ฆฌโ€‹

code push๋Š” javascript ์ฝ”๋“œ์™€ ์—์…‹์„ ์•ฑ ์Šคํ† ์–ด ์‹ฌ์‚ฌ ๊ณผ์ • ์—†์ด ์ง์ ‘ ์‚ฌ์šฉ์ž ๊ธฐ๊ธฐ์— ์—…๋ฐ์ดํŠธํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•ด์ฃผ๋Š” over-the-air(OTA) ์—…๋ฐ์ดํŠธ ๋„๊ตฌ์ž…๋‹ˆ๋‹ค.

React Native ์•ฑ์€ JavaScript ํŒŒ์ผ๊ณผ ์ด๋ฏธ์ง€ ๋“ฑ์˜ ์—์…‹์œผ๋กœ ๊ตฌ์„ฑ๋˜๋ฉฐ, ์ด๋“ค์€ metro bundler์— ์˜ํ•ด ๋ฒˆ๋“ค๋ง๋˜์–ด ํ”Œ๋žซํผ๋ณ„ ๋ฐ”์ด๋„ˆ๋ฆฌ์˜ ์ผ๋ถ€๋กœ ๋ฐฐํฌ๋ฉ๋‹ˆ๋‹ค.
๊ทธ๋ ‡๊ธฐ ๋–„๋ฌธ์— JavaScript ํŒŒ์ผ ๋ณ€๊ฒฝ์‚ฌํ•ญ๊ณผ ์—์…‹๋งŒ ์—…๋ฐ์ดํŠธ๊ฐ€ ๊ฐ€๋Šฅํ•˜๋ฉด, ์ด๋Š” ๋ธŒ๋ผ์šฐ์ €์—์„œ ์ƒˆ๋กœ๊ณ ์นจ์„ ํ†ตํ•ด ๋ณ€๊ฒฝ์‚ฌํ•ญ์„ ๋ณผ ์ˆ˜ ์žˆ๋Š” ๊ฒƒ๊ณผ ์œ ์‚ฌํ•ฉ๋‹ˆ๋‹ค.

  1. ๊ฐœ๋ฐœ์ž๊ฐ€ ์—…๋ฐ์ดํŠธ๋ฅผ ์ƒ์„ฑ: CLI๋ฅผ ํ†ตํ•ด ๋ณ€๊ฒฝ๋œ JavaScript ์ฝ”๋“œ์™€ ์—์…‹์„ CodePush ์„œ๋ฒ„์— ์—…๋กœ๋“œ
  2. ์•ฑ์ด ์—…๋ฐ์ดํŠธ ํ™•์ธ: ์•ฑ ์‹คํ–‰์‹œ CodePush ์„œ๋ฒ„์— ์ƒˆ ์—…๋ฐ์ดํŠธ๊ฐ€ ์žˆ๋Š”์ง€ ํ™•์ธ
  3. ์ฐจ๋“ฑ ๋‹ค์šด๋กœ๋“œ: CodePush๋Š” ์ฐจ๋“ฑ ์—…๋ฐ์ดํŠธ๋ฅผ ์ง€์›ํ•˜์—ฌ ์‚ฌ์šฉ์ž๊ฐ€ ์‹ค์ œ๋กœ ํ•„์š”ํ•œ ํŒŒ์ผ๋งŒ ๋‹ค์šด๋กœ๋“œ๊ฐ€ ๊ฐ€๋Šฅํ•˜๊ฒŒ ํ•ฉ๋‹ˆ๋‹ค.
  4. ์—…๋ฐ์ดํŠธ ์ ์šฉ: ๋‹ค์šด๋กœ๋“œ๋œ ์—…๋ฐ์ดํŠธ๋ฅผ ๋‹ค์Œ ์•ฑ ์žฌ์‹œ์ž‘ ์‹œ ์ ์šฉ & ์ฆ‰์‹œ ์ ์šฉ

์ด๋Ÿฌํ•œ ์žฅ์ ์œผ๋กœ ์ธํ•ด ์•ฑ ์—…๋ฐ์ดํŠธ์—†์ด ๋น ๋ฅธ ๊ฐœ๋ฐœ ๋ฐ ๋ฐฐํฌ๊ฐ€ ๊ฐ€๋Šฅํ•˜๋ฉฐ ์‚ฌ์šฉ์ž๊ฐ€ ์ˆ˜๋™์œผ๋กœ ์•ฑ์„ ์—…๋ฐ์ดํŠธํ•  ํ•„์š”๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค. ๋‹ค๋งŒ, JavaScript ์ฝ”๋“œ์— ๋Œ€ํ•ด์„œ๋งŒ ๊ฐ€๋Šฅํ•˜๋ฉฐ ๋„คํ‹ฐ์ด๋ธŒ ์ฝ”๋“œ ๋ณ€๊ฒฝ์‹œ ์•ฑ ์—…๋ฐ์ดํŠธ๊ฐ€ ํ•„์ˆ˜์ž…๋‹ˆ๋‹ค.

โ“ React Native์—์„œ์˜ StyleSheet.create์™€ ์ผ๋ฐ˜ JavaScript ๊ฐ์ฒด์˜ ์ฐจ์ด์ โ€‹

์ปดํฌ๋„ŒํŠธ ์™ธ๋ถ€์— ์„ ์–ธ๋œ ์ผ๋ฐ˜ ๊ฐ์ฒด์™€ StyleSheet.create ์‚ฌ์ด์—๋Š” ์„ฑ๋Šฅ์ƒ ์ฐจ์ด๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค. ์‹ค์ œ๋กœ StyleSheet.create์˜ ๋‚ด๋ถ€ ๊ตฌํ˜„์„ ๋ณด๋ฉด, ๊ฐ์ฒด๋ฅผ ๋ฐ›์•„์„œ ๊ทธ๋Œ€๋กœ ๊ฐ์ฒด๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋Š” ๋‹จ์ˆœํ•œ ๊ตฌ์กฐ์ž…๋‹ˆ๋‹ค.
๊ทธ๋ ‡์ง€๋งŒ StyleSheet.create๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ์ฝ”๋“œ๋ฅผ ์ดํ•ดํ•˜๊ธฐ ์‰ฝ๊ฐ€ ๋งŒ๋“ค๊ณ , ์Šคํƒ€์ผ์— ์˜๋ฏธ ์žˆ๋Š” ์ด๋ฆ„์„ ๋ถ€์—ฌํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋˜ํ•œ, typescript ์‚ฌ์šฉ์‹œ ํƒ€์ž… ๊ฒ€์ฆ์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.

์ธ๋ผ์ธ ์Šคํƒ€์ผ์„ ์‚ฌ์šฉํ•˜๋ฉด ๋ Œ๋”๋งํ•  ๋•Œ๋งˆ๋‹ค ์ƒˆ๋กœ์šด ๊ฐ์ฒด๊ฐ€ ์ƒ์„ฑ๋˜์–ด ์„ฑ๋Šฅ ์ €ํ•˜๊ฐ€ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ์ธ๋ผ์ธ ์Šคํƒ€์ผ ์‚ฌ์šฉ์„ ์ง€์–‘ํ•˜๊ณ  StyleSheet.create๋ฅผ ์‚ฌ์šฉํ•˜๋Š”๊ฒŒ ์ข‹์Šต๋‹ˆ๋‹ค.