2026๋…„ React Native ์ƒˆ๋กœ์šด ์•„ํ‚คํ…์ฒ˜: Hermes V1, ๋ธŒ๋ฆฟ์ง€๋ฆฌ์Šค ๋ชจ๋“œ์™€ ๋ฉด์ ‘ ์งˆ๋ฌธ

React Native ์ƒˆ๋กœ์šด ์•„ํ‚คํ…์ฒ˜ ์‹ฌ์ธต ๋ถ„์„. Hermes V1 ์—”์ง„, ๋ธŒ๋ฆฟ์ง€๋ฆฌ์Šค ๋ชจ๋“œ, TurboModules, Fabric ๋ Œ๋”๋Ÿฌ์˜ ๊ธฐ์ˆ ์  ์„ธ๋ถ€์‚ฌํ•ญ, ์„ฑ๋Šฅ ๋ฒค์น˜๋งˆํฌ, ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜ ๊ฐ€์ด๋“œ, ๊ธฐ์ˆ  ๋ฉด์ ‘ Q&A๋ฅผ ํฌํ•จํ•ฉ๋‹ˆ๋‹ค.

React Native ์ƒˆ๋กœ์šด ์•„ํ‚คํ…์ฒ˜: Hermes V1, Fabric, TurboModules, ๋ธŒ๋ฆฟ์ง€๋ฆฌ์Šค ๋ชจ๋“œ ๊ธฐ์ˆ  ํ•ด์„ค

React Native์˜ ์ƒˆ๋กœ์šด ์•„ํ‚คํ…์ฒ˜๋Š” 2026๋…„์— ์™„์ „ํ•œ ์„ฑ์ˆ™๊ธฐ์— ๋„๋‹ฌํ–ˆ์Šต๋‹ˆ๋‹ค. React Native 0.84์—์„œ Hermes V1์ด ๊ธฐ๋ณธ ์—”์ง„์œผ๋กœ ์ฑ„ํƒ๋˜์—ˆ๊ณ , 0.85์—์„œ๋Š” ๋ ˆ๊ฑฐ์‹œ ๋ธŒ๋ฆฟ์ง€์˜ ๋ชจ๋“  ํ”์ ์ด ์ œ๊ฑฐ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ๊ฐœ๋ฐœ์ž๋Š” ์•„ํ‚คํ…์ฒ˜ ํ”Œ๋ž˜๊ทธ๋‚˜ ํ˜ธํ™˜์„ฑ ๋ ˆ์ด์–ด๋ฅผ ์‹ ๊ฒฝ ์“ธ ํ•„์š” ์—†์ด ๋„ค์ดํ‹ฐ๋ธŒ์— ๊ทผ์ ‘ํ•œ ์„ฑ๋Šฅ์„ ์–ป์„ ์ˆ˜ ์žˆ๊ฒŒ ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

์ƒˆ๋กœ์šด ์•„ํ‚คํ…์ฒ˜(Fabric + TurboModules + ๋ธŒ๋ฆฟ์ง€๋ฆฌ์Šค ๋ชจ๋“œ + Hermes V1)๋Š” ๋” ์ด์ƒ ์„ ํƒ ์‚ฌํ•ญ์ด ์•„๋‹™๋‹ˆ๋‹ค. React Native 0.84 ์ดํ›„์˜ ๋ชจ๋“  ํ”„๋กœ์ ํŠธ์—์„œ ๊ธฐ๋ณธ์œผ๋กœ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค. ๊ธฐ์กด ์ฝ”๋“œ๋ฒ ์ด์Šค์—์„œ ๋ ˆ๊ฑฐ์‹œ ๋ธŒ๋ฆฟ์ง€ ์ฝ”๋“œ๋ฅผ ์ œ๊ฑฐํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

React Native ์•„ํ‚คํ…์ฒ˜ ์Šคํƒ์˜ ๋ณ€ํ™”

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

| ๋ ˆ์ด์–ด | ๊ธฐ์กด ์•„ํ‚คํ…์ฒ˜ | ์ƒˆ๋กœ์šด ์•„ํ‚คํ…์ฒ˜ | |--------|-------------|----------------| | JS ์—”์ง„ | JavaScriptCore | Hermes V1 (๋ฐ”์ดํŠธ์ฝ”๋“œ + JIT) | | ๋ Œ๋”๋Ÿฌ | Paper (๋น„๋™๊ธฐ ๋ธŒ๋ฆฟ์ง€) | Fabric (๋™๊ธฐ, ๊ณต์œ  C++) | | ๋„ค์ดํ‹ฐ๋ธŒ ๋ชจ๋“ˆ | ๋ธŒ๋ฆฟ์ง€ ๋ชจ๋“ˆ (JSON ์ง๋ ฌํ™”) | TurboModules (JSI, ์ง์ ‘ ํ˜ธ์ถœ) | | ํ†ต์‹  | ๋น„๋™๊ธฐ JSON ๋ธŒ๋ฆฟ์ง€ | JSI (JavaScript Interface) | | ์ดˆ๊ธฐํ™” | ๋ธŒ๋ฆฟ์ง€ ์ดˆ๊ธฐํ™” + ๋ชจ๋“ˆ ๋“ฑ๋ก | ๋ธŒ๋ฆฟ์ง€๋ฆฌ์Šค (์ง€์—ฐ, ์˜จ๋””๋งจ๋“œ) |

JSI(JavaScript Interface)๊ฐ€ ์ด ๋ชจ๋“  ๊ฒƒ์˜ ๊ธฐ๋ฐ˜์ž…๋‹ˆ๋‹ค. ๋ชจ๋“  ํ˜ธ์ถœ์„ JSON์œผ๋กœ ์ง๋ ฌํ™”ํ•˜์—ฌ ํ์— ์ „๋‹ฌํ•˜๋Š” ๋Œ€์‹ , JSI๋Š” C++ ํ˜ธ์ŠคํŠธ ๊ฐ์ฒด๋ฅผ JavaScript์— ์ง์ ‘ ๋…ธ์ถœํ•ฉ๋‹ˆ๋‹ค. ์ด์ „์—๋Š” JSON ์ธ์ฝ”๋”ฉ, ๋ธŒ๋ฆฟ์ง€ ํ์ž‰, JSON ๋””์ฝ”๋”ฉ์ด ํ•„์š”ํ–ˆ๋˜ TurboModule ํ˜ธ์ถœ์ด ์ด์ œ๋Š” ์ง์ ‘์ ์ธ ํ•จ์ˆ˜ ํ˜ธ์ถœ๋กœ ์™„๋ฃŒ๋ฉ๋‹ˆ๋‹ค.

Hermes V1: ๊ธฐ๋ณธ JavaScript ์—”์ง„

