(๋ฒˆ์—ญ) ๋ฆฌ์•กํŠธ ๋„ค์ดํ‹ฐ๋ธŒ์˜ ์ƒˆ๋กœ์šด ์•„ํ‚คํ…์ฒ˜๊ฐ€ ์ถœ์‹œ๋˜์—ˆ์Šต๋‹ˆ๋‹ค

react native

์›๋ฌธ : New Architecture is here

์ƒˆ๋กœ์šด ์•„ํ‚คํ…์ฒ˜๊ฐ€ ๊ธฐ๋ณธ์œผ๋กœ ํฌํ•จ๋œ ๋ฆฌ์•กํŠธ ๋„ค์ดํ‹ฐ๋ธŒ 0.76์„ ์ด์ œ npm์—์„œ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค!

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

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

์ด ๋ฆด๋ฆฌ์Šค๋Š” 2018๋…„๋ถ€ํ„ฐ ๋ฆฌ์•กํŠธ ๋„ค์ดํ‹ฐ๋ธŒ๋ฅผ ์™„์ „ํžˆ ์ƒˆ๋กœ ์„ค๊ณ„ํ•˜๋ ค๋Š” ๋…ธ๋ ฅ์˜ ๊ฒฐ๊ณผ์ด๋ฉฐ, ๋Œ€๋ถ€๋ถ„์˜ ์•ฑ์ด ์ ์ง„์ ์œผ๋กœ ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜ ํ•  ์ˆ˜ ์žˆ๋„๋ก ํŠน๋ณ„ํžˆ ์‹ ๊ฒฝ ์ผ์Šต๋‹ˆ๋‹ค. 2021๋…„์—๋Š” ์ปค๋ฎค๋‹ˆํ‹ฐ์™€ ํ˜‘๋ ฅํ•˜์—ฌ ๋ฆฌ์•กํŠธ ์ƒํƒœ๊ณ„ ์ „์ฒด๊ฐ€ ์›ํ™œํ•˜๊ฒŒ ์—…๊ทธ๋ ˆ์ด๋“œํ•  ์ˆ˜ ์žˆ๋„๋ก ์ƒˆ๋กœ์šด ์•„ํ‚คํ…์ฒ˜ ์ž‘์—… ๊ทธ๋ฃน์„ ๋งŒ๋“ค์—ˆ์Šต๋‹ˆ๋‹ค.

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

์ง€๋‚œ ๋ช‡ ๋…„๊ฐ„ ๊ฐœ๋ฐœ์„ ๊ฑฐ์น˜๋ฉฐ ํŒ€์€ ์ƒˆ๋กœ์šด ์•„ํ‚คํ…์ฒ˜์— ๋Œ€ํ•œ ๋น„์ „์„ ๊ณต๊ฐœ์ ์œผ๋กœ ๊ณต์œ ํ•ด ์™”์Šต๋‹ˆ๋‹ค. ๋†“์ณค๋‹ค๋ฉด ๋‹ค์Œ ๋ฐœํ‘œ๋“ค์„ ํ™•์ธํ•ด ๋ณด์„ธ์š”.

์ƒˆ๋กœ์šด ์•„ํ‚คํ…์ฒ˜๋ž€ ๋ฌด์—‡์ธ๊ฐ€์š”?

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

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

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

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

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

์ด ๋ชจ๋“  ๋ฌธ์ œ๋Š” ๋ฆฌ์•กํŠธ์˜ ๋™์‹œ(concurrent) ๊ธฐ๋Šฅ์„ ์ ์ ˆํžˆ ์ง€์›ํ•˜๋Š” ๊ฒƒ์„ ๋ถˆ๊ฐ€๋Šฅํ•˜๊ฒŒ ๋งŒ๋“ค์—ˆ์Šต๋‹ˆ๋‹ค. ์ด๋Ÿฌํ•œ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด ์ƒˆ๋กœ์šด ์•„ํ‚คํ…์ฒ˜๋Š” ๋„ค ๊ฐ€์ง€ ์ฃผ์š” ์š”์†Œ๋ฅผ ํฌํ•จํ•ฉ๋‹ˆ๋‹ค.

  • ์ƒˆ๋กœ์šด ๋„ค์ดํ‹ฐ๋ธŒ ๋ชจ๋“ˆ ์‹œ์Šคํ…œ
  • ์ƒˆ๋กœ์šด ๋ Œ๋”๋Ÿฌ
  • ์ด๋ฒคํŠธ ๋ฃจํ”„
  • ๋ธŒ๋ฆฟ์ง€ ์ œ๊ฑฐ

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

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

์ƒˆ๋กœ์šด ์ด๋ฒคํŠธ ๋ฃจํ”„๋Š” ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ์Šค๋ ˆ๋“œ์˜ ์ž‘์—…์„ ์ž˜ ์ •์˜๋œ ์ˆœ์„œ๋กœ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋ฅผ ํ†ตํ•ด ๋ฆฌ์•กํŠธ๋Š” ๋ Œ๋”๋ง์„ ์ค‘๋‹จํ•˜๊ณ  ์ด๋ฒคํŠธ๋ฅผ ์ฒ˜๋ฆฌํ•˜์—ฌ ๊ธด๊ธ‰ํ•œ ์‚ฌ์šฉ์ž ์ด๋ฒคํŠธ๊ฐ€ ๋” ๋‚ฎ์€ ์šฐ์„ ์ˆœ์œ„์˜ UI ์ „ํ™˜๋ณด๋‹ค ์šฐ์„ ํ•˜๋„๋ก ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋ฒคํŠธ ๋ฃจํ”„๋Š” ์›น ์‚ฌ์–‘๊ณผ๋„ ์ผ์น˜ํ•˜๋ฏ€๋กœ ๋งˆ์ดํฌ๋กœ ํƒœ์Šคํฌ, MutationObserver, IntersectionObserver์™€ ๊ฐ™์€ ๋ธŒ๋ผ์šฐ์ € ๊ธฐ๋Šฅ๋„ ์ง€์›ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

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

์ƒˆ๋กœ์šด ์•„ํ‚คํ…์ฒ˜๋Š” ์ด์ œ ํ”„๋กœ๋•์…˜์—์„œ ์‚ฌ์šฉํ•  ์ค€๋น„๊ฐ€ ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ๋ฉ”ํƒ€์˜ ํŽ˜์ด์Šค๋ถ ์•ฑ๊ณผ ๊ธฐํƒ€ ์ œํ’ˆ์—์„œ ์ด๋ฏธ ๋Œ€๊ทœ๋ชจ๋กœ ์‚ฌ์šฉ ์ค‘์ด๋ฉฐ, Quest ๊ธฐ๊ธฐ์šฉ ํŽ˜์ด์Šค๋ถ ๋ฐ ์ธ์Šคํƒ€๊ทธ๋žจ ์•ฑ ๊ฐœ๋ฐœ์—์„œ๋„ ์„ฑ๊ณต์ ์œผ๋กœ ํ™œ์šฉ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

Expensify์™€ Kraken๊ณผ ๊ฐ™์€ ํŒŒํŠธ๋„ˆ๋“ค์€ ์ด๋ฏธ ๋ช‡ ๋‹ฌ ๋™์•ˆ ์ƒˆ๋กœ์šด ์•„ํ‚คํ…์ฒ˜๋ฅผ ์‚ฌ์šฉํ•ด ์„ฑ๊ณต์ ์ธ ๊ฒฐ๊ณผ๋ฅผ ์–ป์—ˆ์Šต๋‹ˆ๋‹ค. BlueSky์˜ ์ตœ์‹  ๋ฆด๋ฆฌ์Šค๋„ ํ™•์ธํ•ด ๋ณด์„ธ์š”.

์ƒˆ๋กœ์šด ๋„ค์ดํ‹ฐ๋ธŒ ๋ชจ๋“ˆ

์ƒˆ๋กœ์šด ๋„ค์ดํ‹ฐ๋ธŒ ๋ชจ๋“ˆ ์‹œ์Šคํ…œ์€ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ์™€ ๋„ค์ดํ‹ฐ๋ธŒ ํ”Œ๋žซํผ ๊ฐ„ ํ†ต์‹  ๋ฐฉ์‹์„ ์™„์ „ํžˆ ์žฌ์„ค๊ณ„ํ•œ ๊ฒƒ์œผ๋กœ, C++๋กœ ์ž‘์„ฑ๋˜์–ด ๋‹ค์Œ๊ณผ ๊ฐ™์€ ์ƒˆ๋กœ์šด ๊ธฐ๋Šฅ์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.

  • ๋™๊ธฐ์  ๋„ค์ดํ‹ฐ๋ธŒ ๋Ÿฐํƒ€์ž„ ์•ก์„ธ์Šค
  • ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ์™€ ๋„ค์ดํ‹ฐ๋ธŒ ์ฝ”๋“œ ๊ฐ„ ํƒ€์ž… ์•ˆ์ „์„ฑ
  • ํ”Œ๋žซํผ ๊ฐ„ ์ฝ”๋“œ ๊ณต์œ 
  • ๊ธฐ๋ณธ์ ์œผ๋กœ ์ง€์—ฐ ๋กœ๋”ฉ ์ง€์›

