React Native 0.84์˜ Hermes V1: ์„ฑ๋Šฅ ์ตœ์ ํ™”, ํ”„๋ฆฌ์ปดํŒŒ์ผ ๋ฐ”์ดํŠธ์ฝ”๋“œ, ๊ธฐ์ˆ  ๋ฉด์ ‘ ๊ฐ€์ด๋“œ

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

React Native 0.84์—์„œ Hermes V1์˜ ์„ฑ๋Šฅ ์ตœ์ ํ™”

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

ํ•ต์‹ฌ ์„ฑ๋Šฅ ๊ฐœ์„  ์‚ฌํ•ญ

Hermes V1์€ ๋นŒ๋“œ ํƒ€์ž„ ๋ฐ”์ดํŠธ์ฝ”๋“œ ์ปดํŒŒ์ผ์„ ํ†ตํ•ด Time to Interactive(TTI)๋ฅผ 25~50% ๋‹จ์ถ•ํ•ฉ๋‹ˆ๋‹ค. ๋Ÿฐํƒ€์ž„ JavaScript ํŒŒ์‹ฑ์„ ์ œ๊ฑฐํ•˜๊ณ , JavaScriptCore ๋Œ€๋น„ ๋ฉ”๋ชจ๋ฆฌ ์‚ฌ์šฉ๋Ÿ‰์„ 10~30% ๊ฐ์†Œ์‹œํ‚ต๋‹ˆ๋‹ค.

๋ฐ”์ดํŠธ์ฝ”๋“œ ํ”„๋ฆฌ์ปดํŒŒ์ผ๋กœ ์‹œ์ž‘ ์˜ค๋ฒ„ํ—ค๋“œ ์ œ๊ฑฐํ•˜๊ธฐ

JavaScriptCore(JSC)๋‚˜ V8๊ณผ ๊ฐ™์€ ๊ธฐ์กด JavaScript ์—”์ง„์€ ๋‹ค๋‹จ๊ณ„ ์‹คํ–‰ ํŒŒ์ดํ”„๋ผ์ธ์„ ๋”ฐ๋ฆ…๋‹ˆ๋‹ค. ์†Œ์Šค ์ฝ”๋“œ๋ฅผ ํŒŒ์‹ฑํ•˜๊ณ , ์ถ”์ƒ ๊ตฌ๋ฌธ ํŠธ๋ฆฌ(AST)๋ฅผ ์ƒ์„ฑํ•˜๊ณ , ๋ฐ”์ดํŠธ์ฝ”๋“œ๋กœ ์ปดํŒŒ์ผํ•œ ๋‹ค์Œ, ๋Ÿฐํƒ€์ž„์— ํ•ซ ๊ฒฝ๋กœ๋ฅผ ์ตœ์ ํ™”ํ•ฉ๋‹ˆ๋‹ค. Hermes๋Š” ์ด ์ ‘๊ทผ ๋ฐฉ์‹์„ ๊ทผ๋ณธ์ ์œผ๋กœ ๋ณ€๊ฒฝํ•˜์—ฌ ์ปดํŒŒ์ผ์„ ๋นŒ๋“œ ํƒ€์ž„์œผ๋กœ ์ด๋™์‹œ์ผฐ์Šต๋‹ˆ๋‹ค.

React Native ๋นŒ๋“œ ํ”„๋กœ์„ธ์Šค์—์„œ Metro ๋ฒˆ๋“ค๋Ÿฌ๊ฐ€ JavaScript ๋ฒˆ๋“ค์„ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค. ๊ทธ ํ›„ Hermes ์ปดํŒŒ์ผ๋Ÿฌ(hermesc)๊ฐ€ ์ด ๋ฒˆ๋“ค์„ ์ตœ์ ํ™”๋œ ๋ฐ”์ดํŠธ์ฝ”๋“œ๋กœ ๋ณ€ํ™˜ํ•˜์—ฌ .hbc ํŒŒ์ผ๋กœ ์ €์žฅํ•ฉ๋‹ˆ๋‹ค. ๋Ÿฐํƒ€์ž„์—๋Š” ์—”์ง„์ด ํ”„๋ฆฌ์ปดํŒŒ์ผ๋œ ๋ฐ”์ดํŠธ์ฝ”๋“œ๋ฅผ ์ง์ ‘ ๋กœ๋“œํ•˜๋ฏ€๋กœ ํŒŒ์‹ฑ, AST ์ƒ์„ฑ, JIT ์›œ์—… ์ง€์—ฐ์ด ๋ฐœ์ƒํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

metro.config.js - Hermes bytecode compilation configurationjavascript
const { getDefaultConfig } = require('@react-native/metro-config');

const config = getDefaultConfig(__dirname);

// Hermes bytecode compilation is automatic in 0.84+
// The transformer handles .hbc generation during build
module.exports = {
  ...config,
  transformer: {
    ...config.transformer,
    // hermesParser is now the default
    hermesParser: true,
    // Inline requires reduce initial bundle evaluation time
    inlineRequires: true,
  },
};

.hbc ํŒŒ์ผ์€ mmap()์„ ์‚ฌ์šฉํ•˜์—ฌ ํ”„๋กœ์„ธ์Šค ์ฃผ์†Œ ๊ณต๊ฐ„์— ์ง์ ‘ ๋ฉ”๋ชจ๋ฆฌ ๋งคํ•‘๋ฉ๋‹ˆ๋‹ค. ์ด๋ฅผ ํ†ตํ•ด ๋ฉ”๋ชจ๋ฆฌ ์••๋ฐ• ์ƒํ™ฉ์—์„œ ์šด์˜ ์ฒด์ œ๊ฐ€ ์‚ฌ์šฉํ•˜์ง€ ์•Š๋Š” ๋ฐ”์ดํŠธ์ฝ”๋“œ ์„ธ๊ทธ๋จผํŠธ๋ฅผ ํŽ˜์ด์ง€ ์•„์›ƒํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ, Hermes๊ฐ€ JavaScript ์†Œ์Šค๋ฅผ ๋‹ค์‹œ ํŒŒ์‹ฑํ•  ํ•„์š”๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค. ๋ฉ”๋ชจ๋ฆฌ๊ฐ€ ์ œํ•œ๋œ ๊ธฐ๊ธฐ์—์„œ๋Š” ํฐ ๋ฒˆ๋“ค์„ ์‚ฌ์šฉํ•˜๋Š” JSC์—์„œ ๋ฐœ์ƒํ•˜๋˜ ๋ฉ”๋ชจ๋ฆฌ ๋ถ€์กฑ ํฌ๋ž˜์‹œ๋ฅผ ๋ฐฉ์ง€ํ•ฉ๋‹ˆ๋‹ค.