Hermes V1์€ 2026๋…„ 2์›”์— ์ถœ์‹œ๋œ React Native 0.84์—์„œ ๊ธฐ๋ณธ ์—”์ง„์ด ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ ์ด์ „ Hermes ๋ฒ„์ „์˜ ์ ์ง„์  ์—…๋ฐ์ดํŠธ๊ฐ€ ์•„๋‹ˆ๋ผ ์ปดํŒŒ์ผ๋Ÿฌ์™€ VM์˜ ์™„์ „ํ•œ ์žฌ์ž‘์„ฑ์ž…๋‹ˆ๋‹ค.

๊ฐœ์„  ์‚ฌํ•ญ์€ ๋„ค ๊ฐ€์ง€ ์˜์—ญ์— ๊ฑธ์ณ ์žˆ์Šต๋‹ˆ๋‹ค. ์ƒˆ๋กœ์šด ๋ฐ”์ดํŠธ์ฝ”๋“œ ํ˜•์‹์„ ๊ฐ–์ถ˜ ์žฌ์ž‘์„ฑ๋œ ์ปดํŒŒ์ผ๋Ÿฌ, ๊ฐœ์„ ๋œ JIT ์ปดํŒŒ์ผ๋Ÿฌ, Hades ๋™์‹œ ๊ฐ€๋น„์ง€ ์ปฌ๋ ‰ํ„ฐ, ๊ทธ๋ฆฌ๊ณ  React 19์—์„œ ์‚ฌ์šฉ๋˜๋Š” ์ตœ์‹  JavaScript ํŒจํ„ด์— ๋Œ€ํ•œ ํ–ฅ์ƒ๋œ ์ง€์›์ž…๋‹ˆ๋‹ค.

HermesV1Benchmarks.jsjavascript
// Comparing startup and runtime metrics

// Hermes V1 bytecode is pre-compiled at build time
// No parse-compile step at runtime = faster cold starts

// Cold start comparison (production build, Pixel 8):
// Hermes V1:  ~850ms TTI
// JSC:        ~1200ms TTI  (29% slower)

// Memory footprint (complex app, 50+ screens):
// Hermes V1:  ~45MB baseline
// JSC:        ~72MB baseline (38% more)

// GC pause comparison (FlatList, 500+ complex cells):
// Hermes V1 (Hades):  <12ms max pause
// Old Hermes:         ~45ms occasional pauses
// Result: zero dropped frames in scroll benchmarks

๋™์‹œ ๊ฐ€๋น„์ง€ ์ปฌ๋ ‰ํ„ฐ์ธ Hades๋Š” ํŠน๋ณ„ํ•œ ์ฃผ๋ชฉ์„ ๋ฐ›์„ ๋งŒํ•ฉ๋‹ˆ๋‹ค. ์ด์ „ Hermes ๋ฒ„์ „์€ stop-the-world ๋ฐฉ์‹์˜ GC๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋ฆฌ์ŠคํŠธ ์Šคํฌ๋กค ์ค‘์— ๊ฐ„ํ—์ ์œผ๋กœ ๋ˆˆ์— ๋ณด์ด๋Š” ๋Š๊น€์„ ์œ ๋ฐœํ–ˆ์Šต๋‹ˆ๋‹ค. Hades๋Š” ๋ฐฑ๊ทธ๋ผ์šด๋“œ ์Šค๋ ˆ๋“œ์—์„œ ๋™์‹œ์— ์ปฌ๋ ‰์…˜์„ ์‹คํ–‰ํ•˜์—ฌ GC ์ผ์‹œ ์ •์ง€๋ฅผ 12ms ๋ฏธ๋งŒ์œผ๋กœ ์œ ์ง€ํ•ฉ๋‹ˆ๋‹ค. ๋ณต์žกํ•œ ์…€์„ ๊ฐ€์ง„ ๊ธด ๋ฆฌ์ŠคํŠธ๋ฅผ ๋ Œ๋”๋งํ•˜๋Š” ์•ฑ์—์„œ JavaScript ์ธก ํ”„๋ ˆ์ž„ ๋“œ๋กญ์˜ ๋งˆ์ง€๋ง‰ ์›์ธ์„ ์ œ๊ฑฐํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

Hermes V1์€ React Native 0.84์—์„œ WebAssembly ์ง€์›๋„ ๋„์ž…ํ–ˆ์Šต๋‹ˆ๋‹ค. Rust, C, C++๋กœ ์ž‘์„ฑ๋œ ์„ฑ๋Šฅ ํฌ๋ฆฌํ‹ฐ์ปฌ ์ฝ”๋“œ๋ฅผ WASM์œผ๋กœ ์ปดํŒŒ์ผํ•˜์—ฌ ์•ฑ ๋‚ด์—์„œ ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ, ํ”Œ๋žซํผ๋ณ„ ๋ฐ”์ธ๋”ฉ์„ ์ž‘์„ฑํ•˜์ง€ ์•Š๊ณ ๋„ ๋””๋ฐ”์ด์Šค ์ƒ์˜ AI ์ถ”๋ก , ๊ณ ๋ฐ€๋„ ์ˆ˜์น˜ ์—ฐ์‚ฐ, ๊ธฐ์กด ๋„ค์ดํ‹ฐ๋ธŒ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์˜ ์žฌ์‚ฌ์šฉ์ด ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค.

Fabric ๋ Œ๋”๋Ÿฌ: ๋™๊ธฐ ๋ ˆ์ด์•„์›ƒ๊ณผ ๋ Œ๋”๋ง

Fabric์€ iOS์™€ Android์—์„œ ๊ณต์œ ํ•˜๋Š” C++ ์ฝ”์–ด๋ฅผ ๊ฐ€์ง„ ๋ Œ๋”๋Ÿฌ๋กœ Paper๋ฅผ ๋Œ€์ฒดํ•ฉ๋‹ˆ๋‹ค. ํ•ต์‹ฌ์ ์ธ ์ฐจ์ด์ ์€ ๋ ˆ์ด์•„์›ƒ ๊ณ„์‚ฐ์ด ๋ธŒ๋ฆฟ์ง€๋ฅผ ํ†ตํ•ด ๋น„๋™๊ธฐ์ ์œผ๋กœ ์ˆ˜ํ–‰๋˜๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๋ผ JavaScript ์Šค๋ ˆ๋“œ์—์„œ ๋™๊ธฐ์ ์œผ๋กœ ์‹คํ–‰๋œ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