์ƒˆ๋กœ์šด ๋„ค์ดํ‹ฐ๋ธŒ ๋ชจ๋“ˆ ์‹œ์Šคํ…œ์—์„œ๋Š” ์ด์ œ ๋น„๋™๊ธฐ ๋ธŒ๋ฆฟ์ง€๋ฅผ ์‚ฌ์šฉํ•  ํ•„์š” ์—†์ด ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ์ธํ„ฐํŽ˜์ด์Šค(JSI)๋ฅผ ํ†ตํ•ด ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ์™€ ๋„ค์ดํ‹ฐ๋ธŒ ๋ ˆ์ด์–ด๊ฐ€ ์„œ๋กœ ๋™๊ธฐ์ ์œผ๋กœ ํ†ต์‹ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ฆ‰, ์ด์ œ ์‚ฌ์šฉ์ž ์ •์˜ ๋„ค์ดํ‹ฐ๋ธŒ ๋ชจ๋“ˆ์—์„œ ํ•จ์ˆ˜๋ฅผ ๋™๊ธฐ์ ์œผ๋กœ ํ˜ธ์ถœํ•˜๊ณ  ๊ฐ’์„ ๋ฐ˜ํ™˜ํ•œ ๋‹ค์Œ ํ•ด๋‹น ๊ฐ’์„ ๋‹ค๋ฅธ ๋„ค์ดํ‹ฐ๋ธŒ ๋ชจ๋“ˆ ํ•จ์ˆ˜์— ๋‹ค์‹œ ์ „๋‹ฌํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ด์ „ ์•„ํ‚คํ…์ฒ˜์—์„œ๋Š” ๋„ค์ดํ‹ฐ๋ธŒ ํ•จ์ˆ˜ ํ˜ธ์ถœ์˜ ์‘๋‹ต์„ ์ฒ˜๋ฆฌํ•˜๋ ค๋ฉด ์ฝœ๋ฐฑ์„ ์ œ๊ณตํ•ด์•ผ ํ–ˆ๊ณ , ๋ฐ˜ํ™˜๋œ ๊ฐ’์€ ์ง๋ ฌํ™”ํ•  ์ˆ˜ ์žˆ์–ด์•ผ ํ–ˆ์Šต๋‹ˆ๋‹ค.

// โŒ ๋„ค์ดํ‹ฐ๋ธŒ ๋ชจ๋“ˆ์—์„œ ๋™๊ธฐํ™” ์ฝœ๋ฐฑ
nativeModule.getValue(value => {
  // โŒ v๊ฐ’์€ ๋„ค์ดํ‹ฐ๋ธŒ ๊ฐ์ฒด๋ฅผ ์ฐธ์กฐํ•  ์ˆ˜ ์—†์Œ
  nativeModule.doSomething(value);
});

์ƒˆ ์•„ํ‚คํ…์ฒ˜์—์„œ๋Š” ๋„ค์ดํ‹ฐ๋ธŒ ํ•จ์ˆ˜์— ๋Œ€ํ•œ ๋™๊ธฐ์‹ ํ˜ธ์ถœ์„ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

// โœ… ๋„ค์ดํ‹ฐ๋ธŒ ๋ชจ๋“ˆ์˜ ๋™๊ธฐ ์‘๋‹ต
const value = nativeModule.getValue();

// โœ… ๊ฐ’์€ ๋„ค์ดํ‹ฐ๋ธŒ ๊ฐ์ฒด๋ฅผ ์ฐธ์กฐํ•  ์ˆ˜ ์žˆ์Œ
nativeModule.doSomething(value);

์ƒˆ๋กœ์šด ์•„ํ‚คํ…์ฒ˜๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ๋งˆ์นจ๋‚ด ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ/ํƒ€์ž…์Šคํฌ๋ฆฝํŠธ API์—์„œ ์•ก์„ธ์Šค ํ•˜๋ฉด์„œ C++ ๋„ค์ดํ‹ฐ๋ธŒ ๊ตฌํ˜„์˜ ๋ชจ๋“  ๊ธฐ๋Šฅ์„ ํ™œ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ƒˆ๋กœ์šด ๋ชจ๋“ˆ ์‹œ์Šคํ…œ์€ C++๋กœ ์ž‘์„ฑ๋œ ๋ชจ๋“ˆ์„ ์ง€์›ํ•˜๋ฏ€๋กœ ๋ชจ๋“ˆ์„ ํ•œ ๋ฒˆ๋งŒ ์ž‘์„ฑํ•˜๋ฉด Android, iOS, Windows, macOS๋ฅผ ํฌํ•จํ•œ ๋ชจ๋“  ํ”Œ๋žซํผ์—์„œ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค. C++๋กœ ๋ชจ๋“ˆ์„ ๊ตฌํ˜„ํ•˜๋ฉด ๋ณด๋‹ค ์„ธ๋ถ„ํ™”๋œ ๋ฉ”๋ชจ๋ฆฌ ๊ด€๋ฆฌ์™€ ์„ฑ๋Šฅ ์ตœ์ ํ™”๊ฐ€ ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค.

๋˜ํ•œ Codegen์„ ์‚ฌ์šฉํ•˜๋ฉด ๋ชจ๋“ˆ์—์„œ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ๊ณ„์ธต๊ณผ ๋„ค์ดํ‹ฐ๋ธŒ ๊ณ„์ธต ๊ฐ„์— ๊ฐ•๋ ฅํ•œ ํƒ€์ž… ์•ˆ์ „ ๊ณ„์•ฝ์„ ์ •์˜ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ฒฝํ—˜์ƒ ํฌ๋กœ์Šค ํ”Œ๋žซํผ ์•ฑ์—์„œ ๋ฐœ์ƒํ•˜๋Š” ๊ฐ€์žฅ ์ผ๋ฐ˜์ ์ธ ํฌ๋ž˜์‹œ ์›์ธ ์ค‘ ํ•˜๋‚˜๋Š” ๊ฒฝ๊ณ„ ๊ฐ„ ํƒ€์ž… ์˜ค๋ฅ˜์ž…๋‹ˆ๋‹ค. Codegen์€ ์ด๋Ÿฌํ•œ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๊ณ  ๋ณด์ผ๋Ÿฌํ”Œ๋ ˆ์ดํŠธ ์ฝ”๋“œ๋ฅผ ์ž๋™์œผ๋กœ ์ƒ์„ฑํ•ด ์ค๋‹ˆ๋‹ค.

๋งˆ์ง€๋ง‰์œผ๋กœ ๋ชจ๋“ˆ์€ ์ด์ œ ์ง€์—ฐ ๋กœ๋”ฉ๋ฉ๋‹ˆ๋‹ค. ์ฆ‰, ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์ด ์‹œ์ž‘๋  ๋•Œ๊ฐ€ ์•„๋‹ˆ๋ผ ์‹ค์ œ๋กœ ํ•„์š”ํ•  ๋•Œ ๋ฉ”๋ชจ๋ฆฌ์— ๋กœ๋“œ๋ฉ๋‹ˆ๋‹ค. ์ด๋ฅผ ํ†ตํ•ด ์•ฑ ์‹œ์ž‘ ์‹œ๊ฐ„์ด ๋‹จ์ถ•๋˜๊ณ  ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์ด ๋ณต์žกํ•ด์ ธ๋„ ์„ฑ๋Šฅ์ด ์œ ์ง€๋ฉ๋‹ˆ๋‹ค.

react-native-mmkv์™€ ๊ฐ™์€ ์ธ๊ธฐ ์žˆ๋Š” ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋Š” ์ด๋ฏธ ์ƒˆ๋กœ์šด ๋„ค์ดํ‹ฐ๋ธŒ ๋ชจ๋“ˆ๋กœ ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜ ํ•˜์—ฌ ์ด์ ์„ ๋ˆ„๋ฆฌ๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

