[React Native] React Native Deep Dive
ํ๊ทธ: development · React Native · React Native ์ํคํ ์ฒ ์ดํดํ๊ธฐ · Bridge · Fabric · Turbo Modules · ์ฑ๋ฅ ์ต์ ํ
- React Native ์ํคํ ์ฒ๋ฅผ ์ดํดํ๊ธฐ
- ๊ตฌ ์ํคํ ์ฒ: Bridge ๋ชจ๋ธ
- ์๋ก์ด ์ํคํ ์ฒ: Fabric๊ณผ Turbo Modules
- ๋น๊ต: ๊ตฌ ์ํคํ ์ฒ vs ์๋ก์ด ์ํคํ ์ฒ
- ๊ฐ๋จํ ๋น์
- ์ฃผ์ ์์ฝ (๊ตฌ ์ํคํ ์ฒ)
- ๊ฐ๋จํ ๋น์ (์๋ก์ด ์ํคํ ์ฒ)
React Native ์ํคํ ์ฒ๋ฅผ ์ดํดํ๊ธฐ
React Native ์ํคํ ์ฒ๋ฅผ ๊น์ด ์ดํดํ๋ ๊ฑด ๊ฐ๋ฐ์๊ฐ ์ฑ๋ฅ์ ์ต์ ํํ๊ณ , ํจ์จ์ ์ผ๋ก ๋๋ฒ๊น ํ๋ฉฐ, ์ต์ ๊ธฐ์ ์ ํ์ฉํด ๊ณ ํ์ง์ ํ์ฅ ๊ฐ๋ฅํ ์ ํ๋ฆฌ์ผ์ด์ ์ ๊ตฌ์ถํ๋ ๋ฐ ์ค์ํจ.
๊ตฌ ์ํคํ ์ฒ: Bridge ๋ชจ๋ธ
๊ตฌ ์ํคํ ์ฒ์์๋ React Native๊ฐ ๋ ๊ฐ์ ๋ณ๋ ์ธ์์์ ์๋ํ์:
- JavaScript World โ ์ฑ ๋ก์ง์ด ์คํ๋๋ ๊ณณ
- Native World โ UI์ ์์คํ ๊ธฐ๋ฅ์ด ์๋ํ๋ ๊ณณ
์ด ๋ ์ธ์์ ์๋ก ๋ค๋ฅธ ์ธ์ด(JavaScript vs Swift/Java/Kotlin)๋ฅผ ์ฌ์ฉํ๋ฏ๋ก ํต์ ๋ฐฉ๋ฒ์ด ํ์ํ์. ๋ฐ๋ก ์ฌ๊ธฐ์ Bridge๊ฐ ๋ฑ์ฅํจ.
Bridge๊ฐ ์ด๋ป๊ฒ ์๋ํ๋๊ฐ?
- JavaScript ์ธก์ JSON ๋ฉ์์ง๋ฅผ ํตํด Native ์ธก์ ๋ฌด์์ ํด์ผ ํ ์ง ์๋ ค์ค.
- Native ์ธก์ ์ด ๋ฉ์์ง๋ฅผ ์ฝ๊ณ UI๋ฅผ ๋ ๋๋งํ๊ฑฐ๋ ํ ์คํธ๋ฅผ ์ ๋ฐ์ดํธํ๋ ๋ฑ์ ์์ ์ ์คํํจ.
- ์ฌ์ฉ์๊ฐ UI์ ์ํธ์์ฉํ๋ฉด(์: ๋ฒํผ ํด๋ฆญ ์) Native ์ธก์ ๋ค์ JavaScript๋ก ๋ฉ์์ง๋ฅผ ๋ณด๋.
์์: ๋ก๊ทธ์ธ ํ๋ฉด ๋ง๋ค๊ธฐ
- JavaScript๋ Bridge๋ฅผ ํตํด ๋ฉ์์ง๋ฅผ ๋ณด๋:
- โ์ด ์คํ์ผ๋ก ์ ๋ ฅ ํ๋๋ฅผ ๋ง๋ค์ด๋ผโ
- โ์ด ์์ฑ์ผ๋ก ๋ฒํผ์ ๋ง๋ค์ด๋ผโ
- Native ์ธก์ ๋ฉ์์ง๋ฅผ ๋ฐ๊ณ UI๋ฅผ ๋ ๋๋งํจ.
- ์ฌ์ฉ์๊ฐ ํ ์คํธ๋ฅผ ์ ๋ ฅํ๋ฉด Native ์ธก์ ๋ฐ์ดํฐ๋ฅผ JavaScript๋ก ๋ค์ ๋ณด๋.
React Native์ Thread(๊ตฌ ์ํคํ ์ฒ)
React Native ์ฑ์ ์ฌ๋ฌ Thread์์ ์คํ๋จ:
- JavaScript Thread โ ๋ชจ๋ React Native ๋ ผ๋ฆฌ๋ฅผ ์คํํ๊ณ UI ์ ๋ฐ์ดํธ๋ฅผ ์ฒ๋ฆฌํจ.
- Native Thread โ UI ์์์ ๋ํ ํ๋ซํผ ํน์ ์ฝ๋(Swift, Java/Kotlin)๋ฅผ ์คํํจ.
- ์๋์ฐ Thread โ ๋ ์ด์์์ ์ฒ๋ฆฌํ๋ Yoga Engine์ ์ฌ์ฉํด ์คํ์ผ์ Native ๋ ์ด์์์ผ๋ก ๋ณํํจ.
๊ตฌ ์ํคํ ์ฒ์ ๋จ์
๐จ 1. ์ฑ๋ฅ ๋ฌธ์
- JavaScript์ Native ๊ฐ์ ํต์ ์ด ๋๋ ค์ ๋ฉ์์ง๊ฐ ๋น๋๊ธฐ์ ์ผ๋ก ์ ๋ฌ๋จ.
- UI ์ ๋ฐ์ดํธ๊ฐ ๋ฆ์ด์ง๋ฉด ์คํฌ๋กค์ ์ง์ฐ์ด ๋ฐ์ํ ์ ์์.
๐จ 2. ๋ฉ๋ชจ๋ฆฌ ๊ณต์ ๋ถ๊ฐ
- JavaScript์ Native๋ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ๊ณต์ ํ์ง ์์.
- ๋์ ๋ฐ์ดํฐ๋ฅผ JSON ํ์์ผ๋ก ๋ณต์ฌํด ์ ๋ฌํ๋๋ฐ, ์ด๋ก ์ธํด ์ฑ๋ฅ์ด ์ ํ๋จ.
๐จ 3. Native Module ๋ก๋ฉ์ ๋นํจ์จ์ฑ
- React Native๋ ํ์ํ์ง ์์ Native Module๋ ์ฑ ์์ ์ ๋ชจ๋ ๋ก๋ํจ. ์ด๋ก ์ธํด ๋ก๋ ์๊ฐ์ด ๊ธธ์ด์ง.
๐จ 4. ๊ธฐ์ฌ๊ฐ ์ด๋ ค์
- React Native์ ์ฝ๋๋ฒ ์ด์ค๊ฐ ๋ณต์กํด์ ๊ฐ๋ฐ์๋ค์ด ๊ฐ์ ํ๊ฑฐ๋ ์์ ํ๋ ๊ฒ ์ด๋ ค์.
์๋ก์ด ์ํคํ ์ฒ: Fabric๊ณผ Turbo Modules
์ด ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๊ธฐ ์ํด React Native๋ ์๋ก์ด ์ํคํ ์ฒ์ธ Fabric๊ณผ Turbo Modules๋ฅผ ๋์ ํจ.
Fabric์ด๋ ๋ฌด์์ธ๊ฐ?
Fabric์ Bridge๋ฅผ ์ ๊ฑฐํ๊ณ JavaScript์ Native ๊ฐ์ ๋ ๋น ๋ฅด๊ณ ํจ์จ์ ์ธ ํต์ ๋ชจ๋ธ์ ์ ๊ณตํจ.
Fabric์ด ๋ ์ข์ ์ด์ ?
- ๋น๋๊ธฐ ๋ฉ์์ง๊ฐ ์๋ ๋๊ธฐ์ ํต์ ์ ์ฌ์ฉํจ.
- JavaScript์ Native๊ฐ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ๊ณต์ ํด ๋ฐ์ดํฐ ๋ณต์ฌ ํ์์ฑ์ ์ค์.
- UI ์๋ต์ฑ๊ณผ ๋ถ๋๋ฌ์์ ๊ฐ์ ํจ.
Turbo Modules๋ ๋ฌด์์ธ๊ฐ?
Turbo Modules๋ React Native๊ฐ ์์ ์ ๋ชจ๋ Native Module์ ๋ก๋ํ๋ ๋์ , ํ์ํ Module๋ง ๋ก๋ํ ์ ์๊ฒ ํจ.
Turbo Modules๊ฐ ๋ ์ข์ ์ด์ ?
- ์ฑ ์์ ์๊ฐ์ ์ค์.
- ํ์ํ ๋๋ง Module์ ๋ก๋ํด ๋ฉ๋ชจ๋ฆฌ๋ฅผ ์ ์ฝํจ.
๋น๊ต: ๊ตฌ ์ํคํ ์ฒ vs ์๋ก์ด ์ํคํ ์ฒ
React Native ์ฑ ์์ด์ฝ์ ํด๋ฆญํ์ ๋์ ํ๋ฆ
1๋จ๊ณ: ์ฑ ์์ & UI ๊ด๋ฆฌ์ ์์
์ฑ ์์ด์ฝ์ ํด๋ฆญํ๋ฉด ์ด์ ์ฒด์ ๊ฐ ์ฑ์ ์คํํ๊ณ React Native๋ฅผ ์์ํจ. UI ๊ด๋ฆฌ์๋ ํ ์คํธ ํ๋, ๋ฒํผ, ์ด๋ฏธ์ง ๋ฑ์ Native ์ปดํฌ๋ํธ๋ฅผ ์ด๊ธฐํํจ.2๋จ๊ณ: JavaScript ๋ฒ๋ค ๋ก๋
React Native๋ MainBundle.js๋ฅผ ๋ก๋ํด ์ฑ์ ๋ชจ๋ JavaScript ์ฝ๋๋ฅผ ํฌํจํจ.3๋จ๊ณ: Bridge๋ฅผ ํตํ ๋ทฐ ์์ฑ (๊ตฌ ์ํคํ ์ฒ) ๋๋ Fabric (์๋ก์ด ์ํคํ ์ฒ)
- ๊ตฌ ์ํคํ ์ฒ: JavaScript๋ Bridge๋ฅผ ํตํด JSON ๋ฉ์์ง๋ฅผ ๋ณด๋ด UI ์์๋ฅผ ์์ฑํจ.
- ์๋ก์ด ์ํคํ ์ฒ: Fabric์ Native ์ฝ๋์ ์ง์ ์ํธ์์ฉํด UI ๋ ๋๋ง์ ๋ ๋น ๋ฅด๊ฒ ๋ง๋ฌ.
4๋จ๊ณ: ๋ ์ด์์ ๊ณ์ฐ (Yoga Engine ์ฌ์ฉ)
React Native๋ ์น์์ ์ฌ์ฉํ๋ ํ์ค CSS ๋์ Yoga Engine์ ์ฌ์ฉํด ๋ ์ด์์์ ๊ณ์ฐํ๊ณ ์์์ ์์น๋ฅผ ์ค์ ํจ. ์๋์ฐ Thread๊ฐ ์ด ๋ ์ด์์ ์ฒ๋ฆฌ๋ฅผ ๋ด๋นํจ.5๋จ๊ณ: UI๊ฐ ํ๋ฉด์ ํ์๋จ
๋ง์ง๋ง์ผ๋ก UI ๊ด๋ฆฌ์๋ ๊ณ์ฐ๋ ๋ ์ด์์์ ๊ธฐ๋ฐ์ผ๋ก UI๋ฅผ ํ์ํจ. ์ฑ์ด ์์ ํ ๋ก๋๋๊ณ ์ฌ์ฉํ ์ค๋น๊ฐ ๋จ! ๐
์ฑ ์์ ์์ ํ๋ฆ
- UI ๊ด๋ฆฌ์๋ Native ์ปดํฌ๋ํธ๋ฅผ ์ด๊ธฐํํจ.
- JavaScript๋ MainBundle.js๋ฅผ ๋ก๋ํจ.
- Yoga Engine์ ์ฌ์ฉํด ๋ ์ด์์์ ๊ณ์ฐํจ.
- UI๊ฐ ํ๋ฉด์ ํ์๋จ.
MainBundle.js์ ๋ฌด์์ด ํฌํจ๋์ด ์๋๊ฐ?
MainBundle.js(๋๋ Android์ index.bundle)๋ React Native ์ ํ๋ฆฌ์ผ์ด์ ์์ ๋ชจ๋ JavaScript ์ฝ๋๋ฅผ ํฌํจํ๋ ๋ฒ๋ค์. ์ด ํ์ผ์ ์ฑ ๋น๋ ์ ์์ฑ๋จ.
MainBundle.js์ ํฌํจ๋๋ ๊ฒ๋ค:
- ๋ชจ๋ JavaScript ์ฝ๋ โ React Native ์ ํ๋ฆฌ์ผ์ด์ ์ ์ ์ฒด ๋ ผ๋ฆฌ.
- React ๋ฐ React Native Core API โ ๋ ๋๋ง์ ์ํ ํ์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ.
- Metro Bundler ๋ณํ โ ์ต์ ํ๋๊ณ ์ถ์๋ JavaScript ์ฝ๋.
- ์๋ํํฐ ๋ผ์ด๋ธ๋ฌ๋ฆฌ โ Axios, Redux ๋ฑ ์ธ๋ถ ๋ผ์ด๋ธ๋ฌ๋ฆฌ.
- Native Bridge ํธ์ถ (๊ตฌ ์ํคํ ์ฒ ์ฌ์ฉ ์) โ Native ์ปดํฌ๋ํธ์์ ํต์ ์ฝ๋.
MainBundle.js๋ ์ด๋ป๊ฒ ์์ฑ๋๋๊ฐ?
React Native์ Metro Bundler๋ ๋ชจ๋ JavaScript ํ์ผ์ ์ปดํ์ผํด MainBundle.js๋ผ๋ ๋จ์ผ ํ์ผ๋ก ๋ฒ๋ค๋งํจ.
Metro Bundler์ ์ญํ
- ES6+ JavaScript๋ฅผ ES5 ๋ฌธ๋ฒ์ผ๋ก ๋ณํํจ.
- ์ฌ๋ฌ JavaScript ํ์ผ์ ํ๋์ ๋ฒ๋ค๋ก ๊ฒฐํฉํจ.
- ์ฝ๋๋ฅผ ์ต์ ํํด ํ๋ก๋์ ์ ์ํ ์ถ์(minify) ์์ ์ ํจ.
- ๊ฐ๋ฐ ์ค ํซ ๋ฆฌ๋ก๋ฉ์ ์ฒ๋ฆฌํจ.
๊ฐ๋จํ ๋น์
React Native ์ฑ์ ์์์ ์์ ์์์ ์ฃผ๋ฌธํ๋ ๊ฒ์ผ๋ก ๋น์ ํ ์ ์์:
- โ JavaScript Thread (๊ณ ๊ฐ) - ์ด๋ค ์ข ๋ฅ์ ์ปคํผ๋ฅผ ์ฃผ๋ฌธํ ์ง ๊ฒฐ์ ํจ(์ฑ ๋ ผ๋ฆฌ).
- ๐งโ๐ณ Bridge (๋ฐ๋ฆฌ์คํ) - ์ฃผ๋ฌธ์ ์ ๋ฌ๋ฐ๊ณ ์ปคํผ๋ฅผ ๋ง๋๋ ๊ณผ์ ์ผ๋ก ๋๊น.
- ๐ต Native ์ธก (์ปคํผ ๋จธ์ ) - ์ปคํผ๋ฅผ ๋ง๋ค๊ณ ํ์ํ ์ถ๊ฐ ์์ ์ ์ฒ๋ฆฌํจ(UI ๋ ๋๋ง).
- ๐ UI ๊ด๋ฆฌ์ (์๋น ์ง์) - ์์ฑ๋ ์ปคํผ๋ฅผ ๊ณ ๊ฐ์๊ฒ ์ ๋ฌํจ(UI๋ฅผ ํ์).
์์์ ์ด ๋๋ฌด ๋ฐ์๋ฉด(Bridge ์์ฒญ์ด ๋ง์ผ๋ฉด) ์๋น์ค๊ฐ ๋๋ ค์ง. ๊ทธ๋์ React Native์ ์ต์ ๋ฒ์ ์์๋ ์ฑ๋ฅ ํฅ์์ ์ํด Bridge ์์กด๋๋ฅผ ์ค์์.
์ฃผ์ ์์ฝ (๊ตฌ ์ํคํ ์ฒ)
- React Native๋ ๋ชจ๋ฐ์ผ ์ฑ์ JavaScript๋ก ์์ฑํ ์ ์๊ฒ ํด์ฃผ์ง๋ง ์ฌ์ ํ Native ์ปดํฌ๋ํธ๋ฅผ ์ฌ์ฉํจ.
- JavaScript์ Native ์ธก์ ์ฐ๊ฒฐํ๋ Bridge๊ฐ ์ปคํผ ์ฃผ๋ฌธ๊ณผ ์ ๋ฌ์ ์ฒ๋ฆฌํ๋ ์ญํ ์ ํจ. UI ์ ๋ฐ์ดํธ๋ ๋น๋๊ธฐ์ ์ผ๋ก ์ด๋ฃจ์ด์ ธ ์ง์ฐ์ด ๋ฐ์ํ ์ ์์. Shadow Thread๊ฐ ์คํ์ผ์ ๋ชจ๋ฐ์ผ OS๊ฐ ์ดํดํ ์ ์๋ ํ์์ผ๋ก ๋ณํํจ.
- ๊ตฌ ์ํคํ ์ฒ๋ Bridge ์ฌ์ฉ์ผ๋ก ์ธํด ์ฑ๋ฅ ์ ํ๊ฐ ๋ฐ์ํ๊ณ , ์ด๋ฅผ ํด๊ฒฐํ๊ธฐ ์ํด Fabric๊ณผ Turbo Modules์ ๊ฐ์ ๊ฐ์ ์ฌํญ์ด ๋์ ๋จ.
๊ฐ๋จํ ๋น์ (์๋ก์ด ์ํคํ ์ฒ)
์๋ก์ด ์์คํ ์์๋ ๋ชจ๋ ๊ฒ์ด ๋ ์ง๊ด์ ์ด๊ณ ํจ์จ์ ์. React Native ์ฑ์ ๋ค์๊ณผ ๊ฐ์:
- โ JavaScript Thread (๊ณ ๊ฐ) - ๊ณ ๊ฐ์ด ์ํ๋ ์ปคํผ๋ฅผ ๋น ๋ฅด๊ฒ ๊ฒฐ์ ํจ(์ฑ ๋ ผ๋ฆฌ).
- ๐งโ๐ณ Fabric (๋ฐ๋ฆฌ์คํ) - ์ปคํผ๋ฅผ ์ง์ ๋ง๋ค๊ณ , ํ์ํ ๋ชจ๋ ์์ ์ ํ ๋ฒ์ ์ฒ๋ฆฌํจ(UI ๋ ๋๋ง).
- โ๏ธ Turbo Modules (๊ณ ๊ธ ์ปคํผ ๋๊ตฌ) - ํน์ํ ์ปคํผ ๋จธ์ ์ผ๋ก ํน๋ณํ ์๊ตฌ๋ฅผ ์ฒ๋ฆฌํจ(์นด๋ฉ๋ผ๋ GPS์ - ๊ฐ์ Native ๊ธฐ๋ฅ ์ ๊ทผ).
- ๐ ์ง์ ํต์ (์๋น ์ง์) - ์ปคํผ๊ฐ ์ค๋น๋๋ฉด ๋ฐ๋ก ๊ณ ๊ฐ์๊ฒ ์ ๋ฌํจ, ์ง์ฐ ์์ด ๋น ๋ฅด๊ฒ!
์๋ก์ด ์์คํ ์์๋ ์ปคํผ๊ฐ ๋ ๋น ๋ฅด๊ณ ์ง๊ด์ ์ผ๋ก ์ ๊ณต๋๋ฉฐ, ์ด์ ๋ณด๋ค ๋ ํจ์จ์ ์ด๊ณ ์ฆ๊ฐ์ ์ธ ์๋น์ค๋ฅผ ๊ฒฝํํ ์ ์์.