1. React Native ๋์ ์๋ฆฌ
Android / iOS Native Project์์React-Native Project๊ฐ ์๋ค.- Thread๋?
- ์คํ๋๋ ํ๋ก์ธ์ค ๋ด์์ ์ค์ ๋ก ์์ ์ ์คํํ๋ ์ฃผ์ฒด
- ๋ช ๋ น์ด๋ฅผ ์คํํ์ฌ ์ฒ๋ฆฌ ํ๋ ์ฃผ์ฒด
- (like ์์์ ์์ ์์์ ๋ง๋๋ ํ์์ ๋น์ท)
- React-Native Thread (1)
- Main Thread or UI Thread
- Native ์์ญ์ ๋ ์ด์์์ ๊ทธ๋ ค์ฃผ๋ ์ญํ
- React-Native Thread (2)
- JavaScript Thread
- ์์ฑํ Javascript๊ฐ ์คํ ๋๋๊ณณ
- React-Native Thread (3)
- Native Module Thread
- Native Module์ ๋ค๋ฃฐ๋ ์ฌ์ฉํ๊ฒ ๋๋ Thread
- ํน์ ๋ฆฌ์์ค๋ฑ์ ์์ฒญํ๊ณ ์ ํ ๋ ์ฌ์ฉ
- React-Native Thread (4)
- Shadow Thread
- virtual DOM์ผ๋ก๋ถํฐ ์๋ก์ด Layout์ผ๋ก ๋ณํํ๋๋ก ๊ณ์ฐํด์ฃผ๋ ์ญํ
1.1 React Native intialize process
1Main Thread โ JS Thred โ Shadow Thread โ Native Module Thread
Diffing: virtual DOM๊ณผ ์ค์ DOM element๋ฅผ ๋น๊ตํ๋ฉฐ ๋ณ๊ฒฝ๋์๋์ง ์ฒดํฌReact-Native Bridge- Javascript์ Native๊ฐ ์๋ก ์ํต ํ๋ ํ ์ ์๋๋ก ๋๋ ์ญํ
2. Native Module
- Native Module ์ด๋ Native API๋ฅผ ์ฌ์ฉํ๊ธฐ ์ํ๊ฒ.
- ์ฃผ๋ก ํ์ฌ ์์น, wifi ์ํ ๋ฑ native ์์ญ์์๋ง ์๊ณ ์๋ ์ ๋ณด์ ์ ๊ทผํ๋๊ฒ
- ๋๋ image processing ์ฒ๋ผ ์ฐ์ฐ์ด native์ ๋์ performance๊ฐ ํ์ํ ๋ ์ฌ์ฉ
Native Module- ๋ก์ง/์ฐ์ฐ์ ๋ํ Native Module
- ์ด๋ค Native Library์ ํจ์๋ฅผ ํธ์ถ ํ ๋ ์ฌ์ฉ
- Native UI Component
- View์ ๋ํ Native Module
- ์ฃผ๋ก ์นด๋ฉ๋ผ ๋ฑ ์ฐ์ฐ์ด ๋ง์ View์ ๋ํด์ ์์ฑ
3. New Architecture
3.1 Why New Architecture ?
Bridge๊ฐ ๊ฐ์ง๊ณ ์๋ ๋ณธ์ง์ ์ธ ๋ฌธ์ ๋ฅผ ํด๊ฒฐ ํ๊ธฐ ์ํจ
3.2 Bridge๊ฐ ๊ฐ์ง ์ ํ์
3.2.1 It was asyncronous (๋น๋๊ธฐ ์ฒ๋ฆฌ)
๋น๋๊ธฐ ์ฒ๋ฆฌ: ์ด๋ค ์์ ์ด ๋๋ ๋๊น์ง ๋ค์ ํ๋ก์ธ์ค๋ฅผ ๊ธฐ๋ค๋ฆฌ์ง ์๊ณ ๋ค๋ฅธ ์์ ์ ๋ฐ๋ก ์คํํ๋๊ฒ- ์์ ์ด ๋๋ฌ๋์ง ๋ณด์ฅ์ด ๋์ง ์์, ๋๋ฌ์๋์ ๋ณ๋ ์ฒ๋ฆฌ๊ฐ ํ์
3.2.2 It was single threaded (์ฑ๊ธ ์ค๋ ๋)
- Javascript๊ฐ ์ฑ๊ธ ์ค๋ ๋์์ ๋์ํ๊ธฐ ๋๋ฌธ์ Bridge๋ ์ฑ๊ธ ์ค๋ ๋๋ก ๋์ ํจ
3.2.3 It imposed extra overheads (๋ณํ์ ๋๋ ๊ณผ๋ํ ๋น์ฉ)
- Bridge๋ก ์ด๋ ํ๊ฒ ๋ ๋ JSON Object ๋ณํํ๋ ๋น์ฉ์ด ํผ
3.3 New Architecture
- ๊ธฐ์กด์ ์๋ Bridge๋ฅผ ๋ฒ๋ฆฌ๊ณ , JSI๊ฐ ํด๋น ์ญํ ์ ๋์ ํ๋๋ก ์์
JSI: Javascript Interface, C++ ๊ฐ์ฒด์ ๋ํ ์ฐธ์กฐ๋ฅผ ํ ์ ์๊ฒ ํด์ฃผ๋ ์ญํ
3.3.1 Old Architecture
Bridge๋ฅผ ํตํด Native Module๊ณผ Javascript ๋ก์ง๊ฐ ํต์
1JS โ Bridge โ Native UI2โ Module
3.3.2 New Architecture
Bridge๋ฅผ ํตํด Native Module๊ณผ Javascript ๋ก์ง๊ฐ ํต์
1JS โ JSI Fabric โ Native UI2Turbo Native Module โ Module
3.4 New Architecture๋ฅผ ์ ์ฉํ๋ฉฐ ์ป์๊ฒ
- ๋๊ธฐ ์คํ์ด ๊ฐ๋ฅํ๊ฒ ๋จ
- C++ ๋ชจ๋๋ก ์ง์ ์ ๊ทผ์ ํ ์ ์๋ค๋ณด๋ ๋น๋๊ธฐ ํต์ ์ด ์๋์ด๋ ๋จ
- ๋์์ฑ
- Javascrript์์ ๋ค๋ฅธ ์ค๋ ๋์ ์๋ ํจ์๋ฅผ ํธ์ถ ํ ์ ์์
- Overhead๊ฐ ์ค์ด๋ฌ
- JSON Object๋ก ๋ณํ ํ์ง ์๊ณ C++ ์ธ์ด๋ก ํต์ ํ๊ฒ ๋์๊ธฐ ๋๋ฌธ
- iOS, Android๊ฐ ๋ด๋ถ ๋ค์ดํฐ๋ธ ๋ชจ๋ ์ฝ๋ ๊ณต์ ๊ฐ๋ฅ
- C++์ด ์ถ๊ฐ๋จ์ผ๋ก ์ธํ์ฌ ํ๋ซํผ์ด ๋ค๋ฅด๋๋ผ๋ ํ๊ฐ์ ์ฝ๋๋ก ๊ด๋ฆฌ ๊ฐ๋ฅ
- ํ์
์ ์์ ์ฑ
- ์๋์ผ๋ก ์์ฑ ๋๋ ์ฝ๋ ๋ ์ด์ด์ ์ํด์ ์๋์ผ๋ก ํ์ ์ ์์ฑ ํ๋๋ก ๋์ด์์
4. New Architecture
4.1 Fabric
- Fabric์ด๋ ?
- New Architecture์ ์๋ก์ด rendering system.
- ์ด์ Architecture์์๋ UI Manager๊ฐ ๋ด๋นํ๋ ๋ถ๋ถ
- Fabric ๊ฐ์ ์
- Shadow Thread์์ ์๋ก์ด Shadow Tree๋ฅผ ๊ณ์ฐํ๋ ๋ก์ง์ C++ ๋ก์ง์ผ๋ก ๋ณํ ๊ฐ๋ฅํ๋๋ก ์์
- onLayout, onMeasure๋ฑ View์ ์์น, ์ฌ์ด์ฆ๋ฑ์ ๊ณ์ฐํ๋ ๋ก์ง์ ๋น๋๊ธฐ์์ ๋๊ธฐ ํจ์๋ก ๋ณํ ํ๊ธฐ ๋๋ฌธ์ ๋ง์ ํผํฌ๋จผ์ค ์ด๋
4.2 Turbo NativeModule
- Turbo NativeModules
- ๊ธฐ์กด Architecture์์๋ NativeModule๋ก ์ฌ์ฉ๋๋ ๊ฒ
- Bridge๊ฐ ์ฌ๋ผ์ง๊ฒ ๋๋ฉด์ ์ถ๊ฐ๋จ
- Turbo NativeModules ์ฅ์
- Platform ์ ๋ฐ์ ์ผ๋ก Typecheck๊ฐ ์๋จ
- ํ๋ซํผ ๋ณ ์ฝ๋ ๊ณต์ ๊ฐ ์ฌ์ (C++๋ก ์์ฑ๋ ์ฝ๋๋ฅผ ๊ณต์ )
- Native Module Lazy Loading์ด ์ ์ฉ๋จ
Lazy Loading: ์ต์ด์ ๋ชจ๋ ๋ฆฌ์์ค๋ฅผ ๋ก๋ ํ๋๊ฒ์ด ์๋, ํ์ ํ ๋ ๋ก๋ํ๋ ๋ฐฉ์.- (์ต์ด ๋ก๋์ ๋ถํ๋ฅผ ์ค์ด๊ธฐ ์ํจ)
- JSI ์ฌ์ฉ์ผ๋ก ์ธํ์ฌ Native์ Javascript์ฝ๋๊ฐ ํต์ ์ด ํจ์จ์
- JSON Object๋ก ๋ณํ ์์ด C++ ์ฝ๋๋ง์ผ๋ก ํต์ ๊ฐ๋ฅ
4.3 CodeGen
- CodeGen
- 3rd-party library์์ ์ ๊ณต๋๋ ์ฝ๋๋ฅผ ์ธํฐํ์ด์ค์ ๋ง๊ฒ ์์ฑํ๋ฉด
- JSI ๊ด๋ จ ์ฝ๋๋ค์ ๋ง๋ค์ด ์ฃผ๋๊ฒ
- ํ๋ก์ ํธ๋ฅผ ๋น๋ ํ ๋ ์๋์ผ๋ก ์คํ (๋น๋ ์๊ฐ์ ์ํฅ)
- New Architecture
- 2022๋ ๋ง ํ์ฌ, ์์ง๊น์ง๋ ์คํ์ ์ธ ๋ถ๋ถ๋ค์ด ๋ง์
- ์์ ํ ๋ ๋ค ์ ์ ๋ฆด๋ฆฌ์ฆ ์์
5. Hermes
- Facebook์์ ๋ง๋ javascript Engine
- Bytecode ํํ๋ก ๋ฏธ๋ฆฌ ์ปดํ์ผ ํ์ฌ ์ ์ฅ ํด ๋ ๋ค ์ฌ์ฉ
- [Hermes Announcement]
- ์ฑ ์ต์ด ๋ก๋ฉ์ jsbundle ํ์ผ์ ์ฝ์ด์ ๋์ ๊ฐ๋ฅํ javascript๋ก compile ํ๊ฒ ๋จ
- ์ด ๊ณผ์ ์ด ๋๋ต 4์ด(Android ๊ธฐ์ค) ์ ๋ ๊ฑธ๋ฆฌ๋๊ฒ์ผ๋ก ํ์ ๋จ
- ์ฑ ๋น๋ ์๊ฐ์ parse์ compile๋ฑ ํ์ํ ์์ ์ ๋น๋ ํ ๋ ํ๋๋ก ํจ
- Bytecodeํํ๋ก ๋ฏธ๋ฆฌ ์ปดํ์ผ ํด๋๋ฉด ์คํ๋ง ์ํค๋ฉด ๋๊ธฐ ๋๋ฌธ
- ๋๋ค๋ฅธ ์ฅ์
- ์ฌ์ฉํ๋ Memory์ ๊ฐ์ (๊ธฐ์กด 185mb -> 136mb)
- AAB / APK ํฌ๊ธฐ ๊ฐ์ (๊ธฐ์กด 41mb -> 22mb)
- ์ ์ฉ ๋์ด์๋์ง ํ์ธ
- Hermes์ ์ฅ์ ์ ์จ์ ํ ๋ณด๊ธฐ ์ํด์๋ release build Type์ผ๋ก ํ์ธ
6. Wrap-up
์ฌ์ฉํ๋ Thread
Main Thread: ์ค์ ๋ก UI๋ค์ด ๊ทธ๋ ค์ง๋ threadJavascript Thread: JS๊ฐ ๋์ํ๋ threadNativeModule Thread: Native Module ๋์์ ์ํ threadShadow Thread: virtalDOM์ ์ค์ ๋ฐ์ํ ํ๋ฉด์ผ๋ก ๋ณํ ํ๋ thread
Bridge
- Javascript์ Native๊ฐ ํต์ ์ ํ ์ ์๋๋ก ๋์์ฃผ๋๊ฒ
- JSON์ผ๋ก ๋ค์ด์์ JSON์ผ๋ก ๋ค์ ๋๊ฒจ์ฃผ๊ฒ ๋์ด์์
New Architecture: Bridge๋ฅผ ํตํด Native Module๊ณผ Javascript ๋ก์ง๊ฐ ํต์Hermes: ์ฑ ๋น๋ ์๊ฐ์ parse์ compile๋ฑ ํ์ํ ์์ ์ ๋น๋ ํ ๋ ํ๋๋ก ํจ
7. react-native-reanimated
- React-Native์์ Animation์ Frame drop ์์ด ์ฌ์ฉ๊ฐ๋ฅ ํ๋๋ก ๋ง๋ ํจํค์ง
- React-Native Animated๊ฐ ๊ฐ์ง๊ณ ์๋ ๋จ์ (๋ณ๋ชฉ ํ์)์ ํด๊ฒฐ
- react-native-reanimated
- animation ๊ด๋ จ๋ ์์ ์ ๋ชจ๋ Main Thread์์ ์คํ
- worklet์ ์ด์ฉํ์ฌ JS Thread๋ก ์ ๋ฌ
7.1 worklet, shared values
worklet: ์์ ์กฐ๊ฐ์ javascript ์กฐ๊ฐ- ๋ทฐ ์์ฑ์ ์ ๋ฐ์ดํธ ํ๊ฑฐ๋, ์ด๋ฒคํธ์ ๋ฐ์ํ ๋ UI Thread์์ ๋ฐ๋ก ์คํ ์ํฌ ์ ์๋ JS ์กฐ๊ฐ
- worklet ์์ฑ๋ฐฉ๋ฒ
- ํจ์ ์๋จ์ worklet์ด๋ผ๋ string์ ์ถ๊ฐ
- SharedValues
- JS Thread์ Main Thread ๋ชจ๋์์ ์ฝ๊ธฐ ๋๋ ์์ ์ด ๊ฐ๋ฅ ํ ๊ฐ
- Main Thread์์๋ ๊ฐ์ด ๋ณ๊ฒฝ๋จ์ ๋ฐ๋ก ๊ฐ์ง ํ ์ ์์ด ์ฝ๊ธฐ์ ํนํ๋จ
8. FCM
- Push Notification ์ด๋ ?
- ์๋ฒ์์ ์ค์น๋ ์ฑ์ ๋ฉ์์ง๋ฅผ ์ ๋ฌํ๊ณ , ์ฑ์์ ์ ๋ฌ๋ ๋ฉ์์ง๋ฅผ ๋ณด์ฌ์ฃผ๋๊ฒ
Push: Message๋ฅผ ์ ๋ฌ ํ๋ ๊ฒNotification: Message๋ฅผ ๋ณด์ฌ ์ฃผ๋ ๊ฒ
8.1 Push Notification ์ข ๋ฅ
- Data Message
- ๋ฐ์ดํฐ๋ง ์ ๋ฌ ํด์ฃผ๋ ํธ์
- Notification์ ๋ณ๋๋ก ๋์ฐ์ง ์์
- ์ฑ์ ์ค์น ์ฌ๋ถ ๋๋ ๋ฐ์ดํฐ์ ๊ฐฑ์ ์ด ํ์ ํ ๋ ์ฌ์ฉ
- Notification Message
- ์ค์ ๋ก ์ ์ ์๊ฒ ๋ฉ์์ง์ ํจ๊ป ์๋ ค์ฃผ๋ ๊ฒ
- ๋จ์ ๊ด๊ณ ์ฑ ๋ฉ์์ง, ์ฑํ ๋ฉ์์ง ์์ ๋ฑ์์ ์ฃผ๋ก ์ฌ์ฉ
9. Jest
9.1 Mocking
- ๊ฐ์ง ๋ฐ์ดํฐ๋ฅผ ๋ง๋ค์ด ์ฌ์ฉํ๋๊ฒ
- e.g.) HTTP ์์ฒญ์ ํน์ ๊ฐ์ Response๋ก ์ง์
9.2 without Mocking
- Mocking ์์ด Test๋ฅผ ๋๋ฆฌ๊ฒ ๋๋ค๋ฉด, ์ค์ ๋ก ์๋ฒ๋ก ์์ฒญ์ด ๊ฐ๊ฒ ๋จ
- ์ธ์ฆ์ด ํ์ ์๋ API๋ ๋ฌธ์ ์์ด ๋์
- ์ธ์ฆ์ด ํ์ ํ API๋ ์์ฒญ ์คํจ๋ก ์ธํ failed
- ์ธ์ฆ์ด ํ์ํ API์, ์๋ API๋ฅผ ๊ตฌ๋ถํ์ฌ ๊ฐ๊ฐ ์ํฉ์ ๋ง๊ฒ ํธ์ถ
- ํ ์คํธ๋ฅผ ์ํด ์ฑ๊ฒจ์ผ ํ ๊ฒ ๋๋ฌด ๋ง์
- Native Module์ Native API๋ฅผ ์ฌ์ฉ ํ๊ฒ ๋์ด์์
- Jest๋ ํธ๋ํฐ์ด ์๋ Local PC ํ๊ฒฝ์์ ์คํ ๋จ
- Native API (์์น, ์นด๋ฉ๋ผ ๋ฑ)๋ฅผ ์ฌ์ฉํ๋ ๊ฒฝ์ฐ์๋ ๋ฌด์กฐ๊ฑด failed ์ฒ๋ฆฌ
9.3 with Mocking
- ์๋ต๊ฐ์ ๋ณ๊ฐ๋ก ์ ์ธํ์ฌ ๋ฐ๊ธฐ ๋๋ฌธ์ ์ธ์ฆ์ฌ๋ถ์ ์๊ด์์ด ์ฌ์ฉ๊ฐ๋ฅ
- API ์์ฒญ์, ์ฑ๊ณต ๋๋ ์คํจ์์ ๋ํ ์๋ต๊ฐ ์ ์ ๊ฐ๋ฅ
- Native API ํธ์ถ์์๋ ๋๋๋ ค ๋ฐ๋ ๊ฐ์ ์ ์ ๊ฐ๋ฅ
9.4 spyOn
- ๋ชฐ๋ ์ ๋ณด๋ฅผ ๋นผ๋ด์ค๋ ๊ธฐ๋ฅ
- ํจ์๊ฐ ํธ์ถ ๋ ๋ ์ด๋ค ๊ฐ๊ณผ ํจ๊ป ํธ์ถ๋์๋์ง ํ์ ๊ฐ๋ฅ
10. Storybook
- UI ์ปดํฌ๋ํธ๋ค์ ์ํ ๋ณ๋ก ๋ณผ ์ ์๋๋ก ๋์์ฃผ๋ ๋๊ตฌ
- ์ํ๋ฅผ ์ ์ด๋ฅผ ํ๋ฉฐ ๋ง๊ฒ ๋ ๋๋๋์ง ์๊ฐ์ ์ผ๋ก ํ์ธ ๊ฐ๋ฅ
- react-native๋ฟ๋ง ์๋๊ณ Frontend ์ ๋ฐ์ ์ผ๋ก ์ฌ์ฉ๋๋ ๋๊ตฌ
- ๋์
์ ๊ฐ์ฅ ํฐ ๊ณ ๋ฏผ Point
- ๋ชจ๋ ์ฑ์ ๊ธฐ๋ฅ๋ค์ ์ ๋ถ ๋๋ ค๋ณด์ง ์๋ ์ด์ ๋ชจ๋ ์ํ๋ฅผ ํ์ธํ๋๊ฒ์ ์ฌ์ค์ ๋ถ๊ฐ๋ฅ
- ๋์
๊ฒฐ์ ์ ์ด์
- ๋์์ธ ์์คํ ์ ์ฉ์ ํ๊ธฐ ์ํด์ ๋์ ์ ํด๋ณด๊ณ ์ research
- ๋์์ด๋์ ๊ฐ๋ฐ์๊ฐ ๊ฐ์ ์ปดํฌ๋ํธ์ ์ํ๋ฅผ ๋ฐ๋ผ๋ณด๊ณ ์ ๊ฒฐ์
- Story ?
- UI ์ปดํฌ๋ํธ ํ๋์ ๋ํ ์ํ๋ฅผ ๋ณด์ฌ์ฃผ๋๊ฒ
- Component์ Story๋ 1:N์ ๊ด๊ณ
- ์ฃผ์ Add-on #1
- @storybook/addon-ondevice-knobs
- props ์ ์ด๋ฅผ ํตํด์ ์ํ๋ฅผ ๋ฐ๊ฟ ๋ณผ ์ ์๋๋ก ๋์์ฃผ๋ addon
- ์ฃผ์ Add-on #2
- @storybook/addon-ondevice-notes
- ์ค๋ช ์ ์ถ๊ฐ ํ ์ ์๋๋ก ๋์์ฃผ๋ addon