โ€œ์ƒˆ๋กœ์šด ๋„ค์ดํ‹ฐ๋ธŒ ๋ชจ๋“ˆ ์‹œ์Šคํ…œ ๋•๋ถ„์— react-native-mmkv์˜ ์„ค์ •, ์ž๋™ ๋งํฌ ๋ฐ ์ดˆ๊ธฐํ™” ๊ณผ์ •์ด ํฌ๊ฒŒ ๋‹จ์ˆœํ™”๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ์ƒˆ๋กœ์šด ์•„ํ‚คํ…์ฒ˜ ๋•๋ถ„์— react-native-mmkv๋Š” ์ด์ œ ์ˆœ์ˆ˜ C++ ๋„ค์ดํ‹ฐ๋ธŒ ๋ชจ๋“ˆ๋กœ, ๋ชจ๋“  ํ”Œ๋žซํผ์—์„œ ์ž‘๋™ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ƒˆ๋กœ์šด Codegen์€ MMKV์— ์™„์ „ํ•œ ํƒ€์ž… ์•ˆ์ „์„ฑ์„ ๋ถ€์—ฌํ•˜์—ฌ ์˜ค๋ž˜๋œ NullPointerReference ๋ฌธ์ œ๋ฅผ null ์•ˆ์ „์„ฑ์„ ๊ฐ•์ œ ์ ์šฉํ•จ์œผ๋กœ์จ ํ•ด๊ฒฐํ–ˆ์Šต๋‹ˆ๋‹ค. ๋˜ํ•œ ๋„ค์ดํ‹ฐ๋ธŒ ๋ชจ๋“ˆ ํ•จ์ˆ˜๋ฅผ ๋™๊ธฐ์ ์œผ๋กœ ํ˜ธ์ถœํ•  ์ˆ˜ ์žˆ์–ด ์‚ฌ์šฉ์ž ์ง€์ • JSI ์•ก์„ธ์Šค๋ฅผ ์ƒˆ๋กœ์šด ๋„ค์ดํ‹ฐ๋ธŒ ๋ชจ๋“ˆ API๋กœ ๋Œ€์ฒดํ•  ์ˆ˜ ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค.โ€ - react-native-mmkv์˜ ๊ฐœ๋ฐœ์ž Marc Rousavy

์ƒˆ๋กœ์šด ๋ Œ๋”๋Ÿฌ

์šฐ๋ฆฌ๋Š” ๋„ค์ดํ‹ฐ๋ธŒ ๋ Œ๋”๋Ÿฌ๋ฅผ ์™„์ „ํžˆ ์ƒˆ๋กœ ์ž‘์„ฑํ•˜์—ฌ ์—ฌ๋Ÿฌ ๊ฐ€์ง€ ์ด์ ์„ ์ถ”๊ฐ€ํ–ˆ์Šต๋‹ˆ๋‹ค.

  • ์—…๋ฐ์ดํŠธ๋Š” ๋‹ค๋ฅธ ์šฐ์„ ์ˆœ์œ„๋กœ ๋‹ค๋ฅธ ์Šค๋ ˆ๋“œ์—์„œ ๋ Œ๋”๋ง ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • ๋ ˆ์ด์•„์›ƒ์„ ๋™๊ธฐ์ ์œผ๋กœ ์ฝ์„ ์ˆ˜ ์žˆ์œผ๋ฉฐ ์—ฌ๋Ÿฌ ์Šค๋ ˆ๋“œ์—์„œ ์•ก์„ธ์Šค ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • ๋ Œ๋”๋Ÿฌ๋Š” C++๋กœ ์ž‘์„ฑ๋˜์–ด ๋ชจ๋“  ํ”Œ๋žซํผ์—์„œ ๊ณต์œ ๋ฉ๋‹ˆ๋‹ค.

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

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

๋งˆ์ง€๋ง‰์œผ๋กœ ๋ Œ๋”๋Ÿฌ๋ฅผ C++๋กœ ๋‹ค์‹œ ์ž‘์„ฑํ•จ์œผ๋กœ์จ ๋ชจ๋“  ํ”Œ๋žซํผ์—์„œ ๋™์ผํ•œ ์ฝ”๋“œ๋ฅผ ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋Š” iOS, Android, Windows, macOS ๋ฐ ๋ฆฌ์•กํŠธ ๋„ค์ดํ‹ฐ๋ธŒ๊ฐ€ ์ง€์›ํ•˜๋Š” ๊ธฐํƒ€ ํ”Œ๋žซํผ์—์„œ ์ผ๊ด€๋œ ๋ Œ๋”๋ง ๊ธฐ๋Šฅ์„ ์ œ๊ณตํ•˜๋ฉฐ, ๊ฐ ํ”Œ๋žซํผ์— ๋Œ€ํ•ด ๋ณ„๋„๋กœ ๊ตฌํ˜„ํ•  ํ•„์š”๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค.

์ด๋Ÿฌํ•œ ๋ณ€๊ฒฝ์€ โ€œ๋‹ค์ค‘ ํ”Œ๋žซํผ ๋น„์ „(Many Platform Vision)โ€์„ ํ–ฅํ•œ ์ค‘์š”ํ•œ ๋‹จ๊ณ„์ž…๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด, ๋ทฐ ํ‰ํƒ„ํ™”(View Flattening)๋Š” ๊นŠ์€ ๋ ˆ์ด์•„์›ƒ ํŠธ๋ฆฌ๋ฅผ ํ”ผํ•˜๊ธฐ ์œ„ํ•œ Android ์ „์šฉ ์ตœ์ ํ™”์˜€์Šต๋‹ˆ๋‹ค. ๊ณต์œ  C++ ์ฝ”์–ด๊ฐ€ ์žˆ๋Š” ์ƒˆ๋กœ์šด ๋ Œ๋”๋Ÿฌ๋Š” ์ด ๊ธฐ๋Šฅ์„ iOS์—๋„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค. ์ด ์ตœ์ ํ™”๋Š” ์ž๋™์œผ๋กœ ์ด๋ฃจ์–ด์ง€๋ฉฐ ์ถ”๊ฐ€ ์„ค์ •์ด ํ•„์š”ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

์ด๋Ÿฌํ•œ ๋ณ€๊ฒฝ ์‚ฌํ•ญ์œผ๋กœ ๋ฆฌ์•กํŠธ ๋„ค์ดํ‹ฐ๋ธŒ๋Š” ์ด์ œ Suspense ๋ฐ Transition๊ณผ ๊ฐ™์€ ๋™์‹œ(concurrent) ๋ฆฌ์•กํŠธ ๊ธฐ๋Šฅ์„ ์™„๋ฒฝํ•˜๊ฒŒ ์ง€์›ํ•˜์—ฌ ์‚ฌ์šฉ์ž ์ž…๋ ฅ์— ๋น ๋ฅด๊ฒŒ ๋ฐ˜์‘ํ•˜๋Š” ๋ณต์žกํ•œ ์‚ฌ์šฉ์ž ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ์ง€์—ฐ, ๋Š๊น€ ๋˜๋Š” ์‹œ๊ฐ์  ์ ํ”„ ์—†์ด ์‰ฝ๊ฒŒ ๊ตฌ์ถ•ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ํ–ฅํ›„ ์ด๋Ÿฌํ•œ ์ƒˆ๋กœ์šด ๊ธฐ๋Šฅ์„ ํ™œ์šฉํ•˜์—ฌ FlatList ๋ฐ TextInput๊ณผ ๊ฐ™์€ ๊ธฐ๋ณธ ์ปดํฌ๋„ŒํŠธ์— ๋Œ€ํ•œ ๋” ๋งŽ์€ ๊ฐœ์„  ์‚ฌํ•ญ์„ ์ œ๊ณตํ•  ์˜ˆ์ •์ž…๋‹ˆ๋‹ค.

Reanimated๊ณผ ๊ฐ™์€ ์ธ๊ธฐ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋Š” ์ด๋ฏธ ์ƒˆ๋กœ์šด ๋ Œ๋”๋Ÿฌ์˜ ์ด์ ์„ ํ™œ์šฉํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

