ํฌ์ŠคํŠธ

๐ŸŒ’ 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 ๊ธฐ๊ธฐ์—์„œ ์‹คํ–‰๋˜๋ฉด

  1. MainApplication.java ์‹คํ–‰ โ†’ index.js ํŒŒ์ผ ์กด์žฌ ํ™•์ธ
  2. App ์กด์žฌ ํ™•์ธ
  3. App์„ ํ˜ธ์ถœํ•˜์—ฌ Virtual DOM ๊ฐ์ฒด Get
  4. 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 - ๊ณ ์ฐจํ•จ์ˆ˜ : ๋‹ค๋ฅธ ํ•จ์ˆ˜๋ฅผ ์ธ์ž๋กœ ๋ฐ›๊ฑฐ๋‚˜, ๋ฐ˜ํ™˜ํ•˜๋Š” ํ•จ์ˆ˜

์ด ๊ธฐ์‚ฌ๋Š” ์ €์ž‘๊ถŒ์ž์˜ CC BY 4.0 ๋ผ์ด์„ผ์Šค๋ฅผ ๋”ฐ๋ฆ…๋‹ˆ๋‹ค.