Hades: ๋™์‹œ์„ฑ ๊ฐ€๋น„์ง€ ์ปฌ๋ ‰ํ„ฐ ์•„ํ‚คํ…์ฒ˜

Hermes V1์€ ์‹ฑ๊ธ€ ์Šค๋ ˆ๋“œ GenGC๋ฅผ ๋Œ€์ฒดํ•˜๋Š” ๋Œ€๋ถ€๋ถ„ ๋™์‹œ์„ฑ์œผ๋กœ ๋™์ž‘ํ•˜๋Š” ์„ธ๋Œ€๋ณ„ ๊ฐ€๋น„์ง€ ์ปฌ๋ ‰ํ„ฐ์ธ Hades๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. Hades ๋‚ด๋ถ€ ๊ตฌ์กฐ๋ฅผ ์ดํ•ดํ•˜๋Š” ๊ฒƒ์€ ๋ฉ”๋ชจ๋ฆฌ ๋ฌธ์ œ ๋””๋ฒ„๊น…๊ณผ ์‹œ๋‹ˆ์–ด ๋ ˆ๋ฒจ ๊ธฐ์ˆ  ๋ฉด์ ‘ ์งˆ๋ฌธ์— ๋‹ต๋ณ€ํ•˜๋Š” ๋ฐ ํ•„์ˆ˜์ ์ž…๋‹ˆ๋‹ค.

GenGC๋Š” ๋ชจ๋“  ๊ฐ€๋น„์ง€ ์ปฌ๋ ‰์…˜ ์ž‘์—…์„ ๋ฉ”์ธ ์Šค๋ ˆ๋“œ์—์„œ ์ˆ˜ํ–‰ํ–ˆ๊ธฐ ๋•Œ๋ฌธ์— ๋ˆˆ์— ๋„๋Š” UI ๋ฒ„๋ฒ…๊ฑฐ๋ฆผ์„ ์œ ๋ฐœํ–ˆ์Šต๋‹ˆ๋‹ค. Facebook for Android์™€ ๊ฐ™์€ ๋ณต์žกํ•œ ์•ฑ์—์„œ GenGC ์ผ์‹œ ์ •์ง€๋Š” ํ‰๊ท  200ms์˜€์œผ๋ฉฐ, p99 ์ง€์—ฐ ์‹œ๊ฐ„์€ 1.4์ดˆ์— ๋‹ฌํ–ˆ๊ณ , ์ €์‚ฌ์–‘ ๊ธฐ๊ธฐ์—์„œ๋Š” 7์ดˆ๊นŒ์ง€ ์น˜์†Ÿ๊ธฐ๋„ ํ–ˆ์Šต๋‹ˆ๋‹ค.

Hades๋Š” ์ปฌ๋ ‰์…˜ ์ž‘์—…์˜ ๋Œ€๋ถ€๋ถ„์„ ๋ฐฑ๊ทธ๋ผ์šด๋“œ ์Šค๋ ˆ๋“œ์—์„œ JavaScript ์‹คํ–‰๊ณผ ๋™์‹œ์— ์ˆ˜ํ–‰ํ•˜์—ฌ ์ด ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•ฉ๋‹ˆ๋‹ค. ์ปฌ๋ ‰ํ„ฐ๋Š” ์˜ฌ๋“œ ์ œ๋„ˆ๋ ˆ์ด์…˜์— ๋Œ€ํ•ด ์Šค๋ƒ…์ƒท ์•ณ ๋” ๋น„๊ธฐ๋‹(snapshot-at-the-beginning) ๋งˆํฌ ์Šค์œ• ์ „๋žต์„ ์‚ฌ์šฉํ•˜๊ณ , ์˜ ์ œ๋„ˆ๋ ˆ์ด์…˜์— ๋Œ€ํ•ด์„œ๋Š” ์„ธ๋ฏธ์ŠคํŽ˜์ด์Šค ๋ณต์‚ฌ ์ „๋žต์„ ์œ ์ง€ํ•ฉ๋‹ˆ๋‹ค.

javascript
// Understanding allocation patterns that work well with Hades
// Short-lived objects in the young generation are collected quickly

function renderProductList(products) {
  // Temporary array - young generation, fast collection
  const mapped = products.map(product => ({
    id: product.id,
    display: `${product.name} - $${product.price}`,
  }));
  
  return mapped;
}

// Avoid patterns that defeat generational GC
// Don't cache large objects unnecessarily - they promote to old gen
const expensiveCache = {}; // Old generation - less frequent collection

// Instead, use bounded caches with explicit eviction
class BoundedCache {
  constructor(maxSize = 100) {
    this.maxSize = maxSize;
    this.cache = new Map();
  }
  
  set(key, value) {
    if (this.cache.size >= this.maxSize) {
      // Evict oldest entry - allows GC to reclaim memory
      const firstKey = this.cache.keys().next().value;
      this.cache.delete(firstKey);
    }
    this.cache.set(key, value);
  }
  
  get(key) {
    return this.cache.get(key);
  }
}

React Native๋Š” ํ”„๋ฆฌํ…Œ๋‰ด์–ด๋ง(pre-tenuring)์ด ์ ์šฉ๋œ Hermes๋ฅผ ๊ตฌ์„ฑํ•ฉ๋‹ˆ๋‹ค. ์ฒซ 32MiB์˜ ํ• ๋‹น์€ ์˜ ์ œ๋„ˆ๋ ˆ์ด์…˜ ์ปฌ๋ ‰์…˜์„ ๊ฑด๋„ˆ๋›ฐ๊ณ  ์˜ฌ๋“œ ์ œ๋„ˆ๋ ˆ์ด์…˜์— ์ง์ ‘ ๋ฐฐ์น˜๋ฉ๋‹ˆ๋‹ค. ์•ฑ ์ดˆ๊ธฐํ™” ์ค‘์— ํ• ๋‹น๋˜๋Š” ๊ฐ์ฒด(๋‚ด๋น„๊ฒŒ์ด์…˜ ์Šคํƒ, ๊ธ€๋กœ๋ฒŒ ์ƒํƒœ, API ํด๋ผ์ด์–ธํŠธ)๋Š” ์ผ๋ฐ˜์ ์œผ๋กœ ์˜ค๋ž˜ ์‚ด์•„๋‚จ์œผ๋ฉฐ, ์ Š์€ ๊ฐ์ฒด๊ฐ€ ๋นจ๋ฆฌ ์ฃฝ๋Š”๋‹ค๋Š” ์„ธ๋Œ€ ๊ฐ€์„ค์„ ๋”ฐ๋ฅด์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ํ”„๋ฆฌํ…Œ๋‰ด์–ด๋ง์€ ์‹œ์ž‘ ์‹œ ๋ถˆํ•„์š”ํ•œ ์˜ ์ œ๋„ˆ๋ ˆ์ด์…˜ ์ปฌ๋ ‰์…˜์„ ํ”ผํ•˜์—ฌ TTI๋ฅผ ์ง์ ‘์ ์œผ๋กœ ๊ฐœ์„ ํ•ฉ๋‹ˆ๋‹ค.