โ€œํ˜„์žฌ ๊ฐœ๋ฐœ ์ค‘์ธ Reanimated 4๋Š” ์ƒˆ๋กœ์šด ๋ Œ๋”๋Ÿฌ์™€ ์ง์ ‘ ์ž‘๋™ํ•˜๋Š” ์ƒˆ๋กœ์šด ์• ๋‹ˆ๋ฉ”์ด์…˜ ์—”์ง„์„ ๋„์ž…ํ•˜์—ฌ ์• ๋‹ˆ๋ฉ”์ด์…˜์„ ์ฒ˜๋ฆฌํ•˜๊ณ  ๋ ˆ์ด์•„์›ƒ์„ ์—ฌ๋Ÿฌ ์Šค๋ ˆ๋“œ์—์„œ ๊ด€๋ฆฌํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ƒˆ๋กœ์šด ๋ Œ๋”๋Ÿฌ์˜ ์„ค๊ณ„ ๋•๋ถ„์— ์ˆ˜๋งŽ์€ ์šฐํšŒ ๋ฐฉ๋ฒ•์— ์˜์กดํ•˜์ง€ ์•Š๊ณ  ์ด๋Ÿฌํ•œ ๊ธฐ๋Šฅ์„ ๊ตฌ์ถ•ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋˜ํ•œ C++๋กœ ๊ตฌํ˜„๋˜๊ณ  ํ”Œ๋žซํผ ๊ฐ„์— ๊ณต์œ ๋˜๊ธฐ ๋•Œ๋ฌธ์— Reanimated์˜ ํฐ ๋ถ€๋ถ„์€ ํ•œ ๋ฒˆ ์ž‘์„ฑ๋˜์–ด ํ”Œ๋žซํผ๋ณ„ ๋ฌธ์ œ๋ฅผ ์ตœ์†Œํ™”ํ•˜๊ณ  ์ฝ”๋“œ๋ฒ ์ด์Šค๋ฅผ ์ค„์ด๋ฉฐ ํ”Œ๋žซํผ ์ฑ„ํƒ์„ ๊ฐ„์†Œํ™”ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.โ€ - Reanimated์˜ ๊ฐœ๋ฐœ์ž Krzysztof Magiera

์ด๋ฒคํŠธ ๋ฃจํ”„

์ƒˆ๋กœ์šด ์•„ํ‚คํ…์ฒ˜๋Š” ์ด RFC์—์„œ ์„ค๋ช…๋œ ๋Œ€๋กœ ์ž˜ ์ •์˜๋œ ์ด๋ฒคํŠธ ๋ฃจํ”„ ์ฒ˜๋ฆฌ ๋ชจ๋ธ์„ ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ๋„๋ก ํ–ˆ์Šต๋‹ˆ๋‹ค. ์ด RFC๋Š” HTML ํ‘œ์ค€์— ์„ค๋ช…๋œ ์‚ฌ์–‘์„ ๋”ฐ๋ฅด๋ฉฐ ๋ฆฌ์•กํŠธ ๋„ค์ดํ‹ฐ๋ธŒ๊ฐ€ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ์Šค๋ ˆ๋“œ์—์„œ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•˜๋Š” ๋ฐฉ์‹์„ ์„ค๋ช…ํ•ฉ๋‹ˆ๋‹ค.

์ž˜ ์ •์˜๋œ ์ด๋ฒคํŠธ ๋ฃจํ”„๋ฅผ ๊ตฌํ˜„ํ•˜๋ฉด ๋ฆฌ์•กํŠธ ๋„ค์ดํ‹ฐ๋ธŒ์™€ ๋ฆฌ์•กํŠธ DOM ๊ฐ„์˜ ๊ฐ„๊ทน์„ ์ค„์ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด์ œ ๋ฆฌ์•กํŠธ ๋„ค์ดํ‹ฐ๋ธŒ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ๋™์ž‘์ด ๋ฆฌ์•กํŠธ DOM ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ๋™์ž‘๊ณผ ๋” ์œ ์‚ฌํ•ด์ ธ ํ•œ ๋ฒˆ ํ•™์Šตํ•˜๋ฉด ์–ด๋””์„œ๋‚˜ ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•˜๊ธฐ๊ฐ€ ๋” ์‰ฌ์›Œ์ง‘๋‹ˆ๋‹ค.

์ด๋ฒคํŠธ ๋ฃจํ”„๋Š” ๋ฆฌ์•กํŠธ ๋„ค์ดํ‹ฐ๋ธŒ์— ์—ฌ๋Ÿฌ ๊ฐ€์ง€ ์ด์ ์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.

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

๋ฆฌ์•กํŠธ๋Š” ์ด๋ฒคํŠธ ๋ฃจํ”„๋ฅผ ํ†ตํ•ด ์—…๋ฐ์ดํŠธ์™€ ์ด๋ฒคํŠธ์˜ ์ˆœ์„œ๋ฅผ ์˜ˆ์ธก ๊ฐ€๋Šฅํ•˜๊ฒŒ ๊ด€๋ฆฌํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋ฅผ ํ†ตํ•ด ๋‚ฎ์€ ์šฐ์„ ์ˆœ์œ„ ์—…๋ฐ์ดํŠธ๋ฅผ ๊ธด๊ธ‰ ์‚ฌ์šฉ์ž ์ด๋ฒคํŠธ๋กœ ์ค‘๋‹จํ•˜๊ณ  ์ƒˆ ๋ Œ๋”๋Ÿฌ๋ฅผ ์‚ฌ์šฉํ•ด ์ด๋Ÿฌํ•œ ์—…๋ฐ์ดํŠธ๋ฅผ ๋…๋ฆฝ์ ์œผ๋กœ ๋ Œ๋”๋ง ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ด๋ฒคํŠธ ๋ฃจํ”„๋Š” ํƒ€์ด๋จธ์™€ ๊ฐ™์€ ์ด๋ฒคํŠธ ๋ฐ ์ž‘์—…์˜ ๋™์ž‘์„ ์›น ์‚ฌ์–‘๊ณผ ์ผ์น˜ํ•˜๋„๋ก ์กฐ์ •ํ•˜์—ฌ ๋ฆฌ์•กํŠธ ๋„ค์ดํ‹ฐ๋ธŒ๊ฐ€ ์›น์—์„œ ์ต์ˆ™ํ•œ ๋ฐฉ์‹์œผ๋กœ ์ž‘๋™ํ•˜๋„๋ก ํ•˜๊ณ  ๋ฆฌ์•กํŠธ DOM๊ณผ ๋ฆฌ์•กํŠธ ๋„ค์ดํ‹ฐ๋ธŒ ๊ฐ„์˜ ์ฝ”๋“œ ๊ณต์œ ๋ฅผ ๊ฐœ์„ ํ•ฉ๋‹ˆ๋‹ค.

์ด๋Š” ๋งˆ์ดํฌ๋กœํƒœ์Šคํฌ(microtasks), MutationObserver ๋ฐ IntersectionObserver์™€ ๊ฐ™์€ ์›น ํ‘œ์ค€ ๋ธŒ๋ผ์šฐ์ € ๊ธฐ๋Šฅ์˜ ๊ตฌํ˜„๋„ ๊ฐ€๋Šฅํ•˜๊ฒŒ ํ•ฉ๋‹ˆ๋‹ค. ์ด๋Ÿฌํ•œ ๊ธฐ๋Šฅ์€ ์•„์ง ๋ฆฌ์•กํŠธ ๋„ค์ดํ‹ฐ๋ธŒ์—์„œ ์‚ฌ์šฉํ•  ์ˆ˜ ์—†์ง€๋งŒ, ํ–ฅํ›„ ์ง€์›ํ•  ์ˆ˜ ์žˆ๋„๋ก ์ž‘์—… ์ค‘์ž…๋‹ˆ๋‹ค.

๋งˆ์ง€๋ง‰์œผ๋กœ, ์ด๋ฒคํŠธ ๋ฃจํ”„์™€ ์ƒˆ๋กœ์šด ๋ Œ๋”๋Ÿฌ์˜ ๋ณ€๊ฒฝ์‚ฌํ•ญ๋“ค์€ ๋ ˆ์ด์•„์›ƒ์„ ๋™๊ธฐ์ ์œผ๋กœ ์ฝ์„ ์ˆ˜ ์žˆ๊ฒŒ ์ง€์›ํ•˜์—ฌ, ๋ฆฌ์•กํŠธ ๋„ค์ดํ‹ฐ๋ธŒ๊ฐ€ useLayoutEffect๋ฅผ ์ œ๋Œ€๋กœ ์ง€์›ํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ์ด๋ฅผ ํ†ตํ•ด ๋ ˆ์ด์•„์›ƒ ์ •๋ณด๋ฅผ ๋™๊ธฐ์ ์œผ๋กœ ์ฝ๊ณ  ๊ฐ™์€ ํ”„๋ ˆ์ž„ ๋‚ด์—์„œ UI๋ฅผ ์—…๋ฐ์ดํŠธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋กœ์จ ์‚ฌ์šฉ์ž์—๊ฒŒ ํ‘œ์‹œ๋˜๊ธฐ ์ „์— ์š”์†Œ๋“ค์˜ ์œ„์น˜๋ฅผ ์ •ํ™•ํ•˜๊ฒŒ ์ง€์ •ํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