์ด ๋™๊ธฐ ๋ชจ๋ธ์€ Paper์—์„œ๋Š” ๋ถˆ๊ฐ€๋Šฅํ–ˆ๋˜ ๋‘ ๊ฐ€์ง€ ๊ธฐ๋Šฅ์„ ๊ฐ€๋Šฅํ•˜๊ฒŒ ํ•ฉ๋‹ˆ๋‹ค.

  1. ๋™์‹œ ๋ Œ๋”๋ง ์ง€์›: Fabric์€ React 19์˜ ๋™์‹œ ๊ธฐ๋Šฅ๊ณผ ํ†ตํ•ฉ๋ฉ๋‹ˆ๋‹ค. Fabric์ด ๋ Œ๋”๋ง์„ ์ค‘๋‹จํ•˜๊ณ  ์žฌ๊ฐœํ•  ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์— Transitions, Suspense ๊ฒฝ๊ณ„, useTransition์ด ์˜ฌ๋ฐ”๋ฅด๊ฒŒ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค.

  2. ์ง์ ‘ C++ ๋ ˆ์ด์•„์›ƒ: Yoga(๋ ˆ์ด์•„์›ƒ ์—”์ง„)๊ฐ€ JavaScript ๋Ÿฐํƒ€์ž„๊ณผ ๋™์ผํ•œ ๋ฉ”๋ชจ๋ฆฌ ๊ณต๊ฐ„์—์„œ ์‹คํ–‰๋ฉ๋‹ˆ๋‹ค. ํ”Œ๋ ‰์Šค๋ฐ•์Šค ๊ณ„์‚ฐ์— ๋Œ€ํ•œ ์ง๋ ฌํ™” ์˜ค๋ฒ„ํ—ค๋“œ๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค.

FabricConcurrentExample.tsxtypescript
// Concurrent features work correctly with Fabric
import React, { useState, useTransition } from 'react'
import { View, Text, FlatList, TextInput, StyleSheet } from 'react-native'

type Item = { id: string; name: string; category: string }

function SearchableList({ items }: { items: Item[] }) {
  const [query, setQuery] = useState('')
  const [filtered, setFiltered] = useState(items)
  const [isPending, startTransition] = useTransition()

  const handleSearch = (text: string) => {
    setQuery(text) // Urgent: update input immediately
    startTransition(() => {
      // Non-urgent: filter can be deferred
      const result = items.filter(item =>
        item.name.toLowerCase().includes(text.toLowerCase())
      )
      setFiltered(result)
    })
  }

  return (
    <View style={styles.container}>
      <TextInput
        value={query}
        onChangeText={handleSearch}
        placeholder="Search items..."
        style={styles.input}
      />
      {isPending && <Text style={styles.pending}>Filtering...</Text>}
      <FlatList
        data={filtered}
        keyExtractor={item => item.id}
        renderItem={({ item }) => (
          <View style={styles.row}>
            <Text>{item.name}</Text>
          </View>
        )}
      />
    </View>
  )
}

const styles = StyleSheet.create({
  container: { flex: 1, padding: 16 },
  input: { borderWidth: 1, borderColor: '#ccc', padding: 12, marginBottom: 8 },
  pending: { color: '#888', marginBottom: 4 },
  row: { padding: 12, borderBottomWidth: 1, borderBottomColor: '#eee' },
})

์ด ์˜ˆ์ œ์˜ useTransition ํ›…์€ Fabric์ด ์ค‘์š”ํ•œ ์ด์œ ๋ฅผ ๋ณด์—ฌ์ค๋‹ˆ๋‹ค. Paper์—์„œ๋Š” ๋ Œ๋”๋Ÿฌ๊ฐ€ ์ง„ํ–‰ ์ค‘์ธ ๋ Œ๋”๋ง์„ ์ค‘๋‹จํ•  ์ˆ˜ ์—†์—ˆ๊ธฐ ๋•Œ๋ฌธ์— startTransition์ด ์•„๋ฌด๋Ÿฐ ํšจ๊ณผ๊ฐ€ ์—†์—ˆ์Šต๋‹ˆ๋‹ค. Fabric์˜ React 19 ๋™์‹œ ๋ชจ๋“œ์™€์˜ ํ†ตํ•ฉ์œผ๋กœ ์ง€์—ฐ ์—…๋ฐ์ดํŠธ๊ฐ€ ์„ค๊ณ„๋œ ๋Œ€๋กœ ์ž‘๋™ํ•˜๋ฉฐ, ๋ฐฑ๊ทธ๋ผ์šด๋“œ์—์„œ ์ˆ˜์ฒœ ๊ฐœ์˜ ํ•ญ๋ชฉ์„ ํ•„ํ„ฐ๋งํ•˜๋ฉด์„œ๋„ ํ…์ŠคํŠธ ์ž…๋ ฅ์˜ ์‘๋‹ต์„ฑ์ด ์œ ์ง€๋ฉ๋‹ˆ๋‹ค.

TurboModules์™€ JSI: ์ง๋ ฌํ™” ์˜ค๋ฒ„ํ—ค๋“œ ์ œ๊ฑฐ

TurboModules๋Š” ๊ธฐ์กด์˜ NativeModules ์‹œ์Šคํ…œ์„ ๋Œ€์ฒดํ•ฉ๋‹ˆ๋‹ค. ์„ฑ๋Šฅ ์ฐจ์ด๋Š” JSON ์ง๋ ฌํ™”์˜ ์™„์ „ํ•œ ์ œ๊ฑฐ์—์„œ ๋น„๋กฏ๋ฉ๋‹ˆ๋‹ค. ๋ธŒ๋ฆฟ์ง€ ๋ชจ๋“ˆ ํ˜ธ์ถœ์€ ๋‹ค์Œ ๊ฒฝ๋กœ๋ฅผ ๋”ฐ๋ž์Šต๋‹ˆ๋‹ค: JS ๊ฐ์ฒด โ†’ JSON.stringify โ†’ ๋ธŒ๋ฆฟ์ง€ ํ โ†’ JSON.parse โ†’ ๋„ค์ดํ‹ฐ๋ธŒ ํ˜ธ์ถœ โ†’ JSON.stringify โ†’ ๋ธŒ๋ฆฟ์ง€ ํ โ†’ JSON.parse โ†’ JS ์ฝœ๋ฐฑ. TurboModule ํ˜ธ์ถœ์€ JSI๋ฅผ ํ†ตํ•œ ์ง์ ‘์ ์ธ C++ ํ•จ์ˆ˜ ํ˜ธ์ถœ์ž…๋‹ˆ๋‹ค.

NativeDeviceInfo.tstypescript
// TurboModule spec using the Codegen
import type { TurboModule } from 'react-native'
import { TurboModuleRegistry } from 'react-native'

export interface Spec extends TurboModule {
  // Synchronous: returns immediately, no bridge round-trip
  getDeviceModel(): string
  getOSVersion(): string
  getBatteryLevel(): number