Hermes V1์„ ์œ„ํ•œ ๋ฉ”๋ชจ๋ฆฌ ์ตœ์ ํ™” ํŒจํ„ด

Hermes V1์€ ์ง€์—ฐ ํ•จ์ˆ˜ ์ปดํŒŒ์ผ์„ ๋„์ž…ํ–ˆ์Šต๋‹ˆ๋‹ค. ํ•จ์ˆ˜๋Š” ์ฒ˜์Œ ํ˜ธ์ถœ๋  ๋•Œ๋งŒ ์™„์ „ํžˆ ์ปดํŒŒ์ผ๋ฉ๋‹ˆ๋‹ค. ์ด๋ฅผ ํ†ตํ•ด ๊ฑฐ์˜ ์‚ฌ์šฉ๋˜์ง€ ์•Š๋Š” ์ฝ”๋“œ ๊ฒฝ๋กœ๊ฐ€ ๋งŽ์€ ์ฝ”๋“œ๋ฒ ์ด์Šค์˜ ์ดˆ๊ธฐ ๋ฉ”๋ชจ๋ฆฌ ํ’‹ํ”„๋ฆฐํŠธ๊ฐ€ ํฌ๊ฒŒ ๊ฐ์†Œํ•˜์ง€๋งŒ, ๊ฐœ๋ฐœ์ž๋Š” ๊ทธ ์˜ํ–ฅ์„ ์ดํ•ดํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

FeatureModule.js - Lazy loading pattern that leverages Hermes lazy compilationjavascript
// These functions compile only when the feature is accessed
export function initializeAdvancedAnalytics() {
  // Complex initialization logic - compiled on first call
  const analyticsEngine = require('./AnalyticsEngine');
  return analyticsEngine.initialize({
    samplingRate: 0.1,
    batchSize: 50,
  });
}

export function generateDetailedReport(data) {
  // Heavy computation - memory allocated only when needed
  const ReportGenerator = require('./ReportGenerator');
  return new ReportGenerator(data).generate();
}

// In component - feature flags control compilation timing
function SettingsScreen({ hasAdvancedFeatures }) {
  const [analytics, setAnalytics] = useState(null);
  
  useEffect(() => {
    if (hasAdvancedFeatures && !analytics) {
      // Function compiles here, not at module load
      setAnalytics(initializeAdvancedAnalytics());
    }
  }, [hasAdvancedFeatures]);
  
  return (
    <View>
      {hasAdvancedFeatures && analytics && (
        <AnalyticsDashboard data={analytics} />
      )}
    </View>
  );
}

Hermes ๋ฐ”์ดํŠธ์ฝ”๋“œ๋Š” ์ผ๋ฐ˜์ ์œผ๋กœ ๋™๋“ฑํ•œ ๋ฏธ๋‹ˆํŒŒ์ด๋œ JavaScript๋ณด๋‹ค 10~30% ๋” ์ž‘์Šต๋‹ˆ๋‹ค. ์ด๋Ÿฌํ•œ ๋ฒˆ๋“ค ํฌ๊ธฐ ๊ฐ์†Œ๋กœ ์•ฑ ์Šคํ† ์–ด์—์„œ ๋‹ค์šด๋กœ๋“œ๋ถ€ํ„ฐ ์ฒซ ์‹คํ–‰๊นŒ์ง€์˜ ์ „ํ™˜์œจ์ด ํ–ฅ์ƒ๋˜๊ณ , ์Šคํ† ๋ฆฌ์ง€๊ฐ€ ๋А๋ฆฐ ๊ธฐ๊ธฐ์—์„œ ์ฝœ๋“œ ์Šคํƒ€ํŠธ ์‹œ๊ฐ„์ด ๋‹จ์ถ•๋ฉ๋‹ˆ๋‹ค.

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

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

ํ”„๋กœ๋•์…˜ ๋นŒ๋“œ์—์„œ ๋ฐ”์ดํŠธ์ฝ”๋“œ ์ปดํŒŒ์ผ ๊ฒ€์ฆํ•˜๊ธฐ

ํ”ํ•œ ์‹ค์ˆ˜๋Š” Hermes ๋ฐ”์ดํŠธ์ฝ”๋“œ๊ฐ€ ์ž๋™์œผ๋กœ ๋ฐฐํฌ๋œ๋‹ค๊ณ  ๊ฐ€์ •ํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๋””๋ฒ„๊ทธ ๋นŒ๋“œ์—์„œ๋Š” ๋น ๋ฅธ ๋ฐ˜๋ณต์„ ์œ„ํ•ด ์ผ๋ฐ˜ JavaScript๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์–ด, ๊ฐœ๋ฐœ์ž๊ฐ€ ํ”„๋กœ๋•์…˜ ํ™˜๊ฒฝ๊นŒ์ง€ ๋ฐ”์ดํŠธ์ฝ”๋“œ ๊ด€๋ จ ๋ฌธ์ œ๋ฅผ ์ธ์ง€ํ•˜์ง€ ๋ชปํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ฒ€์ฆ์„ ์œ„ํ•ด์„œ๋Š” ์‹ค์ œ ๋ฒˆ๋“ค ๋‚ด์šฉ์„ ํ™•์ธํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

bash
# Android: Check for Hermes bytecode in APK
unzip -l app-release.apk | grep -E "bundle$|hbc$"
# Expected: assets/index.android.bundle (should be HBC format)

