๐ React Native ๋ฆฌ์กํธ ๋ค์ดํฐ๋ธ
2023-09-06 13:21
U-Mobile-React-Native, ๋ชจ๋ฐ์ผ ํ๋ก๊ทธ๋๋ฐ ๊ณผ๋ชฉ ๊ธ ๊ณ์น
๋ชฉํ : ๋ฆฌ์กํธ ๋ค์ดํฐ๋ธ๋ ๋ฌด์์ธ๊ฐ?
React Native = React + Native
๐ซ React ๋ฆฌ์กํธ
Frontend Web Framework ํ๋ก ํธ์๋ ์น ํ๋ ์์ํฌ
By META (Facebook)
ํน์ง : Virtual DOM, JSX (JavaScript XML)
๐ซ React Native ๋ฆฌ์กํธ ๋ค์ดํฐ๋ธ
React + Native
React๋ก Web์ ๋ง๋ค๋ ๋ฐฉ์์ผ๋ก, ๋ชจ๋ฐ์ผ ์ฑ ๊ฐ๋ฐ
โ Web ๊ฐ๋ฐ์๊ฐ Native ์ธ์ด ์์ด, ๋ชจ๋ฐ์ผ ์ฑ ๊ฐ๋ฐ
โ Web ๊ฐ๋ฐํ๊ณ ์ ํ๋ค๋ฉด ๊ฐ๋ฅ
@ Like Unity UI Element
@ Web ๋ฐฉ์์ผ๋ก Unity UI ๋ค๋ฃจ๊ธฐ
React Native = Native Part + JS Part
โ Native Part : ๊ธฐ๋ณธ ์ ๊ณต ๋ชจ๋ ๊ทธ๋๋ก ์ฌ์ฉ
โ JS Part : ์ฃผ๋ก ๊ฐ๋ฐํ๋ ํํธ
DHTML์ด๊ณ , Bridge ๋ฐฉ์์ผ๋ก ๋์
@ Native ๋ค์ดํฐ๋ธ (in Mobile App Dev)
@ โ OS์ ๊ฐ์ ์ธ์ด๋ก ๋ง๋ค์ด์ง ~
@ โ i.e. Android - Java, iOS - Objective C
@ Cross Platform ํฌ๋ก์ค ํ๋ซํผ
@ โ ํ ์ธ์ด/์ฝ๋๋ก ์ฌ๋ฌ ํ๋ซํผ์ ํ ๋ฒ์
@ โ i.e. React-Native - Android, iOS
์คํ ์๋ : Native > Cross Platform
๊ฐ๋ฐ ์๋ (์์ฐ์ฑ) : Native < Cross Platform
๐ซ React vs React-Native, Renderer Packages
ํ๋ ์์ํฌ : ๋ ๋๋ฌ ํจํค์ง
โ React : React-DOM (DOM ๋ ๋๋ฌ)
โ ReactNative : React-Native ๋ ๋๋ฌ (๋ค์ดํฐ๋ธ ๋ ๋๋ฌ)
React ํจํค์ง (App ์ปดํฌ๋ํธ)
React, ReactNative ํ๋ ์์ํฌ ๋ ๋ค ์ฌ์ฉํ๋
App.tsx โ Virtual DOM ๊ตฌ์กฐ
React-Native ํจํค์ง (๋ค์ดํฐ๋ธ ๋ ๋๋ฌ)
๋ฆฌ์กํธ ์์ (Virtual DOM ๊ตฌ์กฐ?) โ Android/iOS(UIKit)ํ๋ ์์ํฌ ํ๋ฉด UI ๊ฐ์ฒด
React, ๋ชจ๋ ๊ฒ์ด JS๋ก ๋์
React.render (DOM ๋ ๋๋ฌ)์ ๋์์ ํ์ธ ๊ฐ๋ฅ
๋ฐ๋ฉด ReactNative,
๋ค์ดํฐ๋ธ ๋ ๋๋ฌ ๋ชจ์ต ํ์ธ ๋ถ๊ฐ๋ฅ
์ Why, ReactNative ํ๋ก์ ํธ์ Android/iOS ๋๋ ํฐ๋ฆฌ์ ์๋ Java/Objective-C NativeModule์์ ๋ ๋๋ง ์งํ
@ ๋ญ์๋ฆฌ์ง
NativeModule ์์๋ JavaScriptCore ๋ผ๋ ์ด๋ฆ์ JS ์์ง์ด ๋์
C++๋ก ๊ตฌํ๋ ์ด ์์ง์ Android-JNI Java Native Interface/iOS-FFI Foreign Function Interface ๋ฐฉ์์ผ๋ก ์ฐ๊ฒฐ๋์ด ๋์
Library == Engine
(์ผ๋ฐ์ ์ผ๋ก, ์ฝ๋ ๋ง์ Library == Engine)
๐ซ Bridge ๋ฐฉ์
โ JS ์ฝ๋๊ฐ ๋ค์ดํฐ๋ธ API๋ฅผ ํธ์ถํ๋๋ก ์ฐ๊ฒฐ
Web Browser์ JS ์์ง ๋ถ๋ถ๋ง ๋ผ์ด๋ด์ด,
JS ์ฝ๋๋ก ๊ตฌํ๋ โViewโ Class๋ฅผ,
Connect !
Android์ โVIewโ Class (Java),
iOS์ UIKit Framework์ โViewโ Class (Objective-C)
ReactNative App์ Mobile ๊ธฐ๊ธฐ์ ์ค์น ํ ์คํํ๋ฉด,
ReactNative์ NativeModule์ด ์คํ๋๋ฉด์,
2๊ฐ์ ์ค๋ ๋๊ฐ ๋์์ ๋์
UI Thread : ๋ค์ดํฐ๋ธ ๋ด๋น (Android Framework/iOS UIKit Framework ์ชฝ ๋ ๋๋ง)
JS Engine Thread : App.tsx์ ๊ฐ์ JS ์ฝ๋๋ฅผ ์คํ
Bridge Framework
๋ ์ค๋ ๋๋,
Message Queue ๋ฐฉ์์ผ๋ก ์๋ก ๋ ๋๋ง๊ฐ ๊ด๋ จ๋ ๋ฐ์ดํฐ๋ฅผ ์ฃผ๊ณ ๋ฐ์
I.E. ์ฌ์ฉ์๊ฐ ํ๋ฉด์ ํฐ์นํ๋ฉด,
UI Thread โ JS Engine Thread (Event - ํ๋ฉด ํฐ์น)
= Bridge Framework
@ TODO : Thread
Single Thread ๋จ์ผ : JS
Multi Thread ๋ค์ค : Java, Objective-C, React Native
ReactNative ์ ์ ํจํค์ง
ํญ์ UI(Native ์ชฝ) Thread์ JS Thread๊ฐ ๋ฐ๋ก ์์
๋ ๋ค ์ค์น๋์ด ์์ด์ผ ํจ
npx react-native link
npx pod-install
โ UI(Native ์ชฝ) Thread ๋ถ๋ถ ์ค์น
๐ซ ๊ฐ๋ฐ ํ๊ฒฝ
JavaScript : ๋์จํ ํ์
TypeScript : ๊ฐํ ํ์
(JavaScript + ๊ฐํ ํ์
) (๊ถ์ฅ)
Node.js ๊ฐ๋ฐ ํ๊ฒฝ๊ณผ ๊ฐ์
โ Node.js : ์๋ฒ ์ฌ์ด๋ ํ๊ฒฝ์์ ์คํ๋๋ JS
๋น๋, ์ ๋ฎฌ๋ ์ดํฐ
Android Studio : Windows, Mac, Linux
Xcode : Only Mac
@ Windows ๋ง์ผ๋ก๋ iOS ๊ฐ๋ฐ ๋ชปํจ
@ โ Cross Platform ๋ง์?
๐ซ Hello World
React.createElement
Hello World!
์ถ๋ ฅํ๊ธฐ
in HTML
1
2
<!-- Web Browser๊ฐ Rendering -->
<p>Hello World!<p>
in JS
1
2
3
4
5
6
// 1. Physical DOM ๊ฐ์ฒด ์์ฑ
const pElement = document.createElement('p')
pElement.innerText = 'Hello JavaScript world!'
// 2. Rendering
document.body.appendChild(pElement)
in React
1
2
3
4
5
6
// 1. Virtual DOM ๊ฐ์ฒด ์์ฑ
const pElement = React.createElement('p', null, 'Hello React world!')
// 2. Physical DOM ๊ฐ์ฒด๋ก ๋ณํ, Rendering
import ReactDOM from 'react-dom'
ReactDOM.render(pElement, document.body)
in ReactNative
1
2
3
4
5
6
7
8
9
// 2. Native๋ก Virtual DOM ๊ฐ์ฒด ์ ๋ฌ
// ReactNative Renderer๋ Native์์ ๋์ํ๋ฏ๋ก
export default function App()
{
// 1. Virtual DOM ๊ฐ์ฒด ์์ฑ
const textElement = React.createElement(Text, null, 'Hello world!')
return textElement
}
๐ซ Else
// 3.
react-native-cli
NativeModule์์ ๋์ํ๋ JS Engine์ด Virtual DOM ๊ฐ์ฒด๋ฅผ ๋๊ฒจ์ฃผ๋ App์ ์กด์ฌ๋ฅผ ์ ์ ์๋๋ก index.js ํ์ผ ์์ฑ
1
2
3
4
5
import {AppRegistry} from 'react-native'
import App from './App'
import {name as appName} from './app.json'
AppRegistry.registerComponent(appName, () => App)
NativeModule์์ ๋์ํ๋ JS Engine์ด index.js ํ์ผ์ ์กด์ฌ๋ฅผ ์ ์ ์๋๋ก MainApplication.java ํ์ผ ์์ฑ
1
2
3
4
5
6
7
// ...
@Override
protected String getJSMainModuleName()
{
return "index"
};
// ...
ReactNative App์ด Modile ๊ธฐ๊ธฐ์์ ์คํ๋๋ฉด
- MainApplication.java ์คํ โ index.js ํ์ผ ์กด์ฌ ํ์ธ
- App ์กด์ฌ ํ์ธ
- App์ ํธ์ถํ์ฌ Virtual DOM ๊ฐ์ฒด Get
- Bridge๋ฅผ ํตํด โHello Worldโ ์ถ๋ ฅ
iOS๋ ์ธ์ด์ ์ฝ๋ ๊ตฌ์กฐ๋ง ๋ค๋ฅผ ๋ฟ Android์ ๊ฐ์ ๋ฐฉ์์ผ๋ก ๋์
@ TODO 56p
JS.map = C#.ForEach
React (Native) Component ๊ธฐ๋ณธ ์์ฑ
key, children, ref
Each child in a list should have a unique โkeyโ
โ key = (React ์์) Component ๋ ๋๋ง ์๋ ์ต์ ํ๋ฅผ ์ํด ํ์ํ ์์ฑ
UUID Universally Unique Identifier ๋ฒ์ฉ ๊ณ ์ ์๋ณ์
โ ๋คํธ์ํฌ ์นด๋์ MAC, ํธ์ถ ์๊ฐ ๋ฑ์ผ๋ก ์กฐํฉ = ์ค๋ณต X
@ TS ํจ์ ๊ดํธ ์์ด ๋ถ๋ฅผ ์ ์๋๊ฑด๊ฐ?
@ High-Order Function - ๊ณ ์ฐจํจ์ : ๋ค๋ฅธ ํจ์๋ฅผ ์ธ์๋ก ๋ฐ๊ฑฐ๋, ๋ฐํํ๋ ํจ์