  // Asynchronous: for operations that genuinely need async
  getStorageUsage(): Promise<{ used: number; total: number }>
}

export default TurboModuleRegistry.getEnforcing<Spec>('DeviceInfo')
DeviceInfoModule.ktkotlin
// Native Android implementation of the TurboModule
package com.app.modules

import com.facebook.react.bridge.ReactApplicationContext
import com.facebook.react.bridge.ReadableMap
import com.facebook.react.bridge.WritableNativeMap
import com.facebook.react.module.annotations.ReactModule

@ReactModule(name = "DeviceInfo")
class DeviceInfoModule(reactContext: ReactApplicationContext) :
  NativeDeviceInfoSpec(reactContext) {

  // Synchronous via JSI - no bridge, no JSON, no queue
  override fun getDeviceModel(): String {
    return android.os.Build.MODEL
  }

  override fun getOSVersion(): String {
    return "Android ${android.os.Build.VERSION.RELEASE}"
  }

  override fun getBatteryLevel(): Double {
    val manager = reactApplicationContext
      .getSystemService(android.content.Context.BATTERY_SERVICE)
      as android.os.BatteryManager
    return manager.getIntProperty(
      android.os.BatteryManager.BATTERY_PROPERTY_CAPACITY
    ).toDouble()
  }

  override fun getStorageUsage(
    promise: com.facebook.react.bridge.Promise
  ) {
    val stat = android.os.StatFs(
      android.os.Environment.getDataDirectory().path
    )
    val map = WritableNativeMap().apply {
      putDouble("used", (stat.totalBytes - stat.availableBytes).toDouble())
      putDouble("total", stat.totalBytes.toDouble())
    }
    promise.resolve(map)
  }

  override fun getName(): String = "DeviceInfo"
}

ํ•ต์‹ฌ ์‚ฌํ•ญ์€ getDeviceModel(), getOSVersion(), getBatteryLevel()์ด ๋™๊ธฐ์ ์ด๋ผ๋Š” ์ ์ž…๋‹ˆ๋‹ค. JavaScript ์Šค๋ ˆ๋“œ๊ฐ€ ๋„ค์ดํ‹ฐ๋ธŒ ์ฝ”๋“œ๋ฅผ ์ง์ ‘ ํ˜ธ์ถœํ•˜๊ณ  ๋™์ผํ•œ ํ‹ฑ์—์„œ ๋ฐ˜ํ™˜ ๊ฐ’์„ ๋ฐ›์Šต๋‹ˆ๋‹ค. Promise๋„ ์ฝœ๋ฐฑ๋„ ๋ธŒ๋ฆฟ์ง€ ์™•๋ณต๋„ ์—†์Šต๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ JSI์— ์˜ํ•ด์„œ๋งŒ ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค.

๋ธŒ๋ฆฟ์ง€๋ฆฌ์Šค ๋ชจ๋“œ: ๋ฌด์—‡์ด ์ œ๊ฑฐ๋˜์—ˆ๊ณ  ์™œ ์ค‘์š”ํ•œ๊ฐ€

๋ธŒ๋ฆฟ์ง€๋ฆฌ์Šค ๋ชจ๋“œ๋Š” React Native 0.73์—์„œ ๋„์ž…๋˜์–ด 0.74์—์„œ ๊ธฐ๋ณธ๊ฐ’์ด ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. Fabric๊ณผ TurboModules๊ฐ€ ์ฑ„ํƒ๋œ ํ›„์—๋„ ๊ธฐ์กด ๋ธŒ๋ฆฟ์ง€๋Š” ๊ธ€๋กœ๋ฒŒ ์ด๋ฒคํŠธ ์ด๋ฏธํ„ฐ, ํƒ€์ด๋จธ, ์—๋Ÿฌ ํ•ธ๋“ค๋ง์„ ์ฒ˜๋ฆฌํ•˜๊ธฐ ์œ„ํ•ด ์‹œ์ž‘ ์‹œ ์ดˆ๊ธฐํ™”๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ๋ธŒ๋ฆฟ์ง€๋ฆฌ์Šค ๋ชจ๋“œ๋Š” ์ด๋Ÿฌํ•œ ๋‚˜๋จธ์ง€ ์‹œ์Šคํ…œ์„ JSI ๊ธฐ๋ฐ˜ ๊ตฌํ˜„์œผ๋กœ ์ด์ „ํ•ฉ๋‹ˆ๋‹ค.

์‹ค์งˆ์ ์ธ ์˜ํ–ฅ์€ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

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

React Native 0.82์—์„œ ๊ธฐ์กด ๋ธŒ๋ฆฟ์ง€๊ฐ€ ์˜๊ตฌ์ ์œผ๋กœ ๋น„ํ™œ์„ฑํ™”๋˜์—ˆ์Šต๋‹ˆ๋‹ค. 2026๋…„ 4์›”์— ์ถœ์‹œ๋œ React Native 0.85์—์„œ๋Š” ๋ธŒ๋ฆฟ์ง€ ๊ด€๋ จ ๋ชจ๋“  ์ฝ”๋“œ๊ฐ€ ์ฝ”๋“œ๋ฒ ์ด์Šค์—์„œ ์ œ๊ฑฐ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ํด๋ฐฑ ๊ฒฝ๋กœ๋Š” ์กด์žฌํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

ํ”„๋กœ๋•์…˜ ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜: ์‹ค์ œ ์„ฑ๋Šฅ ๋ฒค์น˜๋งˆํฌ

๊ธฐ์กด ์•„ํ‚คํ…์ฒ˜์—์„œ ์ƒˆ๋กœ์šด ์•„ํ‚คํ…์ฒ˜๋กœ์˜ ํ”„๋กœ๋•์…˜ ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜์€ ์ฃผ์š” ๋ฉ”ํŠธ๋ฆญ์—์„œ ์ผ๊ด€๋œ ๊ฐœ์„ ์„ ๋ณด์—ฌ์ค๋‹ˆ๋‹ค.