# Verify file is actually bytecode, not plain JS
unzip -p app-release.apk assets/index.android.bundle | head -c 8 | xxd
# Hermes bytecode starts with magic bytes: c6 1f bc 03

# iOS: Check for bytecode in IPA
unzip -l App.ipa | grep -E "main.jsbundle"
# Extract and verify magic bytes same as Android

๋ฒˆ๋“ค์ด ๋ฐ”์ดํŠธ์ฝ”๋“œ๊ฐ€ ์•„๋‹Œ ์ผ๋ฐ˜ JavaScript์ธ ๊ฒฝ์šฐ, ๋นŒ๋“œ ์„ค์ •์—์„œ Hermes๊ฐ€ ๋น„ํ™œ์„ฑํ™”๋˜์–ด ์žˆ๊ฑฐ๋‚˜ Metro ํŠธ๋žœ์Šคํฌ๋จธ ์˜ค๋ฒ„๋ผ์ด๋“œ๊ฐ€ hermesc๋ฅผ ์šฐํšŒํ•˜๊ณ  ์žˆ์„ ๊ฐ€๋Šฅ์„ฑ์ด ์žˆ์Šต๋‹ˆ๋‹ค. react-native.config.js๋ฅผ ํ™•์ธํ•˜๊ณ  ์ปค์Šคํ…€ ํŠธ๋žœ์Šคํฌ๋จธ๊ฐ€ ๋ฐ”์ดํŠธ์ฝ”๋“œ ์ƒ์„ฑ์„ ๋ฐฉํ•ดํ•˜์ง€ ์•Š๋Š”์ง€ ํ™•์ธํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

react-native.config.js - Verify Hermes is not disabledjavascript
module.exports = {
  // Do NOT set hermes_enabled: false
  // Hermes is default in 0.84+
  project: {
    ios: {},
    android: {},
  },
  // Custom assets configuration if needed
  assets: ['./src/assets/fonts'],
};

Hermes V1 ๊ด€๋ จ ๊ธฐ์ˆ  ๋ฉด์ ‘ ์งˆ๋ฌธ

์‹œ๋‹ˆ์–ด React Native ํฌ์ง€์…˜์—์„œ๋Š” Hermes ๊ด€๋ จ ์งˆ๋ฌธ์ด ์ ์  ์ฆ๊ฐ€ํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋Ÿฌํ•œ ์งˆ๋ฌธ๋“ค์€ ์•ฑ ์„ฑ๋Šฅ์— ์ง์ ‘์ ์ธ ์˜ํ–ฅ์„ ๋ฏธ์น˜๋Š” JavaScript ์—”์ง„ ๊ณ„์ธต์— ๋Œ€ํ•œ ์ดํ•ด๋„๋ฅผ ํ‰๊ฐ€ํ•ฉ๋‹ˆ๋‹ค.

์งˆ๋ฌธ 1: Hermes ๋ฐ”์ดํŠธ์ฝ”๋“œ ์ปดํŒŒ์ผ๊ณผ V8 JIT ์ปดํŒŒ์ผ์˜ ์ฐจ์ด์ ์„ ์„ค๋ช…ํ•˜์‹ญ์‹œ์˜ค

Hermes๋Š” AOT(Ahead-of-Time) ์ปดํŒŒ์ผ์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. JavaScript๋Š” ๊ฐœ๋ฐœ ๋จธ์‹ ์ด๋‚˜ CI ์„œ๋ฒ„์—์„œ ๋นŒ๋“œ ํ”„๋กœ์„ธ์Šค ์ค‘์— ๋ฐ”์ดํŠธ์ฝ”๋“œ๋กœ ๋ณ€ํ™˜๋ฉ๋‹ˆ๋‹ค. ์ปดํŒŒ์ผ๋œ ๋ฐ”์ดํŠธ์ฝ”๋“œ๋Š” ์•ฑ ๋ฐ”์ด๋„ˆ๋ฆฌ์™€ ํ•จ๊ป˜ ๋ฐฐํฌ๋ฉ๋‹ˆ๋‹ค. ๋Ÿฐํƒ€์ž„์— Hermes๋Š” JavaScript ์†Œ์Šค๋ฅผ ํŒŒ์‹ฑํ•˜์ง€ ์•Š๊ณ  ๋ฐ”์ดํŠธ์ฝ”๋“œ๋ฅผ ์ง์ ‘ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค.

V8์€ JIT(Just-in-Time) ์ปดํŒŒ์ผ์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. JavaScript ์†Œ์Šค๊ฐ€ ์•ฑ๊ณผ ํ•จ๊ป˜ ๋ฐฐํฌ๋ฉ๋‹ˆ๋‹ค. ๋Ÿฐํƒ€์ž„์— V8์€ ์†Œ์Šค๋ฅผ ํŒŒ์‹ฑํ•˜๊ณ  ๋ฐ”์ดํŠธ์ฝ”๋“œ๋ฅผ ์ƒ์„ฑํ•œ ๋‹ค์Œ, ๋‹จ๊ณ„์  ์ปดํŒŒ์ผ(Ignition ์ธํ„ฐํ”„๋ฆฌํ„ฐ โ†’ TurboFan ์ตœ์ ํ™” ์ปดํŒŒ์ผ๋Ÿฌ)์„ ํ†ตํ•ด ํ•ซ ํ•จ์ˆ˜๋ฅผ ์ ์ง„์ ์œผ๋กœ ์ตœ์ ํ™”ํ•ฉ๋‹ˆ๋‹ค.