์ž์„ธํ•œ ๋‚ด์šฉ์€ useLayoutEffect ๋ฌธ์„œ๋ฅผ ์ฐธ์กฐํ•˜์„ธ์š”.

๋ธŒ๋ฆฟ์ง€ ์ œ๊ฑฐ

์ƒˆ๋กœ์šด ์•„ํ‚คํ…์ฒ˜์—์„œ๋Š” ๋ฆฌ์•กํŠธ ๋„ค์ดํ‹ฐ๋ธŒ์˜ ๋ธŒ๋ฆฟ์ง€ ์ข…์†์„ฑ์„ ์™„์ „ํžˆ ์ œ๊ฑฐํ•˜๊ณ  JSI(JavaScript Interface)๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ์™€ ๋„ค์ดํ‹ฐ๋ธŒ ์ฝ”๋“œ ๊ฐ„ ์ง์ ‘์ ์ด๊ณ  ํšจ์œจ์ ์ธ ํ†ต์‹ ์„ ๊ตฌํ˜„ํ–ˆ์Šต๋‹ˆ๋‹ค.

๋ธŒ๋ฆฟ์ง€ ๋‹ค์ด์–ด๊ทธ๋žจ

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

// โŒ ๋А๋ฆฐ ์ดˆ๊ธฐํ™”
import { NativeTimingModule } from 'NativeTimingModule';
global.setTimeout = timer => {
  NativeTimingModule.setTimeout(timer);
};

// App.js
setTimeout(() => {}, 100);

์ƒˆ ์•„ํ‚คํ…์ฒ˜์—์„œ๋Š” C++์—์„œ ๋ฉ”์„œ๋“œ๋ฅผ ์ง์ ‘ ๋ฐ”์ธ๋”ฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

// โœ… C++์—์„œ ์ง์ ‘์ ์ธ ์ดˆ๊ธฐํ™”
runtime.global().setProperty(runtime, "setTimeout", createTimer);
// App.js
setTimeout(() => {}, 100);

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

๋ธŒ๋ฆฟ์ง€๋Š” ์ƒˆ ์•„ํ‚คํ…์ฒ˜๋กœ์˜ ์ ์ง„์ ์ธ ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜์„ ์ง€์›ํ•˜๊ธฐ ์œ„ํ•ด ์ด์ „ ๋ฒ„์ „๊ณผ์˜ ํ˜ธํ™˜์„ฑ์„ ์œ ์ง€ํ•˜๊ธฐ ์œ„ํ•ด ๋‚จ์•„ ์žˆ์Šต๋‹ˆ๋‹ค. ํ–ฅํ›„ ๋ธŒ๋ฆฟ์ง€ ์ฝ”๋“œ๋Š” ์™„์ „ํžˆ ์ œ๊ฑฐ๋  ์˜ˆ์ •์ž…๋‹ˆ๋‹ค.

์ ์ง„์  ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜

๋Œ€๋ถ€๋ถ„์˜ ์•ฑ์€ ๋‹ค๋ฅธ ๋ฆด๋ฆฌ์Šค์™€ ๋™์ผํ•œ ๋…ธ๋ ฅ์œผ๋กœ 0.76์œผ๋กœ ์—…๊ทธ๋ ˆ์ด๋“œํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

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

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

๋™์‹œ์„ฑ ๊ธฐ๋Šฅ์„ ์‚ฌ์šฉํ•˜๋ ค๋ฉด ์•ฑ์ด ๋ฆฌ์•กํŠธ์˜ ๊ทœ์น™(Rules of React)์„ ๋”ฐ๋ฅด๊ณ  Concurrent ๋ฆฌ์•กํŠธ๋ฅผ ์ง€์›ํ•˜๋„๋ก ์—…๋ฐ์ดํŠธํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ์ฝ”๋“œ๋ฅผ ๋ฆฌ์•กํŠธ 18๊ณผ ๊ทธ ์˜๋ฏธ ์ฒด๊ณ„์— ๋งž๊ฒŒ ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜ ํ•˜๋ ค๋ฉด ๋ฆฌ์•กํŠธ 18 ์—…๊ทธ๋ ˆ์ด๋“œ ๊ฐ€์ด๋“œ๋ฅผ ์ฐธ์กฐํ•˜์„ธ์š”.

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

์šฐ๋ฆฌ๋Š” ๊ฐ€์žฅ ์ธ๊ธฐ ์žˆ๋Š” ๋ฆฌ์•กํŠธ ๋„ค์ดํ‹ฐ๋ธŒ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์™€ ํ˜‘๋ ฅํ•˜์—ฌ ์ƒˆ๋กœ์šด ์•„ํ‚คํ…์ฒ˜ ์ง€์›์„ ๋ณด์žฅํ–ˆ์Šต๋‹ˆ๋‹ค. ํ˜„์žฌ 850๊ฐœ ์ด์ƒ์˜ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๊ฐ€ ์ด๋ฏธ ํ˜ธํ™˜๋˜์—ˆ์œผ๋ฉฐ, ์ฃผ๊ฐ„ ๋‹ค์šด๋กœ๋“œ ์ˆ˜๊ฐ€ 20๋งŒ ํšŒ ์ด์ƒ์ธ ๋ชจ๋“  ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ(๋‹ค์šด๋กœ๋“œ๋œ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์˜ ์•ฝ 10%)๊ฐ€ ํฌํ•จ๋ฉ๋‹ˆ๋‹ค. ์ƒˆ๋กœ์šด ์•„ํ‚คํ…์ฒ˜์™€์˜ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ํ˜ธํ™˜์„ฑ์€ reactnative.directory ์›น์‚ฌ์ดํŠธ์—์„œ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋ฆฌ์•กํŠธ ๋„ค์ดํ‹ฐ๋ธŒ ๋””๋ ‰ํ„ฐ๋ฆฌ

์—…๊ทธ๋ ˆ์ด๋“œ์— ๋Œ€ํ•œ ์ž์„ธํ•œ ๋‚ด์šฉ์€ ์•„๋ž˜ ์—…๊ทธ๋ ˆ์ด๋“œ ๋ฐฉ๋ฒ•์„ ์ฐธ์กฐํ•˜์„ธ์š”.

์ƒˆ๋กœ์šด ๊ธฐ๋Šฅ

์ƒˆ๋กœ์šด ์•„ํ‚คํ…์ฒ˜๋Š” ๋ฆฌ์•กํŠธ 18, ๋™์‹œ์„ฑ ๊ธฐ๋Šฅ ๋ฐ ๋ฆฌ์•กํŠธ ๋„ค์ดํ‹ฐ๋ธŒ์˜ useLayoutEffect๋ฅผ ์™„๋ฒฝํ•˜๊ฒŒ ์ง€์›ํ•ฉ๋‹ˆ๋‹ค. ๋ฆฌ์•กํŠธ 18 ๊ธฐ๋Šฅ์˜ ์ „์ฒด ๋ชฉ๋ก์€ ๋ฆฌ์•กํŠธ 18 ๋ธ”๋กœ๊ทธ ๊ฒŒ์‹œ๋ฌผ์„ ์ฐธ์กฐํ•˜์„ธ์š”.

์ „ํ™˜(Transitions)

์ „ํ™˜์€ ๋ฆฌ์•กํŠธ 18์—์„œ ๊ธด๊ธ‰ ์—…๋ฐ์ดํŠธ์™€ ๊ธด๊ธ‰ํ•˜์ง€ ์•Š์€ ์—…๋ฐ์ดํŠธ๋ฅผ ๊ตฌ๋ถ„ํ•˜๋Š” ์ƒˆ๋กœ์šด ๊ฐœ๋…์ž…๋‹ˆ๋‹ค.

  • ๊ธด๊ธ‰ ์—…๋ฐ์ดํŠธ(Urgent updates): ์ž…๋ ฅ, ํด๋ฆญ๊ณผ ๊ฐ™์ด ์ง์ ‘์ ์ธ ์ƒํ˜ธ์ž‘์šฉ์„ ๋ฐ˜์˜ํ•ฉ๋‹ˆ๋‹ค.
  • ์ „ํ™˜ ์—…๋ฐ์ดํŠธ(Transition updates): UI๋ฅผ ํ•œ ๋ทฐ์—์„œ ๋‹ค๋ฅธ ๋ทฐ๋กœ ์ „ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

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