| ๋ฉ”ํŠธ๋ฆญ | ๊ธฐ์กด ์•„ํ‚คํ…์ฒ˜ | ์ƒˆ๋กœ์šด ์•„ํ‚คํ…์ฒ˜ | ๊ฐœ์„  | |--------|-------------|----------------|------| | ์ฝœ๋“œ ์Šคํƒ€ํŠธ (TTI) | 1.4์ดˆ | 0.8์ดˆ | 43% ํ–ฅ์ƒ | | ํ™”๋ฉด ์ „ํ™˜ | 180ms | 110ms | 39% ํ–ฅ์ƒ | | ๋ฉ”๋ชจ๋ฆฌ ๊ธฐ์ค€์„  | 89MB | 66MB | 26% ๊ฐ์†Œ | | JSโ†’๋„ค์ดํ‹ฐ๋ธŒ ํ˜ธ์ถœ | ~5ms (๋น„๋™๊ธฐ) | ~0.1ms (๋™๊ธฐ) | 40๋ฐฐ ํ–ฅ์ƒ | | GC ์ตœ๋Œ€ ์ผ์‹œ ์ •์ง€ | 45ms | 12ms | 73% ๋‹จ์ถ• | | FlatList ์Šคํฌ๋กค (1000๊ฐœ ํ•ญ๋ชฉ) | ๊ฐ„ํ—์  ๋Š๊น€ | ๋ถ€๋“œ๋Ÿฌ์šด 60fps | ํ”„๋ ˆ์ž„ ๋“œ๋กญ ์—†์Œ |

์‚ฌ์šฉ์ž ๋Œ€๋ฉด ํ’ˆ์งˆ์— ๊ฐ€์žฅ ํฐ ์˜ํ–ฅ์„ ๋ฏธ์น˜๋Š” ๊ฐœ์„ ์€ GC ์ผ์‹œ ์ •์ง€์˜ ๋‹จ์ถ•์ž…๋‹ˆ๋‹ค. Hades๋Š” ์ปฌ๋ ‰์…˜ ์ผ์‹œ ์ •์ง€๋ฅผ 1ํ”„๋ ˆ์ž„ ์˜ˆ์‚ฐ(60fps์—์„œ 16.6ms) ๋ฏธ๋งŒ์œผ๋กœ ์œ ์ง€ํ•˜์—ฌ, ๋ณต์žกํ•œ React Native ์•ฑ์—์„œ ๊ฐ€์žฅ ํ”ํ•œ ๋ˆˆ์— ๋ณด์ด๋Š” ๋Š๊น€์˜ ์›์ธ์„ ์ œ๊ฑฐํ•ฉ๋‹ˆ๋‹ค.

2026๋…„ ์ƒํƒœ๊ณ„ ํ˜ธํ™˜์„ฑ

์ƒํƒœ๊ณ„๋Š” ์ƒˆ๋กœ์šด ์•„ํ‚คํ…์ฒ˜์— ์™„์ „ํžˆ ์ˆ˜๋ ดํ–ˆ์Šต๋‹ˆ๋‹ค. Expo SDK 55 ์ดํ›„ ๋ฒ„์ „์€ ์ƒˆ๋กœ์šด ์•„ํ‚คํ…์ฒ˜์—์„œ๋งŒ ์‹คํ–‰๋˜๋ฉฐ, ๋น„ํ™œ์„ฑํ™” ์˜ต์…˜์ด ์—†์Šต๋‹ˆ๋‹ค. ์ฃผ์š” ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ํ˜ธํ™˜์„ฑ์€ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

  • React Navigation 7.2 ์ด์ƒ: ๋„ค์ดํ‹ฐ๋ธŒ ์Šคํƒ ์Šคํฌ๋ฆฐ์„ ํฌํ•จํ•œ ์™„์ „ํ•œ Fabric ์ง€์›
  • Reanimated 3.5 ์ด์ƒ: React Native 0.85์™€ ๊ณต์œ  ์• ๋‹ˆ๋ฉ”์ด์…˜ ๋ฐฑ์—”๋“œ
  • Gesture Handler 2.16 ์ด์ƒ: JSI ๊ธฐ๋ฐ˜ ์ง์ ‘ ์ œ์Šค์ฒ˜ ์ธ์‹
  • Vision Camera 4.0 ์ด์ƒ: JSI๋ฅผ ํ†ตํ•œ ํ”„๋ ˆ์ž„ ์ฒ˜๋ฆฌ
  • Detox: ์ƒˆ๋กœ์šด ์•„ํ‚คํ…์ฒ˜ ํ˜ธํ™˜ E2E ํ…Œ์ŠคํŠธ

Expo๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ํŒ€์˜ ๊ฒฝ์šฐ, npx create-expo-app์€ ์ƒˆ๋กœ์šด ์•„ํ‚คํ…์ฒ˜๊ฐ€ ๊ธฐ๋ณธ์œผ๋กœ ํ™œ์„ฑํ™”๋œ ํ”„๋กœ์ ํŠธ๋ฅผ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค. ๋ณ„๋„์˜ ์„ค์ •์ด ํ•„์š”ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

React Native 0.75 ์ดํ•˜ ๋ฒ„์ „์˜ ์•ฑ์€ ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜์ด ํ•„์ˆ˜์ž…๋‹ˆ๋‹ค. ๊ธฐ์กด ๋ธŒ๋ฆฟ์ง€๋Š” 0.82 ์ด์ƒ์—์„œ ์˜๊ตฌ์ ์œผ๋กœ ์ œ๊ฑฐ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. TurboModule spec ์—†์ด NativeModules๋ฅผ ์ง์ ‘ ์‚ฌ์šฉํ•˜๋Š” ์„œ๋“œํŒŒํ‹ฐ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋Š” ์—…๋ฐ์ดํŠธ๊ฐ€ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.

๊ธฐ์ˆ  ๋ฉด์ ‘ ์งˆ๋ฌธ: React Native ์ƒˆ๋กœ์šด ์•„ํ‚คํ…์ฒ˜

๋‹ค์Œ ์งˆ๋ฌธ๋“ค์€ 2026๋…„ ์‹œ๋‹ˆ์–ด React Native ๋ฉด์ ‘์—์„œ ์ž์ฃผ ์ถœ์ œ๋ฉ๋‹ˆ๋‹ค. ๊ฐ ๋‹ต๋ณ€์€ ์Šคํƒœํ”„/์‹œ๋‹ˆ์–ด ๋ ˆ๋ฒจ์—์„œ ๊ธฐ๋Œ€๋˜๋Š” ๊นŠ์ด๋ฅผ ๋‹ค๋ฃจ๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

Q1: ๊ธฐ์กด ๋ธŒ๋ฆฟ์ง€์™€ JSI์˜ ์ฐจ์ด๋ฅผ ์„ค๋ช…ํ•˜์‹ญ์‹œ์˜ค. JSI๊ฐ€ ๋™๊ธฐ์  ๋„ค์ดํ‹ฐ๋ธŒ ํ˜ธ์ถœ์„ ๊ฐ€๋Šฅํ•˜๊ฒŒ ํ•˜๋Š” ์ด์œ ๋Š” ๋ฌด์—‡์ž…๋‹ˆ๊นŒ?