ํŠธ๋ ˆ์ด๋“œ์˜คํ”„: Hermes๋Š” ํ”ผํฌ ์‹คํ–‰ ์†๋„๋ฅผ ํฌ์ƒํ•˜๊ณ  ์ผ๊ด€๋œ ์‹œ์ž‘ ์„ฑ๋Šฅ์„ ๋‹ฌ์„ฑํ•ฉ๋‹ˆ๋‹ค. V8์˜ JIT๋Š” ๊ฒฐ๊ตญ Hermes ๋ฐ”์ดํŠธ์ฝ”๋“œ๋ณด๋‹ค ํ•ซ ๊ฒฝ๋กœ๋ฅผ ๋” ๋น ๋ฅด๊ฒŒ ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ์ง€๋งŒ, ์›œ์—… ์‹œ๊ฐ„๊ณผ ์ตœ์ ํ™” ์ปดํŒŒ์ผ๋Ÿฌ๋ฅผ ์œ„ํ•œ ๋ฉ”๋ชจ๋ฆฌ๊ฐ€ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค. ๋ชจ๋ฐ”์ผ ์•ฑ์€ ํ”ผํฌ ์ฒ˜๋ฆฌ๋Ÿ‰๋ณด๋‹ค ๋น ๋ฅธ ์‹œ์ž‘์—์„œ ๋” ํฐ ์ด์ ์„ ์–ป์Šต๋‹ˆ๋‹ค. ์‚ฌ์šฉ์ž๋Š” ์ธํ„ฐ๋ž™ํ‹ฐ๋ธŒ ์ƒํƒœ๊ฐ€ ๋˜๊ธฐ๊นŒ์ง€ 3์ดˆ ์ด์ƒ ๊ฑธ๋ฆฌ๋Š” ์•ฑ์„ ์ดํƒˆํ•˜๋Š” ๊ฒฝํ–ฅ์ด ์žˆ์Šต๋‹ˆ๋‹ค.

์งˆ๋ฌธ 2: Hades GC๊ฐ€ GenGC์™€ ์–ด๋–ป๊ฒŒ ๋‹ค๋ฅด๋ฉฐ, ์™œ ๋ณ€๊ฒฝ์ด ํ•„์š”ํ–ˆ์Šต๋‹ˆ๊นŒ?

GenGC๋Š” ์‹ฑ๊ธ€ ์Šค๋ ˆ๋“œ์ž…๋‹ˆ๋‹ค. ๋ชจ๋“  ๊ฐ€๋น„์ง€ ์ปฌ๋ ‰์…˜ ์ž‘์—…์ด JavaScript ์‹คํ–‰์„ ์ค‘๋‹จํ•ฉ๋‹ˆ๋‹ค. ๋งˆํฌ ๋‹จ๊ณ„๋Š” ๊ฐ์ฒด ๊ทธ๋ž˜ํ”„๋ฅผ ์ˆœํšŒํ•˜๊ณ , ์ปดํŒฉํŠธ ๋‹จ๊ณ„๋Š” ํž™์„ ์กฐ๊ฐ ๋ชจ์Œํ•ฉ๋‹ˆ๋‹ค. ๋‘˜ ๋‹ค ๋ฉ”์ธ ์Šค๋ ˆ๋“œ์—์„œ ์ˆ˜ํ–‰๋ฉ๋‹ˆ๋‹ค. ๋ณต์žกํ•œ ์•ฑ์—์„œ GC ์ผ์‹œ ์ •์ง€๋Š” ์ˆ˜๋ฐฑ ๋ฐ€๋ฆฌ์ดˆ์— ๋‹ฌํ–ˆ์Šต๋‹ˆ๋‹ค.

Hades๋Š” ๋Œ€๋ถ€๋ถ„ ๋™์‹œ์„ฑ์œผ๋กœ ๋™์ž‘ํ•ฉ๋‹ˆ๋‹ค. ๋ฐฑ๊ทธ๋ผ์šด๋“œ ์Šค๋ ˆ๋“œ๊ฐ€ JavaScript ์‹คํ–‰ ์ค‘์— ๋งˆํฌ ์Šค์œ• ์ปฌ๋ ‰์…˜์„ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค. ๋ฃจํŠธ ๋งˆํ‚น๊ณผ ์•ฝํ•œ ์ฐธ์กฐ ํŒŒ์ด๋„๋ผ์ด์ œ์ด์…˜์„ ์œ„ํ•ด ์งง์€ ์Šคํ†ฑ ๋” ์›”๋“œ ์ผ์‹œ ์ •์ง€๊ฐ€ ๋‚จ์•„ ์žˆ์ง€๋งŒ, ์ผ๋ฐ˜์ ์œผ๋กœ 10ms ๋ฏธ๋งŒ์ž…๋‹ˆ๋‹ค. ์˜ ์ œ๋„ˆ๋ ˆ์ด์…˜์€ ์—ฌ์ „ํžˆ ๋ณต์‚ฌ ์ปฌ๋ ‰์…˜(๋น ๋ฅด์ง€๋งŒ ์ผ์‹œ ์ •์ง€ ํ•„์š”)์„ ์‚ฌ์šฉํ•˜๊ณ , ์˜ฌ๋“œ ์ œ๋„ˆ๋ ˆ์ด์…˜์€ ๋™์‹œ์„ฑ ๋งˆํฌ ์Šค์œ•์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

์ด ๋ณ€๊ฒฝ์ด ํ•„์š”ํ–ˆ๋˜ ์ด์œ ๋Š” ๋ชจ๋ฐ”์ผ UI ํ”„๋ ˆ์ž„์›Œํฌ๊ฐ€ 60fps ์• ๋‹ˆ๋ฉ”์ด์…˜์„ ์œ„ํ•ด 16ms ํ”„๋ ˆ์ž„ ์˜ˆ์‚ฐ์„ ์š”๊ตฌํ•˜๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค. 200ms๋ฅผ ์ดˆ๊ณผํ•˜๋Š” GenGC ์ผ์‹œ ์ •์ง€๋Š” ๋ˆˆ์— ๋ณด์ด๋Š” ๋ฒ„๋ฒ…๊ฑฐ๋ฆผ๊ณผ ๋‚ฎ์€ ์‚ฌ์šฉ์ž ๊ฒฝํ—˜ ํ‰๊ฐ€๋ฅผ ์ดˆ๋ž˜ํ–ˆ์Šต๋‹ˆ๋‹ค.

์งˆ๋ฌธ 3: Hermes์—์„œ ํ”„๋ฆฌํ…Œ๋‰ด์–ด๋ง์ด๋ž€ ๋ฌด์—‡์ด๋ฉฐ ์–ธ์ œ ์กฐ์ •ํ•ด์•ผ ํ•ฉ๋‹ˆ๊นŒ?