์ผ๋ฐ˜์ ์œผ๋กœ ์ตœ์ƒ์˜ ์‚ฌ์šฉ์ž ๊ฒฝํ—˜์„ ์ œ๊ณตํ•˜๋ ค๋ฉด ํ•˜๋‚˜์˜ ์‚ฌ์šฉ์ž ์ž…๋ ฅ์ด ๊ธด๊ธ‰ ์—…๋ฐ์ดํŠธ์™€ ๋น„๊ธด๊ธ‰ ์—…๋ฐ์ดํŠธ ๋ชจ๋‘๋ฅผ ํŠธ๋ฆฌ๊ฑฐํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ReactDOM๊ณผ ์œ ์‚ฌํ•˜๊ฒŒ, press๋‚˜ change์™€ ๊ฐ™์€ ์ด๋ฒคํŠธ๋Š” ๊ธด๊ธ‰ ์ด๋ฒคํŠธ๋กœ ์ฒ˜๋ฆฌ๋˜์–ด ์ฆ‰์‹œ ๋ Œ๋”๋ง๋ฉ๋‹ˆ๋‹ค. ๋˜ํ•œ, ์ž…๋ ฅ ์ด๋ฒคํŠธ ๋‚ด์—์„œ startTransition API๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋ฆฌ์•กํŠธ์— ์–ด๋–ค ์—…๋ฐ์ดํŠธ๊ฐ€ โ€œ์ „ํ™˜โ€์œผ๋กœ ์ฒ˜๋ฆฌ๋˜์–ด ๋ฐฑ๊ทธ๋ผ์šด๋“œ์—์„œ ์—ฐ๊ธฐ๋  ์ˆ˜ ์žˆ๋Š”์ง€๋ฅผ ์ง€์ •ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

import { startTransition } from 'react';

// ๊ธด๊ธ‰ ์—…๋ฐ์ดํŠธ: ์Šฌ๋ผ์ด๋” ๊ฐ’์„ ํ‘œ์‹œ
setCount(input);

// ์ „ํ™˜์œผ๋กœ ์ƒํƒœ ์—…๋ฐ์ดํŠธ ํ‘œ์‹œ
startTransition(() => {
  // ์ „ํ™˜ ์—…๋ฐ์ดํŠธ: ๊ฒฐ๊ณผ ํ‘œ์‹œ
  setNumberOfTiles(input);
});

๊ธด๊ธ‰ ์ด๋ฒคํŠธ์™€ ์ „ํ™˜์„ ๋ถ„๋ฆฌํ•˜๋ฉด ์‚ฌ์šฉ์ž ์ธํ„ฐํŽ˜์ด์Šค๊ฐ€ ๋” ๋ฐ˜์‘์ ์œผ๋กœ ๋˜๊ณ , ์‚ฌ์šฉ์ž ๊ฒฝํ—˜์ด ๋”์šฑ ์ง๊ด€์ ์œผ๋กœ ๋ฉ๋‹ˆ๋‹ค.

๋‹ค์Œ์€ ์ „ํ™˜์„ ์ง€์›ํ•˜์ง€ ์•Š๋Š” ์ด์ „ ์•„ํ‚คํ…์ฒ˜์™€ ์ „ํ™˜์„ ์ง€์›ํ•˜๋Š” ์ƒˆ๋กœ์šด ์•„ํ‚คํ…์ฒ˜์˜ ๋น„๊ต์ž…๋‹ˆ๋‹ค. ๊ฐ ํƒ€์ผ์ด ๋‹จ์ˆœํ•œ ๋ฐฐ๊ฒฝ์ƒ‰ ๋ทฐ๊ฐ€ ์•„๋‹ˆ๋ผ ์ด๋ฏธ์ง€๋ฅผ ํฌํ•จํ•œ ๋ณต์žกํ•œ ์ปดํฌ๋„ŒํŠธ๋ผ๊ณ  ์ƒ์ƒํ•ด ๋ณด์„ธ์š”. useTransition์„ ์‚ฌ์šฉํ•˜๋ฉด ์•ฑ์ด ์—…๋ฐ์ดํŠธ๋กœ ์ธํ•ด ๊ณผ๋ถ€ํ•˜ ๋˜๊ฑฐ๋‚˜ ๋’ค์ฒ˜์ง€๋Š” ๊ฒƒ์„ ๋ฐฉ์ง€ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

transitions๋ฅผ ์ง€์›ํ•˜์ง€ ์•Š์€๊ฒฝ์šฐ transitions์„ ์ง€์›ํ•˜๋Š” ๊ฒฝ์šฐ
transitions์„ ์ง€์›ํ•˜์ง€ ์•Š๋Š” ๊ฒฝ์šฐ transitions์„ ์ง€์›ํ•˜๋Š” ๊ฒฝ์šฐ
์ด์ „: ์ „ํ™˜์œผ๋กœ ํ‘œ์‹œํ•˜์ง€ ์•Š๊ณ  ํƒ€์ผ์„ ๋ Œ๋”๋ง ํ•ฉ๋‹ˆ๋‹ค ์ดํ›„: ์ง„ํ–‰ ์ค‘์ธ ๋ Œ๋”๋ง์„ ์ค‘๋‹จํ•˜๋Š” ํŠธ๋žœ์ง€์…˜์ด ์žˆ๋Š” ํƒ€์ผ์„ ๋ Œ๋”๋ง ํ•˜์—ฌ ์˜ค๋ž˜๋œ ์ƒํƒœ์˜ ๋ Œ๋”๋ง์„ ์ค‘๋‹จํ•ฉ๋‹ˆ๋‹ค.

์ž์„ธํ•œ ๋‚ด์šฉ์€ ๋™์‹œ์„ฑ ๋ Œ๋”๋Ÿฌ ๋ฐ ๊ธฐ๋Šฅ ์ง€์›์„ ์ฐธ์กฐํ•˜์„ธ์š”.

์ž๋™ ๋ฐฐ์น˜(Automatic Batching)

์ƒˆ๋กœ์šด ์•„ํ‚คํ…์ฒ˜๋กœ ์—…๊ทธ๋ ˆ์ด๋“œํ•˜๋ฉด ๋ฆฌ์•กํŠธ 18์˜ ์ž๋™ ๋ฐฐ์น˜ ๊ธฐ๋Šฅ์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

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

๋ ˆ๊ฑฐ์‹œ ๋ Œ๋”๋Ÿฌ ๋ฆฌ์•กํŠธ 18 ๋ Œ๋”๋Ÿฌ
๋ ˆ๊ฑฐ์‹œ ๋ Œ๋”๋Ÿฌ ๋ฆฌ์•กํŠธ 18 ๋ Œ๋”๋Ÿฌ
์ด์ „: ๋ ˆ๊ฑฐ์‹œ ๋ Œ๋”๋Ÿฌ๋กœ ๋นˆ๋ฒˆํ•œ ์ƒํƒœ ์—…๋ฐ์ดํŠธ๋ฅผ ๋ Œ๋”๋ง ํ–ˆ์Šต๋‹ˆ๋‹ค. ์ดํ›„: ์ž๋™ ์ผ๊ด„ ์ฒ˜๋ฆฌ๋กœ ๋นˆ๋ฒˆํ•œ ์ƒํƒœ ์—…๋ฐ์ดํŠธ๋ฅผ ๋ Œ๋”๋ง ํ•ฉ๋‹ˆ๋‹ค.

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

์ž์„ธํ•œ ๋‚ด์šฉ์€ ๋™์‹œ์„ฑ ๋ Œ๋”๋Ÿฌ ๋ฐ ๊ธฐ๋Šฅ ์ง€์›์„ ์ฐธ์กฐํ•˜์„ธ์š”.

useLayoutEffect

์ด๋ฒคํŠธ ๋ฃจํ”„์™€ ๋™๊ธฐ์ ์œผ๋กœ ๋ ˆ์ด์•„์›ƒ์„ ์ฝ์„ ์ˆ˜ ์žˆ๋Š” ๊ธฐ๋Šฅ์„ ๊ธฐ๋ฐ˜์œผ๋กœ, ์ƒˆ๋กœ์šด ์•„ํ‚คํ…์ฒ˜์—์„œ๋Š” ๋ฆฌ์•กํŠธ ๋„ค์ดํ‹ฐ๋ธŒ์— useLayoutEffect์— ๋Œ€ํ•œ ์ ์ ˆํ•œ ์ง€์›์„ ์ถ”๊ฐ€ํ–ˆ์Šต๋‹ˆ๋‹ค.