๋ธŒ๋ฆฟ์ง€๋Š” JS์—์„œ ๋„ค์ดํ‹ฐ๋ธŒ๋กœ์˜ ๋ชจ๋“  ๋ฉ”์‹œ์ง€๋ฅผ JSON์œผ๋กœ ์ง๋ ฌํ™”ํ•˜๊ณ  ๋น„๋™๊ธฐ ํ์— ๋„ฃ์€ ํ›„ ๋„ค์ดํ‹ฐ๋ธŒ ์ธก์—์„œ ์—ญ์ง๋ ฌํ™”ํ–ˆ์Šต๋‹ˆ๋‹ค. JSI(JavaScript Interface)๋Š” C++ ํ˜ธ์ŠคํŠธ ๊ฐ์ฒด๋ฅผ JavaScript VM์— ์ง์ ‘ ๋…ธ์ถœํ•ฉ๋‹ˆ๋‹ค. JSI๋ฅผ ํ†ตํ•ด ๋“ฑ๋ก๋œ ๋„ค์ดํ‹ฐ๋ธŒ ํ•จ์ˆ˜๋Š” ์ง๋ ฌํ™”๋‚˜ ํ์ž‰ ์—†์ด ๋„ค์ดํ‹ฐ๋ธŒ ์ฝ”๋“œ๋ฅผ ์ธ๋ผ์ธ์œผ๋กœ ์‹คํ–‰ํ•˜๋Š” ์ผ๋ฐ˜ JavaScript ํ•จ์ˆ˜๋กœ ๋‚˜ํƒ€๋‚ฉ๋‹ˆ๋‹ค. JSI๋Š” ์ค‘๊ฐ„ ๋ฉ”์‹œ์ง€ ํ ์—†์ด ๋™์ผํ•œ ์Šค๋ ˆ๋“œ ์ปจํ…์ŠคํŠธ์—์„œ ์ž‘๋™ํ•˜๋ฏ€๋กœ ๋™๊ธฐ ํ˜ธ์ถœ์ด ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค.

Q2: Fabric ๋ Œ๋”๋Ÿฌ๋Š” Paper๊ฐ€ ํ•ด๊ฒฐํ•  ์ˆ˜ ์—†์—ˆ๋˜ ์–ด๋–ค ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•ฉ๋‹ˆ๊นŒ?

Paper๋Š” ๋ธŒ๋ฆฟ์ง€๋ฅผ ํ†ตํ•ด ๋น„๋™๊ธฐ์ ์œผ๋กœ ๋ Œ๋”๋งํ•˜์—ฌ React ๋™์‹œ ๊ธฐ๋Šฅ์„ ์ง€์›ํ•˜๋Š” ๊ฒƒ์ด ๋ถˆ๊ฐ€๋Šฅํ–ˆ์Šต๋‹ˆ๋‹ค. Paper๋Š” ์ง„ํ–‰ ์ค‘์ธ ๋ Œ๋” ํŠธ๋ฆฌ๋ฅผ ์ค‘๋‹จํ•  ์ˆ˜ ์—†์—ˆ๊ธฐ ๋•Œ๋ฌธ์— startTransition ํ˜ธ์ถœ์ด ํšจ๊ณผ๊ฐ€ ์—†์—ˆ์Šต๋‹ˆ๋‹ค. Fabric์€ ๊ณต์œ  C++ ์ฝ”๋“œ๋กœ ๋ Œ๋”๋ง์„ ๊ตฌํ˜„ํ•˜๊ณ  React 19์˜ ๋ฆฌ์ปจ์‹ค๋Ÿฌ์™€ ์ง์ ‘ ํ†ตํ•ฉํ•˜์—ฌ ๋™์‹œ ๋ Œ๋”๋ง, Suspense, Transitions๋ฅผ ์ง€์›ํ•ฉ๋‹ˆ๋‹ค. Yoga๋ฅผ ํ†ตํ•œ ๋ ˆ์ด์•„์›ƒ ๊ณ„์‚ฐ๋„ ๋™์ผํ•œ ๋ฉ”๋ชจ๋ฆฌ ๊ณต๊ฐ„์—์„œ ๋™๊ธฐ์ ์œผ๋กœ ์ˆ˜ํ–‰๋˜์–ด ํฌ๋กœ์Šค ๋ธŒ๋ฆฟ์ง€ ๋ ˆ์ด์•„์›ƒ์˜ ์ง€์—ฐ ์‹œ๊ฐ„์ด ์ œ๊ฑฐ๋ฉ๋‹ˆ๋‹ค.

Q3: ์ƒˆ๋กœ์šด ์•„ํ‚คํ…์ฒ˜์— Hermes๊ฐ€ ํ•„์š”ํ•œ ์ด์œ ๋Š” ๋ฌด์—‡์ž…๋‹ˆ๊นŒ? ๋‹ค๋ฅธ ์—”์ง„์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ?

์ƒˆ๋กœ์šด ์•„ํ‚คํ…์ฒ˜๋Š” JSI์— ์˜์กดํ•˜๋ฉฐ, JSI๋Š” JavaScript ์—”์ง„์ด C++ ํ˜ธ์ŠคํŠธ ๊ฐ์ฒด ๋“ฑ๋ก์„ ์ง€์›ํ•  ๊ฒƒ์„ ์š”๊ตฌํ•ฉ๋‹ˆ๋‹ค. Hermes๋Š” ์ฒ˜์Œ๋ถ€ํ„ฐ JSI ํ†ตํ•ฉ์„ ์—ผ๋‘์— ๋‘๊ณ  ์„ค๊ณ„๋˜์—ˆ์Šต๋‹ˆ๋‹ค. JavaScriptCore๋„ ์ด๋ก ์ ์œผ๋กœ JSI๋ฅผ ์ง€์›ํ•  ์ˆ˜ ์žˆ์ง€๋งŒ, ๊ณต์‹ ๊ตฌํ˜„๊ณผ ํ…Œ์ŠคํŠธ๋Š” Hermes๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ๊ตฌ์ถ•๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค. Hermes V1์€ ๋ฐ”์ดํŠธ์ฝ”๋“œ ์‚ฌ์ „ ์ปดํŒŒ์ผ(๋Ÿฐํƒ€์ž„ ํŒŒ์‹ฑ ์ œ๊ฑฐ), Hades ๋™์‹œ GC(12ms ๋ฏธ๋งŒ ์ผ์‹œ ์ •์ง€), WebAssembly ์ง€์›์„ ์ถ”๊ฐ€๋กœ ์ œ๊ณตํ•˜๋ฉฐ, ์ด๋Š” React Native์˜ JSC ํ†ตํ•ฉ์—์„œ๋Š” ์‚ฌ์šฉํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