ํ”„๋ฆฌํ…Œ๋‰ด์–ด๋ง์€ ์ฒซ 32MiB๋ฅผ ์˜ ์ œ๋„ˆ๋ ˆ์ด์…˜ ์ปฌ๋ ‰์…˜์„ ๊ฑด๋„ˆ๋›ฐ๊ณ  ์˜ฌ๋“œ ์ œ๋„ˆ๋ ˆ์ด์…˜์— ์ง์ ‘ ํ• ๋‹นํ•ฉ๋‹ˆ๋‹ค. React Native ์ดˆ๊ธฐํ™”๋Š” ์˜ ์ œ๋„ˆ๋ ˆ์ด์…˜ ์ปฌ๋ ‰์…˜์˜ ์ด์ ์„ ๋ฐ›์ง€ ๋ชปํ•˜๋Š” ์˜ค๋ž˜ ์‚ด์•„๋‚จ๋Š” ๊ฐ์ฒด(๋‚ด๋น„๊ฒŒ์ด์…˜ ์ƒํƒœ, Redux ์Šคํ† ์–ด, API ํด๋ผ์ด์–ธํŠธ)๋ฅผ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค. ํ”„๋ฆฌํ…Œ๋‰ด์–ด๋ง์€ ์‹œ์ž‘ ์‹œ ์ปฌ๋ ‰์…˜์—์„œ ์˜คํƒ์„ ๋ฐฉ์ง€ํ•ฉ๋‹ˆ๋‹ค.

์กฐ์ • ์‹œ๋‚˜๋ฆฌ์˜ค: ๋น„์ •์ƒ์ ์œผ๋กœ ํฐ ์ดˆ๊ธฐํ™” ํ• ๋‹น(๋ฌด๊ฑฐ์šด ๋„ค์ดํ‹ฐ๋ธŒ ๋ชจ๋“ˆ ์„ค์ •, ํฐ ์ •์  ๋ฐ์ดํ„ฐ์…‹)์ด ์žˆ๋Š” ์•ฑ์€ ํ”„๋ฆฌํ…Œ๋‰ด์–ด ํฌ๊ธฐ ์ฆ๊ฐ€๋กœ ์ด์ ์„ ์–ป์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ตœ์†Œ ๋ฉ”๋ชจ๋ฆฌ ํ’‹ํ”„๋ฆฐํŠธ์— ์ตœ์ ํ™”๋œ ์•ฑ์€ ์ด๋ฅผ ์ค„์ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์‹ค์ œ๋กœ 32MiB ๊ธฐ๋ณธ๊ฐ’์€ ๋Œ€๋ถ€๋ถ„์˜ ์•ฑ์—์„œ ์ž˜ ์ž‘๋™ํ•˜๋ฉฐ, ๋ณ€๊ฒฝ ์ „์— ์‹ค์ œ ๊ธฐ๊ธฐ ๋ฉ”ํŠธ๋ฆญ์„ ์‚ฌ์šฉํ•œ ํ”„๋กœํŒŒ์ผ๋ง์ด ์„ ํ–‰๋˜์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

์งˆ๋ฌธ 4: Hermes ๊ธฐ๋ฐ˜ React Native ์•ฑ์—์„œ ๋ฉ”๋ชจ๋ฆฌ ๋ˆ„์ˆ˜๋ฅผ ๋””๋ฒ„๊น…ํ•˜๋Š” ๋ฐฉ๋ฒ•์€?

React Native ๋‚ด์žฅ ์„ฑ๋Šฅ ๋ชจ๋‹ˆํ„ฐ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ JS ํž™ ํฌ๊ธฐ ์ถ”์„ธ๋ฅผ ๊ด€์ฐฐํ•˜๋Š” ๊ฒƒ์œผ๋กœ ์‹œ์ž‘ํ•ฉ๋‹ˆ๋‹ค. ์ •์ƒ ์‚ฌ์šฉ ์ค‘์— ํž™์ด ์ฆ๊ฐ€ํ•˜๋ฉด ๋ˆ„์ˆ˜๋ฅผ ๋‚˜ํƒ€๋ƒ…๋‹ˆ๋‹ค. Flipper์˜ Hermes ๋””๋ฒ„๊ฑฐ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋ˆ„์ˆ˜๊ฐ€ ์˜์‹ฌ๋˜๋Š” ์‹œ๋‚˜๋ฆฌ์˜ค ์ „ํ›„์˜ ํž™ ์Šค๋ƒ…์ƒท์„ ์บก์ฒ˜ํ•ฉ๋‹ˆ๋‹ค.

React Native์—์„œ ํ”ํ•œ ๋ˆ„์ˆ˜ ํŒจํ„ด:

  • ์ •๋ฆฌ ํ•จ์ˆ˜์—์„œ ์ œ๊ฑฐ๋˜์ง€ ์•Š๋Š” ์ด๋ฒคํŠธ ๋ฆฌ์Šค๋„ˆ
  • ์˜ค๋ž˜ ์‚ด์•„๋‚จ๋Š” ์ฝœ๋ฐฑ์—์„œ ์ปดํฌ๋„ŒํŠธ ์ƒํƒœ๋ฅผ ์บก์ฒ˜ํ•˜๋Š” ํด๋กœ์ €
  • ํ™”๋ฉด ์–ธ๋งˆ์šดํŠธ ํ›„์—๋„ ์œ ์ง€๋˜๋Š” ๋‚ด๋น„๊ฒŒ์ด์…˜ ๋ฆฌ์Šค๋„ˆ
  • ์–ธ๋งˆ์šดํŠธ ์‹œ ์ค‘์ง€๋˜์ง€ ์•Š๋Š” ์• ๋‹ˆ๋ฉ”์ด์…˜ ๊ฐ’
javascript
// Memory leak pattern - closure captures component scope
function LeakyComponent() {
  const [data, setData] = useState(largeDataset);
  
  useEffect(() => {
    // This closure captures 'data' - if interval persists, so does data
    const interval = setInterval(() => {
      console.log(data.length); // Leak: data never GC'd while interval runs
    }, 1000);
    
    // Fix: clear interval on unmount
    return () => clearInterval(interval);
  }, [data]);
}

์งˆ๋ฌธ 5: Hermes์—์„œ ๋„ค์ดํ‹ฐ๋ธŒ ๋ชจ๋“ˆ์„ ์‚ฌ์šฉํ•  ๋•Œ ์Šค๋ ˆ๋”ฉ ๊ด€๋ จ ๊ณ ๋ ค ์‚ฌํ•ญ์€?