์ด์ „ ์•„ํ‚คํ…์ฒ˜์—์„œ๋Š” onLayout ์ด๋ฒคํŠธ(๋น„๋™๊ธฐ)๋กœ ๋ทฐ์˜ ๋ ˆ์ด์•„์›ƒ ์ •๋ณด๋ฅผ ์ฝ์–ด์•ผ ํ–ˆ์Šต๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ๋ ˆ์ด์•„์›ƒ์„ ์ฝ๊ณ  ์—…๋ฐ์ดํŠธํ•  ๋•Œ๊นŒ์ง€ ์ตœ์†Œ ํ•œ ํ”„๋ ˆ์ž„ ๋™์•ˆ ์ž˜๋ชป๋œ ๋ ˆ์ด์•„์›ƒ์ด ํ‘œ์‹œ๋˜์–ด ํˆดํŒ์ด ์ž˜๋ชป๋œ ์œ„์น˜์— ํ‘œ์‹œ๋˜๋Š” ๋“ฑ์˜ ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ–ˆ์Šต๋‹ˆ๋‹ค.

// โŒ ์ปค๋ฐ‹ ํ›„ ๋น„๋™๊ธฐ onLayout
const onLayout = React.useCallback(event => {
  // โŒ ๋ ˆ์ด์•„์›ƒ์„ ์ฝ๊ธฐ ์œ„ํ•œ ๋น„๋™๊ธฐ ์ฝœ๋ฐฑ
  ref.current?.measureInWindow((x, y, width, height) => {
    setPosition({ x, y, width, height });
  });
}, []);

// ...
<ViewWithTooltip onLayout={onLayout} ref={ref} position={position} />;

์ƒˆ๋กœ์šด ์•„ํ‚คํ…์ฒ˜์—์„œ๋Š” useLayoutEffect ๋‚ด์—์„œ ๋ ˆ์ด์•„์›ƒ ์ •๋ณด๋ฅผ ๋™๊ธฐ์ ์œผ๋กœ ์•ก์„ธ์Šคํ•  ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ ์ด๋Ÿฌํ•œ ๋ฌธ์ œ๊ฐ€ ํ•ด๊ฒฐ๋ฉ๋‹ˆ๋‹ค.

// โœ… ์ปค๋ฐ‹๋™์•ˆ ๋™๊ธฐ layout effect
useLayoutEffect(() => {
  // โœ… ๋ ˆ์ด์•„์›ƒ์„ ์ฝ๊ธฐ ์œ„ํ•œ ๋™๊ธฐ ํ˜ธ์ถœ
  const rect = ref.current?.getBoundingClientRect();
  setPosition(rect);
}, []);

// ...
<ViewWithTooltip ref={ref} position={position} />;

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

๋น„๋™๊ธฐ onLayout ๋™๊ธฐ useLayoutEffect
๋น„๋™๊ธฐ onLayout ๋™๊ธฐ useLayoutEffect
์ด์ „ ์•„ํ‚คํ…์ฒ˜์—์„œ๋Š” ๋ ˆ์ด์•„์›ƒ์„ onLayout์—์„œ ๋น„๋™๊ธฐ์ ์œผ๋กœ ์ฝ์—ˆ๊ธฐ ๋•Œ๋ฌธ์— ํˆดํŒ์˜ ์œ„์น˜๊ฐ€ ์ง€์—ฐ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ์ƒˆ ์•„ํ‚คํ…์ฒ˜์—์„œ๋Š” ๋ ˆ์ด์•„์›ƒ์„ useLayoutEffect์—์„œ ๋™๊ธฐ์‹์œผ๋กœ ์ฝ์–ด์„œ ํ‘œ์‹œํ•˜๊ธฐ ์ „์— ํˆดํŒ ์œ„์น˜๋ฅผ ์—…๋ฐ์ดํŠธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ž์„ธํ•œ ๋‚ด์šฉ์€ ๋™๊ธฐ์  ๋ ˆ์ด์•„์›ƒ ๋ฐ ํšจ๊ณผ ๋ฌธ์„œ๋ฅผ ์ฐธ์กฐํ•˜์„ธ์š”.

Suspense ์™„์ „ ์ง€์›

Suspense๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ์•„์ง ํ‘œ์‹œ ์ค€๋น„๊ฐ€ ๋˜์ง€ ์•Š์€ ์ปดํฌ๋„ŒํŠธ ํŠธ๋ฆฌ์˜ ์ผ๋ถ€์— ๋Œ€ํ•ด ์„ ์–ธ์ ์œผ๋กœ ๋กœ๋”ฉ ์ƒํƒœ๋ฅผ ์ง€์ •ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

<Suspense fallback={<Spinner />}>
  <Comments />
</Suspense>

๋ช‡ ๋…„ ์ „ ์ œํ•œ๋œ ๋ฒ„์ „์˜ Suspense๋ฅผ ๋„์ž…ํ–ˆ์œผ๋ฉฐ ๋ฆฌ์•กํŠธ 18์—์„œ๋Š” ์™„์ „ํ•œ ์ง€์›์ด ์ถ”๊ฐ€๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ์ง€๊ธˆ๊นŒ์ง€ ๋ฆฌ์•กํŠธ ๋„ค์ดํ‹ฐ๋ธŒ๋Š” Suspense์— ๋Œ€ํ•œ ๋™์‹œ์„ฑ ๋ Œ๋”๋ง์„ ์ง€์›ํ•˜์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค.

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

์ž์„ธํ•œ ๋‚ด์šฉ์€ ๋ฆฌ์•กํŠธ 18์˜ Suspense RFC๋ฅผ ์ฐธ์กฐํ•˜์„ธ์š”.

์—…๊ทธ๋ ˆ์ด๋“œ ๋ฐฉ๋ฒ•

0.76์œผ๋กœ ์—…๊ทธ๋ ˆ์ด๋“œํ•˜๋ ค๋ฉด ๋ฆด๋ฆฌ์Šค ํฌ์ŠคํŠธ์˜ ๋‹จ๊ณ„๋ฅผ ๋”ฐ๋ฅด์„ธ์š”. ์ด๋ฒˆ ๋ฆด๋ฆฌ์Šค๋Š” ๋ฆฌ์•กํŠธ 18๋กœ๋„ ์—…๊ทธ๋ ˆ์ด๋“œ๋˜๋ฏ€๋กœ ๋ฆฌ์•กํŠธ 18 ์—…๊ทธ๋ ˆ์ด๋“œ ๊ฐ€์ด๋“œ๋ฅผ ํ•จ๊ป˜ ์ฐธ์กฐํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

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

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

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

์•ฑ

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

๋ฆฌ์•กํŠธ ๋„ค์ดํ‹ฐ๋ธŒ ํŒ€์€ ๊ฐ€์žฅ ์ธ๊ธฐ ์žˆ๋Š” ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์™€ ํ˜‘๋ ฅํ•˜์—ฌ ์ƒˆ๋กœ์šด ์•„ํ‚คํ…์ฒ˜ ์ง€์›์„ ๋ณด์žฅํ–ˆ์Šต๋‹ˆ๋‹ค. ์ƒˆ๋กœ์šด ์•„ํ‚คํ…์ฒ˜์™€์˜ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ํ˜ธํ™˜์„ฑ์€ reactnative.directory ์›น์‚ฌ์ดํŠธ์—์„œ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์•ฑ์—์„œ ์‚ฌ์šฉํ•˜๋Š” ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๊ฐ€ ์•„์ง ํ˜ธํ™˜๋˜์ง€ ์•Š์€ ๊ฒฝ์šฐ ๋‹ค์Œ์„ ์‹œ๋„ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

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

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

๋‹ค์Œ ๊ฐ€์ด๋“œ๋ฅผ ๋”ฐ๋ผ ๋ชจ๋“ˆ๊ณผ ์ปดํฌ๋„ŒํŠธ๋ฅผ ์ƒˆ๋กœ์šด ์•„ํ‚คํ…์ฒ˜๋กœ ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜ ํ•˜์„ธ์š”.

๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ

๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ์œ ์ง€ ๊ด€๋ฆฌ์ž๋Š” ๋จผ์ € ์ž์‹ ์˜ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๊ฐ€ ์ƒํ˜ธ ์šด์šฉ์„ฑ ๋ ˆ์ด์–ด์™€ ํ•จ๊ป˜ ์ž‘๋™ํ•˜๋Š”์ง€ ํ…Œ์ŠคํŠธํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์ž‘๋™ํ•˜์ง€ ์•Š๋Š” ๊ฒฝ์šฐ ์ƒˆ๋กœ์šด ์•„ํ‚คํ…์ฒ˜ ์ž‘์—… ๊ทธ๋ฃน(New Architecture Working Group)์— ์ด์Šˆ๋ฅผ ์—ด์–ด ๋ฌธ์ œ๋ฅผ ๋ณด๊ณ ํ•˜์„ธ์š”.

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

๋‹ค์Œ ๊ฐ€์ด๋“œ๋ฅผ ์ฐธ์กฐํ•˜์—ฌ ๋ชจ๋“ˆ๊ณผ ์ปดํฌ๋„ŒํŠธ๋ฅผ ์ƒˆ๋กœ์šด ์•„ํ‚คํ…์ฒ˜๋กœ ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ƒˆ๋กœ์šด ์•„ํ‚คํ…์ฒ˜ ๋น„ํ™œ์„ฑํ™”(Opt-out)

์ƒˆ๋กœ์šด ์•„ํ‚คํ…์ฒ˜๊ฐ€ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์—์„œ ์ œ๋Œ€๋กœ ์ž‘๋™ํ•˜์ง€ ์•Š๋Š” ๊ฒฝ์šฐ, ๋‹ค์‹œ ํ™œ์„ฑํ™”ํ•  ์ค€๋น„๊ฐ€ ๋  ๋•Œ๊นŒ์ง€ ๋น„ํ™œ์„ฑํ™” ์˜ต์…˜์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋‹ค์Œ ๋‹จ๊ณ„์— ๋”ฐ๋ผ ์ƒˆ๋กœ์šด ์•„ํ‚คํ…์ฒ˜๋ฅผ ๋น„ํ™œ์„ฑํ™”ํ•˜์„ธ์š”.

  • Android์˜ ๊ฒฝ์šฐ์—๋Š” android/gradle.properties ํŒŒ์ผ์„ ์ˆ˜์ •ํ•˜๊ณ  newArchEnabled ํ”Œ๋ž˜๊ทธ๋ฅผ ๋•๋‹ˆ๋‹ค.
-newArchEnabled = true + newArchEnabled = false;
  • iOS์˜ ๊ฒฝ์šฐ์—๋Š” ๋‹ค์Œ ๋ช…๋ น์–ด๋ฅผ ์‹คํ–‰ํ•˜์—ฌ ์ข…์†์„ฑ์„ ๋‹ค์‹œ ์„ค์น˜ํ•˜์„ธ์š”.
RCT_NEW_ARCH_ENABLED=0 bundle exec pod install

๊ฐ์‚ฌ ์ธ์‚ฌ

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

๋˜ํ•œ ์ด๋ฅผ ์œ„ํ•ด ํ˜‘๋ ฅํ•ด ์ฃผ์‹  ๋ชจ๋“  ํŒŒํŠธ๋„ˆ์‚ฌ์—๊ฒŒ๋„ ๊นŠ์€ ๊ฐ์‚ฌ๋ฅผ ๋“œ๋ฆฝ๋‹ˆ๋‹ค. ํŠนํžˆ ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๋ถ„๋“ค๊ป˜ ๊ฐ์‚ฌ์˜ ๋ง์”€์„ ์ „ํ•˜๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค.

  • Expo, ์ƒˆ ์•„ํ‚คํ…์ฒ˜๋ฅผ ์กฐ๊ธฐ์— ์ฑ„ํƒํ•˜๊ณ  ๊ฐ€์žฅ ์ธ๊ธฐ ์žˆ๋Š” ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜ ํ•˜๋Š” ์ž‘์—…์„ ์ง€์›ํ•œ ๊ฒƒ์— ๋Œ€ํ•ด ๊ฐ์‚ฌ๋“œ๋ฆฝ๋‹ˆ๋‹ค.
  • Software Mansion, ์ƒํƒœ๊ณ„์˜ ์ค‘์š”ํ•œ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์œ ์ง€ํ•˜๊ณ , ์ƒˆ ์•„ํ‚คํ…์ฒ˜๋กœ ์กฐ๊ธฐ์— ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜ ํ•˜๊ณ , ๋‹ค์–‘ํ•œ ๋ฌธ์ œ๋ฅผ ์กฐ์‚ฌํ•˜๊ณ  ํ•ด๊ฒฐํ•˜๋Š” ๋ฐ ๋„์›€์„ ์ฃผ์‹  ๋ชจ๋“  ๋ถ„๊ป˜ ๊ฐ์‚ฌ๋“œ๋ฆฝ๋‹ˆ๋‹ค.
  • Callstack, ์ƒํƒœ๊ณ„์˜ ์ค‘์š”ํ•œ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์œ ์ง€ ๊ด€๋ฆฌํ•˜๊ณ , ์ƒˆ ์•„ํ‚คํ…์ฒ˜๋กœ ์กฐ๊ธฐ์— ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜ ํ•˜๊ณ , ์ปค๋ฎค๋‹ˆํ‹ฐ CLI ์ž‘์—…์„ ์ง€์›ํ•ด ์ค€ ๊ฒƒ์— ๋Œ€ํ•ด ๊ฐ์‚ฌ๋“œ๋ฆฝ๋‹ˆ๋‹ค.
  • Microsoft, react-native-windows ๋ฐ react-native-macos๋ฅผ ์œ„ํ•œ ์ƒˆ๋กœ์šด ์•„ํ‚คํ…์ฒ˜ ๊ตฌํ˜„์„ ์ถ”๊ฐ€ํ•˜๊ณ  ๋‹ค๋ฅธ ์—ฌ๋Ÿฌ ๊ฐœ๋ฐœ์ž ๋„๊ตฌ์— ์ถ”๊ฐ€ํ•ด์ฃผ์‹  ์ ์— ๊ฐ์‚ฌ๋“œ๋ฆฝ๋‹ˆ๋‹ค.
  • Expensify, Kraken, BlueSky, Brigad, ์ƒˆ ์•„ํ‚คํ…์ฒ˜์˜ ๋„์ž…์„ ์„ ๋„ํ•˜๊ณ  ๋‹ค์–‘ํ•œ ๋ฌธ์ œ๋ฅผ ๋ณด๊ณ ํ•˜์—ฌ ๋‹ค๋ฅธ ๋ชจ๋“  ์‚ฌ์šฉ์ž๋ฅผ ์œ„ํ•ด ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ๋„๋ก ๋„์™€์ฃผ์‹  ๊ฒƒ์— ๋Œ€ํ•ด ๊ฐ์‚ฌ์˜ ๋ง์”€์„ ์ „ํ•ฉ๋‹ˆ๋‹ค.
  • ์ƒˆ๋กœ์šด ์•„ํ‚คํ…์ฒ˜๋ฅผ ํ…Œ์ŠคํŠธํ•˜๊ณ , ์ผ๋ถ€ ๋ฌธ์ œ๋ฅผ ์ˆ˜์ •ํ•˜๊ณ , ๋ถˆ๋ช…ํ™•ํ•œ ๋ฌธ์ œ์— ๋Œ€ํ•œ ์งˆ๋ฌธ์„ ์—ด์–ด ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•จ์œผ๋กœ์จ ์ƒˆ๋กœ์šด ์•„ํ‚คํ…์ฒ˜์— ๊ธฐ์—ฌํ•œ ๋ชจ๋“  ๋…๋ฆฝ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ์œ ์ง€ ๊ด€๋ฆฌ์ž์™€ ๊ฐœ๋ฐœ์ž์—๊ฒŒ ๊ฐ์‚ฌ์˜ ๋งˆ์Œ์„ ์ „ํ•ฉ๋‹ˆ๋‹ค.

๐Ÿš€ ํ•œ๊ตญ์–ด๋กœ ๋œ ํ”„๋ŸฐํŠธ์—”๋“œ ์•„ํ‹ฐํด์„ ๋น ๋ฅด๊ฒŒ ๋ฐ›์•„๋ณด๊ณ  ์‹ถ๋‹ค๋ฉด Korean FE Article(https://kofearticle.substack.com/)์„ ๊ตฌ๋…ํ•ด์ฃผ์„ธ์š”!


[Ykss]
Written by@[Ykss]
๊ณ ์ด๊ฒŒ ๋‘์ง€ ์•Š๊ณ  ํ˜๋ ค๋ณด๋‚ด๋Š” ๊ฐœ๋ฐœ์ž๊ฐ€ ๋˜์ž.

GitHubInstagramLinkedIn