Q4: TurboModules๋Š” ๊ฐœ๋ฐœ์ž ๊ด€์ ์—์„œ ๊ธฐ์กด NativeModules API์™€ ์–ด๋–ป๊ฒŒ ๋‹ค๋ฆ…๋‹ˆ๊นŒ?

TurboModules๋Š” ๋นŒ๋“œ ์‹œ ํƒ€์ž… ์•ˆ์ „ํ•œ ๋„ค์ดํ‹ฐ๋ธŒ ๋ฐ”์ธ๋”ฉ์„ ์ƒ์„ฑํ•˜๋Š” Codegen spec(TurboModule์„ ํ™•์žฅํ•˜๋Š” TypeScript ์ธํ„ฐํŽ˜์ด์Šค)์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค. ๊ธฐ์กด NativeModules๋Š” ํƒ€์ž… ๊ฒ€์‚ฌ ์—†๋Š” ๋Ÿฐํƒ€์ž„ ๋ฆฌํ”Œ๋ ‰์…˜์„ ์‚ฌ์šฉํ–ˆ์Šต๋‹ˆ๋‹ค. TurboModules๋Š” ๋™๊ธฐ์  ๋ฐ˜ํ™˜ ๊ฐ’(Promise๋ฟ๋งŒ ์•„๋‹ˆ๋ผ), ์ง€์—ฐ ์ดˆ๊ธฐํ™”(๋ชจ๋“ˆ์€ ์ฒ˜์Œ ์ ‘๊ทผ ์‹œ์—๋งŒ ๋กœ๋“œ), JSON ์ง๋ ฌํ™” ์—†๋Š” ์ง์ ‘ JSI ํ˜ธ์ถœ์„ ์ง€์›ํ•ฉ๋‹ˆ๋‹ค. ๊ฐœ๋ฐœ์ž๋Š” TypeScript spec์„ ์ž‘์„ฑํ•˜๊ณ , Codegen์„ ์‹คํ–‰ํ•˜๋ฉฐ, ์ƒ์„ฑ๋œ ๋„ค์ดํ‹ฐ๋ธŒ ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ๊ตฌํ˜„ํ•ฉ๋‹ˆ๋‹ค.

Q5: ๋ธŒ๋ฆฟ์ง€๋ฆฌ์Šค ๋ชจ๋“œ๋ฅผ ์„ค๋ช…ํ•˜๊ณ , Fabric๊ณผ TurboModules๋งŒ ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ์™€ ๋น„๊ตํ•˜์—ฌ ๋ฌด์—‡์ด ์ œ๊ฑฐ๋˜๋Š”์ง€ ์„ค๋ช…ํ•˜์‹ญ์‹œ์˜ค.

Fabric๊ณผ TurboModules๋ฅผ ์ฑ„ํƒํ•œ ํ›„์—๋„ ๊ธฐ์กด ๋ธŒ๋ฆฟ์ง€๋Š” ๊ธ€๋กœ๋ฒŒ ์ด๋ฒคํŠธ ์ด๋ฏธํ„ฐ, ํƒ€์ด๋จธ, ์—๋Ÿฌ ํ•ธ๋“ค๋ง, ๊ธฐํƒ€ ๋Ÿฐํƒ€์ž„ ์ธํ”„๋ผ์ŠคํŠธ๋Ÿญ์ฒ˜๋ฅผ ์ฒ˜๋ฆฌํ•˜๊ธฐ ์œ„ํ•ด ์‹œ์ž‘ ์‹œ ์ดˆ๊ธฐํ™”๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ๋ธŒ๋ฆฟ์ง€๋ฆฌ์Šค ๋ชจ๋“œ๋Š” ์ด๋Ÿฌํ•œ ๋‚˜๋จธ์ง€ ๋ธŒ๋ฆฟ์ง€ ์˜์กด ์‹œ์Šคํ…œ์„ JSI ๊ธฐ๋ฐ˜ ๊ตฌํ˜„์œผ๋กœ ๋Œ€์ฒดํ•ฉ๋‹ˆ๋‹ค. ๋ธŒ๋ฆฟ์ง€ ์ดˆ๊ธฐํ™” ์˜ค๋ฒ„ํ—ค๋“œ๋ฅผ ์ œ๊ฑฐํ•˜๊ณ  ๊ธฐ์ค€์„  ๋ฉ”๋ชจ๋ฆฌ ์‚ฌ์šฉ๋Ÿ‰์„ ์ค„์ด๋ฉฐ ์ „์ฒด ๋Ÿฐํƒ€์ž„์ด JSI๋ฅผ ํ†ตํ•ด ์ž‘๋™ํ•˜๋„๋ก ๋ณด์žฅํ•ฉ๋‹ˆ๋‹ค. React Native 0.85 ์ดํ›„, ๋ธŒ๋ฆฟ์ง€๋ฆฌ์Šค ๋ชจ๋“œ๊ฐ€ ์œ ์ผํ•œ ์ž‘๋™ ๋ชจ๋“œ์ž…๋‹ˆ๋‹ค.

์ด๋Ÿฌํ•œ ์งˆ๋ฌธ์„ ์ž‘๋™ํ•˜๋Š” ์ฝ”๋“œ ์˜ˆ์ œ์™€ ํ•จ๊ป˜ ์—ฐ์Šตํ•˜๋ฉด ๊ฐœ๋…์  ์ดํ•ด์™€ ์‹ค์šฉ์  ๊ธฐ์–ต๋ ฅ ๋ชจ๋‘ ๊ฐ•ํ™”๋ฉ๋‹ˆ๋‹ค.

React Native ๋ฉด์ ‘ ์ค€๋น„๊ฐ€ ๋˜์…จ๋‚˜์š”?

์ธํ„ฐ๋ž™ํ‹ฐ๋ธŒ ์‹œ๋ฎฌ๋ ˆ์ดํ„ฐ, flashcards, ๊ธฐ์ˆ  ํ…Œ์ŠคํŠธ๋กœ ์—ฐ์Šตํ•˜์„ธ์š”.