Hades๋Š” JavaScript ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑ๋œ ์Šค๋ ˆ๋“œ๊ฐ€ ์•„๋‹Œ ๋ฐฑ๊ทธ๋ผ์šด๋“œ GC ์Šค๋ ˆ๋“œ์—์„œ ํŒŒ๊ดดํ•ฉ๋‹ˆ๋‹ค. ์Šค๋ ˆ๋“œ ๋กœ์ปฌ ๋ฆฌ์†Œ์Šค(GPU ์ปจํ…์ŠคํŠธ, ๋„ค์ดํ‹ฐ๋ธŒ ํ•ธ๋“ค)๋ฅผ ์œ ์ง€ํ•˜๋Š” ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋Š” ์ •๋ฆฌ ์ฝ”๋“œ๊ฐ€ ์‹ฑ๊ธ€ ์Šค๋ ˆ๋“œ ํŒŒ๊ดด๋ฅผ ๊ฐ€์ •ํ•˜๋ฉด ํฌ๋ž˜์‹œํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ฃผ๋ชฉํ•  ๋งŒํ•œ ์˜ˆ์‹œ: React Native Skia๋Š” ์Šค๋ ˆ๋“œ๋ณ„๋กœ GPU ์ปจํ…์ŠคํŠธ๋ฅผ ๊ด€๋ฆฌํ•ฉ๋‹ˆ๋‹ค. UI ์Šค๋ ˆ๋“œ์—์„œ ์ƒ์„ฑ๋œ ๊ฐ์ฒด๋Š” UI ์Šค๋ ˆ๋“œ์—์„œ ํŒŒ๊ดด๋˜์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋Š” ์ •๋ฆฌ๋ฅผ ์œ„ํ•œ ์˜ฌ๋ฐ”๋ฅธ ์Šค๋ ˆ๋“œ ์–ดํ”ผ๋‹ˆํ‹ฐ๋ฅผ ๋ณด์žฅํ•˜๊ธฐ ์œ„ํ•ด ํŠน๋ณ„ํ•œ ์ฐธ์กฐ ์นด์šดํŒ…์„ ๊ตฌํ˜„ํ•ฉ๋‹ˆ๋‹ค.

์ปค์Šคํ…€ ๋„ค์ดํ‹ฐ๋ธŒ ๋ชจ๋“ˆ์„ ์ž‘์„ฑํ•  ๋•Œ, ์†Œ๋ฉธ์ž ๋กœ์ง์ด ์˜ฌ๋ฐ”๋ฅธ ์Šค๋ ˆ๋“œ์—์„œ ์‹คํ–‰๋˜๊ฑฐ๋‚˜ ์Šค๋ ˆ๋“œ ์„ธ์ดํ”„ํ•œ์ง€ ํ™•์ธํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ํŠน์ • ์Šค๋ ˆ๋“œ ์–ดํ”ผ๋‹ˆํ‹ฐ๊ฐ€ ํ•„์š”ํ•œ ์ •๋ฆฌ์—๋Š” ํ”Œ๋žซํผ๋ณ„ ์Šค๋ ˆ๋“œ ๋””์ŠคํŒจ์น˜(Android: Handler.post(), iOS: dispatch_async())๋ฅผ ์‚ฌ์šฉํ•˜์‹ญ์‹œ์˜ค.

์„ฑ๋Šฅ ๋ฒค์น˜๋งˆํฌ: Hermes V1 vs ์ด์ „ ๋ฒ„์ „

์‹ค์ œ ์ธก์ •์„ ํ†ตํ•ด ์ฃผ์š” ๋ฉ”ํŠธ๋ฆญ ์ „๋ฐ˜์— ๊ฑธ์นœ Hermes V1 ๊ฐœ์„  ์‚ฌํ•ญ์ด ์ž…์ฆ๋˜์—ˆ์Šต๋‹ˆ๋‹ค:

| ๋ฉ”ํŠธ๋ฆญ | Hermes Legacy | Hermes V1 | ๊ฐœ์„  | |--------|---------------|-----------|-------------| | ์ฝœ๋“œ ์Šคํƒ€ํŠธ (TTI) | 2.8์ดˆ | 1.9์ดˆ | 32% ๋‹จ์ถ• | | ์›œ ์Šคํƒ€ํŠธ | 1.2์ดˆ | 0.8์ดˆ | 33% ๋‹จ์ถ• | | JS ํž™ ํฌ๊ธฐ | 45MB | 38MB | 16% ๊ฐ์†Œ | | GC ์ผ์‹œ ์ •์ง€ (p99) | 180ms | 12ms | 93% ๊ฐ์†Œ | | ๋ฒˆ๋“ค ํฌ๊ธฐ | 4.2MB | 3.1MB | 26% ๊ฐ์†Œ |

๋ฒค์น˜๋งˆํฌ๋Š” Pixel 6a(Android)์™€ iPhone 12(iOS)์—์„œ ํ…Œ์ŠคํŠธ๋œ ์ค‘๊ฐ„ ๋ณต์žก๋„์˜ ์ด์ปค๋จธ์Šค ์•ฑ ๊ธฐ์ค€์ž…๋‹ˆ๋‹ค. ๊ฒฐ๊ณผ๋Š” ๋ฒˆ๋“ค ํฌ๊ธฐ, ํ™”๋ฉด ์ˆ˜, ๋„ค์ดํ‹ฐ๋ธŒ ๋ชจ๋“ˆ ์‚ฌ์šฉ๋Ÿ‰์— ๋”ฐ๋ผ ๋‹ฌ๋ผ์ง‘๋‹ˆ๋‹ค.