๊ฒฐ๋ก 

  • Hermes V1์€ React Native 0.84 ์ด์ƒ์—์„œ ์ฝœ๋“œ ์Šคํƒ€ํŠธ 29% ํ–ฅ์ƒ, ๋ฉ”๋ชจ๋ฆฌ 38% ๊ฐ์†Œ, 12ms ๋ฏธ๋งŒ์˜ GC ์ผ์‹œ ์ •์ง€๋ฅผ ๊ธฐ๋ณธ์œผ๋กœ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค
  • Fabric์€ Paper๊ฐ€ ๊ฒฐ์ฝ” ์ง€์›ํ•  ์ˆ˜ ์—†์—ˆ๋˜ React 19 ๋™์‹œ ๊ธฐ๋Šฅ(Transitions, Suspense)์„ ๊ฐ€๋Šฅํ•˜๊ฒŒ ํ•ฉ๋‹ˆ๋‹ค
  • TurboModules๋Š” JSON ์ง๋ ฌํ™”๋ฅผ ์ œ๊ฑฐํ•˜์—ฌ ์ง์ ‘ JSI ํ˜ธ์ถœ์„ ํ†ตํ•ด JSโ†’๋„ค์ดํ‹ฐ๋ธŒ ํ˜ธ์ถœ์„ 40๋ฐฐ ํ–ฅ์ƒ์‹œํ‚ต๋‹ˆ๋‹ค
  • ๋ธŒ๋ฆฟ์ง€๋ฆฌ์Šค ๋ชจ๋“œ๋Š” ๋งˆ์ง€๋ง‰ ๋ธŒ๋ฆฟ์ง€ ์˜์กด์„ฑ์„ ์ œ๊ฑฐํ•˜๋ฉฐ, React Native 0.85์—๋Š” ๋ธŒ๋ฆฟ์ง€ ์ฝ”๋“œ๊ฐ€ ์ „ํ˜€ ๋‚จ์•„ ์žˆ์ง€ ์•Š์Šต๋‹ˆ๋‹ค
  • ์ƒํƒœ๊ณ„๋Š” ์™„์ „ํžˆ ํ˜ธํ™˜๋ฉ๋‹ˆ๋‹ค. Expo SDK 55 ์ด์ƒ, React Navigation 7.2 ์ด์ƒ, Reanimated 3.5 ์ด์ƒ ๋ฐ ๋ชจ๋“  ์ฃผ์š” ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๊ฐ€ ์ƒˆ๋กœ์šด ์•„ํ‚คํ…์ฒ˜๋งŒ์„ ์ง€์›ํ•ฉ๋‹ˆ๋‹ค
  • ๋ฉด์ ‘ ์ค€๋น„๋Š” JSI ๋ฉ”์ปค๋‹ˆ์ฆ˜, Fabric๊ณผ Paper์˜ ํŠธ๋ ˆ์ด๋“œ์˜คํ”„, TurboModule Codegen ์›Œํฌํ”Œ๋กœ์šฐ, ๋ธŒ๋ฆฟ์ง€๋ฆฌ์Šค ๋ชจ๋“œ ๋Ÿฐํƒ€์ž„ ๋ณ€๊ฒฝ ์‚ฌํ•ญ์— ์ง‘์ค‘ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค

ํƒœ๊ทธ

#react-native
#hermes
#new-architecture
#turbomodules
#fabric
#bridgeless

๊ณต์œ 

๊ด€๋ จ ๊ธฐ์‚ฌ

React Native TypeScript ํƒ€์ž… ์•ˆ์ „ ์•„ํ‚คํ…์ฒ˜์™€ ์ฝ”๋“œ, ๋ชจ๋ฐ”์ผ ๋””๋ฐ”์ด์Šค

React Native์™€ TypeScript 2026: ํƒ€์ž… ์•ˆ์ „ํ•œ ์•„ํ‚คํ…์ฒ˜์™€ ๋ฉด์ ‘ ์งˆ๋ฌธ

2026๋…„ React Native์—์„œ TypeScript๋ฅผ ํ™œ์šฉํ•œ ํƒ€์ž… ์•ˆ์ „ ์•„ํ‚คํ…์ฒ˜๋ฅผ ๋‹ค๋ฃน๋‹ˆ๋‹ค. Codegen, TurboModules, Strict TypeScript API, ํƒ€์ž… ์•ˆ์ „ ๋‚ด๋น„๊ฒŒ์ด์…˜, ๋ฉด์ ‘ ์งˆ๋ฌธ์„ ์ฝ”๋“œ ์˜ˆ์ œ์™€ ํ•จ๊ป˜ ์„ค๋ช…ํ•ฉ๋‹ˆ๋‹ค.

React Native 0.85 ์ƒˆ๋กœ์šด ๊ธฐ๋Šฅ: ์• ๋‹ˆ๋ฉ”์ด์…˜ ๋ฐฑ์—”๋“œ์™€ TypeScript API

React Native 0.85 (2026): ์ƒˆ๋กœ์šด ์• ๋‹ˆ๋ฉ”์ด์…˜ ๋ฐฑ์—”๋“œ, ์—„๊ฒฉํ•œ TypeScript API ๋ฐ ๋ฉด์ ‘ ์งˆ๋ฌธ

React Native 0.85์˜ ๊ณต์œ  ์• ๋‹ˆ๋ฉ”์ด์…˜ ๋ฐฑ์—”๋“œ, ํฌ์ŠคํŠธ ๋ธŒ๋ฆฌ์ง€ ์•„ํ‚คํ…์ฒ˜, Metro TLS์— ๋Œ€ํ•ด ์ฝ”๋“œ ์˜ˆ์ œ์™€ ๋ฉด์ ‘ ์งˆ๋ฌธ์„ ํ†ตํ•ด ์‹ฌ์ธต ๋ถ„์„ํ•ฉ๋‹ˆ๋‹ค.

React Native ๋ชจ๋ฐ”์ผ ์•ฑ์„ ์œ„ํ•œ Expo Router ํŒŒ์ผ ๊ธฐ๋ฐ˜ ๋‚ด๋น„๊ฒŒ์ด์…˜ ์‹œ์Šคํ…œ

Expo Router๋กœ ๋ฐฐ์šฐ๋Š” React Native ํŒŒ์ผ ๊ธฐ๋ฐ˜ ๋‚ด๋น„๊ฒŒ์ด์…˜ ์™„๋ฒฝ ๊ฐ€์ด๋“œ

Expo Router๋ฅผ ํ™œ์šฉํ•œ React Native ํŒŒ์ผ ๊ธฐ๋ฐ˜ ๋ผ์šฐํŒ…์„ ์ฒด๊ณ„์ ์œผ๋กœ ๋‹ค๋ฃน๋‹ˆ๋‹ค. ๋ ˆ์ด์•„์›ƒ, ๋™์  ๋ผ์šฐํŠธ, ํƒ€์ž… ์•ˆ์ „ ๋‚ด๋น„๊ฒŒ์ด์…˜, ํƒญ, ๋ชจ๋‹ฌ, ๋ฏธ๋“ค์›จ์–ด ๋“ฑ 2026๋…„ ์ตœ์‹  ํŒจํ„ด์„ ์ข…ํ•ฉ์ ์œผ๋กœ ์„ค๋ช…ํ•ฉ๋‹ˆ๋‹ค.