JSC์—์„œ ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜ํ•˜๋Š” ํŒ€์˜ ๊ฒฝ์šฐ ๊ฐœ์„  ํšจ๊ณผ๊ฐ€ ๋”์šฑ ๊ทน์ ์ž…๋‹ˆ๋‹ค. ํŠนํžˆ ๋ฉ”๋ชจ๋ฆฌ๊ฐ€ ์ œํ•œ๋œ Android ๊ธฐ๊ธฐ์—์„œ ์ด์ „์— 500ms๋ฅผ ์ดˆ๊ณผํ–ˆ๋˜ GC ์ผ์‹œ ์ •์ง€์—์„œ ๋‘๋“œ๋Ÿฌ์ง„ ๊ฐœ์„ ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๊ฒฐ๋ก 

  • Hermes V1์€ ํ”„๋ฆฌ์ปดํŒŒ์ผ๋œ ๋ฐ”์ดํŠธ์ฝ”๋“œ๋ฅผ ๋ฐฐํฌํ•˜์—ฌ ๋Ÿฐํƒ€์ž„ JavaScript ํŒŒ์‹ฑ์„ ์ œ๊ฑฐํ•˜๊ณ  Time to Interactive๋ฅผ 25~50% ๋‹จ์ถ•ํ•ฉ๋‹ˆ๋‹ค
  • Hades ๋™์‹œ์„ฑ ๊ฐ€๋น„์ง€ ์ปฌ๋ ‰ํ„ฐ๋Š” ๊ฐ€๋น„์ง€ ์ปฌ๋ ‰์…˜ ์ผ์‹œ ์ •์ง€๋ฅผ ์ˆ˜๋ฐฑ ๋ฐ€๋ฆฌ์ดˆ์—์„œ p99 ๊ธฐ์ค€ 12ms ๋ฏธ๋งŒ์œผ๋กœ ์ค„์—ฌ ๋ถ€๋“œ๋Ÿฌ์šด 60fps ์• ๋‹ˆ๋ฉ”์ด์…˜์„ ์œ ์ง€ํ•ฉ๋‹ˆ๋‹ค
  • ํ”„๋ฆฌํ…Œ๋‰ด์–ด๋ง(๊ธฐ๋ณธ 32MiB)์€ ์ดˆ๊ธฐํ™” ๊ฐ์ฒด๋ฅผ ์˜ฌ๋“œ ์ œ๋„ˆ๋ ˆ์ด์…˜์— ์ง์ ‘ ํ• ๋‹นํ•˜์—ฌ ์‹œ์ž‘์„ ์ตœ์ ํ™”ํ•ฉ๋‹ˆ๋‹ค
  • ํ”„๋กœ๋•์…˜ ๋นŒ๋“œ๊ฐ€ ์ผ๋ฐ˜ JavaScript๊ฐ€ ์•„๋‹Œ .hbc ๋ฐ”์ดํŠธ์ฝ”๋“œ๋ฅผ ํฌํ•จํ•˜๋Š”์ง€ ๋งค์ง ๋ฐ”์ดํŠธ(c6 1f bc 03)๋ฅผ ํ™•์ธํ•˜์—ฌ ๊ฒ€์ฆํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค
  • ์ง€์—ฐ ํ•จ์ˆ˜ ์ปดํŒŒ์ผ๋กœ ์ดˆ๊ธฐ ๋ฉ”๋ชจ๋ฆฌ ํ’‹ํ”„๋ฆฐํŠธ๊ฐ€ ๊ฐ์†Œํ•ฉ๋‹ˆ๋‹ค. ๊ฑฐ์˜ ์‚ฌ์šฉ๋˜์ง€ ์•Š๋Š” ๊ธฐ๋Šฅ์˜ ์ปดํŒŒ์ผ์„ ์ง€์—ฐ์‹œํ‚ค๋„๋ก ์ฝ”๋“œ๋ฅผ ๊ตฌ์กฐํ™”ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค
  • ๋„ค์ดํ‹ฐ๋ธŒ ๋ชจ๋“ˆ ์ž‘์„ฑ์ž๋Š” ์Šค๋ ˆ๋“œ ๋กœ์ปฌ ๋ฆฌ์†Œ์Šค๋ฅผ ๊ด€๋ฆฌํ•  ๋•Œ ๋ฐฑ๊ทธ๋ผ์šด๋“œ ์Šค๋ ˆ๋“œ์—์„œ์˜ ๊ฐ์ฒด ํŒŒ๊ดด๋ฅผ ๊ณ ๋ คํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค
  • ๊ธฐ์ˆ  ๋ฉด์ ‘์—์„œ๋Š” Hermes ๋‚ด๋ถ€์— ๋Œ€ํ•œ ํ‰๊ฐ€๊ฐ€ ์ฆ๊ฐ€ํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค: ๋ฐ”์ดํŠธ์ฝ”๋“œ vs JIT ํŠธ๋ ˆ์ด๋“œ์˜คํ”„, GC ์•„ํ‚คํ…์ฒ˜, ๋ฉ”๋ชจ๋ฆฌ ๋””๋ฒ„๊น… ์›Œํฌํ”Œ๋กœ์šฐ๊ฐ€ ์ฃผ์š” ์ฃผ์ œ์ž…๋‹ˆ๋‹ค

์—ฐ์Šต์„ ์‹œ์ž‘ํ•˜์„ธ์š”!

๋ฉด์ ‘ ์‹œ๋ฎฌ๋ ˆ์ดํ„ฐ์™€ ๊ธฐ์ˆ  ํ…Œ์ŠคํŠธ๋กœ ์ง€์‹์„ ํ…Œ์ŠคํŠธํ•˜์„ธ์š”.

ํƒœ๊ทธ

#hermes
#react-native
#performance
#javascript-engine
#mobile-development

๊ณต์œ 

๊ด€๋ จ ๊ธฐ์‚ฌ

React Native 0.86 ์—ฃ์ง€ํˆฌ์—ฃ์ง€ Android ๊ฐœ๋ฐœ ์›Œํฌํ”Œ๋กœ์šฐ ๋‹ค์ด์–ด๊ทธ๋žจ

React Native 0.86 ์™„๋ฒฝ ๊ฐ€์ด๋“œ 2026: Android 15 ์—ฃ์ง€ํˆฌ์—ฃ์ง€ ์ง€์›๊ณผ DevTools ํ™œ์šฉ๋ฒ•

React Native 0.86์˜ Android 15 ์—ฃ์ง€ํˆฌ์—ฃ์ง€ ์ง€์›, DevTools ๊ฐœ์„  ์‚ฌํ•ญ, ๋ฉด์ ‘ ๋Œ€๋น„ ์งˆ๋ฌธ์„ ์ƒ์„ธํžˆ ๋‹ค๋ฃน๋‹ˆ๋‹ค. ์‹ค์šฉ์ ์ธ ์ฝ”๋“œ ์˜ˆ์ œ์™€ ์ตœ์‹  ๋ฒ ์ŠคํŠธ ํ”„๋ž™ํ‹ฐ์Šค๋ฅผ ์†Œ๊ฐœํ•ฉ๋‹ˆ๋‹ค.

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์— ๋Œ€ํ•ด ์ฝ”๋“œ ์˜ˆ์ œ์™€ ๋ฉด์ ‘ ์งˆ๋ฌธ์„ ํ†ตํ•ด ์‹ฌ์ธต ๋ถ„์„ํ•ฉ๋‹ˆ๋‹ค.