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

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

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

React Native 0.85๋Š” 2026๋…„ 4์›”์— ์ถœ์‹œ๋˜์–ด, ํ”„๋ ˆ์ž„์›Œํฌ ์ฐฝ์„ค ์ด๋ž˜ ๊ฐ€์žฅ ์ค‘์š”ํ•œ ์• ๋‹ˆ๋ฉ”์ด์…˜ ์‹œ์Šคํ…œ ๊ฐœํŽธ์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค. 58๋ช…์˜ ๊ธฐ์—ฌ์ž๊ฐ€ ์ฐธ์—ฌํ•œ 604๊ฐœ์˜ ์ปค๋ฐ‹์„ ํฌํ•จํ•˜๋Š” ์ด๋ฒˆ ๋ฆด๋ฆฌ์Šค์—์„œ๋Š” ๊ณต์œ  ์• ๋‹ˆ๋ฉ”์ด์…˜ ๋ฐฑ์—”๋“œ(Shared Animation Backend)๋ฅผ ๋„์ž…ํ•˜๊ณ , ํฌ์ŠคํŠธ ๋ธŒ๋ฆฌ์ง€ ์ „ํ™˜์„ ์™„๋ฃŒํ•˜๋ฉฐ, ์—”ํ„ฐํ”„๋ผ์ด์ฆˆ ํ™˜๊ฒฝ์„ ์œ„ํ•œ Metro TLS ์ง€์›์„ ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค.

ํ•ต์‹ฌ ์š”์•ฝ

React Native 0.85๋Š” Animated์™€ Reanimated ์• ๋‹ˆ๋ฉ”์ด์…˜ ์—”์ง„์„ ๋‹จ์ผ ๊ณต์œ  ๋ฐฑ์—”๋“œ๋กœ ํ†ตํ•ฉํ•ฉ๋‹ˆ๋‹ค. width, height, flex์™€ ๊ฐ™์€ ๋ ˆ์ด์•„์›ƒ ์†์„ฑ์„ useNativeDriver: true๋กœ ์• ๋‹ˆ๋ฉ”์ด์…˜ํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. 5๋…„ ์ด์ƒ ๊ฐœ๋ฐœ์ž๋“ค์„ ์ขŒ์ ˆ์‹œ์ผฐ๋˜ ์ œํ•œ์ด ๋งˆ์นจ๋‚ด ํ•ด๊ฒฐ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

๊ณต์œ  ์• ๋‹ˆ๋ฉ”์ด์…˜ ๋ฐฑ์—”๋“œ: Animated์™€ Reanimated์˜ ํ†ตํ•ฉ

React Native 0.85์˜ ํ•ต์‹ฌ ๊ธฐ๋Šฅ์€ Software Mansion๊ณผ์˜ ํ˜‘์—…์œผ๋กœ ๊ฐœ๋ฐœ๋œ ๊ณต์œ  ์• ๋‹ˆ๋ฉ”์ด์…˜ ๋ฐฑ์—”๋“œ์ž…๋‹ˆ๋‹ค. ์ด์ „์—๋Š” ๋‚ด์žฅ Animated ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์™€ ์ปค๋ฎค๋‹ˆํ‹ฐ Reanimated ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๊ฐ€ ๊ฐ๊ฐ ๋…๋ฆฝ์ ์ธ ์กฐ์ • ๋ฃจํ”„๋ฅผ ์œ ์ง€ํ–ˆ์Šต๋‹ˆ๋‹ค. ๊ฐ ์‹œ์Šคํ…œ์ด ๊ณ ์œ ํ•œ ๋‚ด๋ถ€ ๋กœ์ง์œผ๋กœ ์• ๋‹ˆ๋ฉ”์ด์…˜ ์—…๋ฐ์ดํŠธ๋ฅผ ์ ์šฉํ•˜๋ฉด์„œ, ํ•œ์ชฝ์˜ ์„ฑ๋Šฅ ๊ฐœ์„ ์ด ๋‹ค๋ฅธ ์ชฝ์— ํ˜œํƒ์„ ์ค„ ์ˆ˜ ์—†๋Š” ์‚ฌ์ผ๋กœํ™”๋œ ์ƒํƒœ๊ณ„๋ฅผ ํ˜•์„ฑํ•˜๊ณ  ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค.

๊ณต์œ  ์• ๋‹ˆ๋ฉ”์ด์…˜ ๋ฐฑ์—”๋“œ๋Š” ํ•ต์‹ฌ ์• ๋‹ˆ๋ฉ”์ด์…˜ ์—…๋ฐ์ดํŠธ ๋กœ์ง์„ React Native ๋ Œ๋”๋Ÿฌ์— ์ง์ ‘ ๋‚ด์žฅํ•ฉ๋‹ˆ๋‹ค. ์• ๋‹ˆ๋ฉ”์ด์…˜ ๊ธฐ๋ฐ˜ ์ปค๋ฐ‹์ด React ๋ฐ ์Šคํƒ€์ผ๋ง ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์™€ Shadow Tree๋ฅผ ๋‘๊ณ  ๊ฒฝ์Ÿํ•˜๋Š” ๋Œ€์‹ , ์ „์šฉ ๋ฉ”์ปค๋‹ˆ์ฆ˜์ด ๋ณ„๋„๋กœ ์ฒ˜๋ฆฌํ•ฉ๋‹ˆ๋‹ค.

AnimatedLayoutExample.tsxtypescript
import { Animated, Pressable, View, StyleSheet } from 'react-native';
import { useRef, useState } from 'react';

function ExpandableCard() {
  const widthAnim = useRef(new Animated.Value(120)).current;
  const heightAnim = useRef(new Animated.Value(80)).current;
  const [expanded, setExpanded] = useState(false);

  const toggle = () => {
    const toWidth = expanded ? 120 : 300;
    const toHeight = expanded ? 80 : 200;

    // Layout props with useNativeDriver โ€” new in 0.85
    Animated.parallel([
      Animated.spring(widthAnim, {
        toValue: toWidth,
        useNativeDriver: true, // Now supports layout props
      }),
      Animated.spring(heightAnim, {
        toValue: toHeight,
        useNativeDriver: true,
      }),
    ]).start();

    setExpanded(!expanded);
  };

  return (
    <Pressable onPress={toggle}>
      <Animated.View
        style={[
          styles.card,
          { width: widthAnim, height: heightAnim },
        ]}
      />
    </Pressable>
  );
}

const styles = StyleSheet.create({
  card: {
    backgroundColor: '#61DAFB',
    borderRadius: 8,
  },
});

0.85 ์ด์ „์—๋Š” width๋‚˜ height์™€ ๊ฐ™์€ ๋ ˆ์ด์•„์›ƒ ์†์„ฑ์— useNativeDriver: true๋ฅผ ์„ค์ •ํ•˜๋ฉด ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ–ˆ์Šต๋‹ˆ๋‹ค. ๊ฐœ๋ฐœ์ž๋Š” ๋ถ€๋“œ๋Ÿฌ์šด 60fps ์• ๋‹ˆ๋ฉ”์ด์…˜(๋„ค์ดํ‹ฐ๋ธŒ ๋“œ๋ผ์ด๋ฒ„ ์‚ฌ์šฉ, transform๊ณผ opacity๋กœ ์ œํ•œ)๊ณผ ๋ ˆ์ด์•„์›ƒ ๋ณ€๊ฒฝ์„ ์œ„ํ•œ ๋ฒ„๋ฒ…์ด๋Š” JS ์Šค๋ ˆ๋“œ ์• ๋‹ˆ๋ฉ”์ด์…˜ ์‚ฌ์ด์—์„œ ์„ ํƒํ•ด์•ผ ํ–ˆ์Šต๋‹ˆ๋‹ค. ๊ณต์œ  ์• ๋‹ˆ๋ฉ”์ด์…˜ ๋ฐฑ์—”๋“œ๋Š” ์ด 5๋…„ ๋œ ์ œํ•œ์„ ๊ทผ๋ณธ์ ์œผ๋กœ ํ•ด๊ฒฐํ•ฉ๋‹ˆ๋‹ค.

์• ๋‹ˆ๋ฉ”์ด์…˜ ๋ฐฑ์—”๋“œ์˜ ๋‚ด๋ถ€ ๋™์ž‘ ์›๋ฆฌ

์ด์ „์— -DRN_USE_ANIMATION_BACKEND ์ปดํŒŒ์ผ๋Ÿฌ ํ”Œ๋ž˜๊ทธ ๋’ค์— ์ˆจ๊ฒจ์ ธ ์žˆ๋˜ C++ ์• ๋‹ˆ๋ฉ”์ด์…˜ ๋ฐฑ์—”๋“œ๊ฐ€ 0.85์—์„œ๋Š” ๊ธฐ๋ณธ์ ์œผ๋กœ ํ™œ์„ฑํ™”๋ฉ๋‹ˆ๋‹ค. ์ด ์‹œ์Šคํ…œ์€ ๋‘ ๊ฐ€์ง€ ์ „์šฉ ์—…๋ฐ์ดํŠธ ๊ฒฝ๋กœ๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค:

  • synchronouslyUpdateProps โ€” ๋ ˆ์ด์•„์›ƒ์ด ์•„๋‹Œ ๋ณ€๊ฒฝ ์‚ฌํ•ญ(opacity, transform)์„ ์œ„ํ•œ ๋น ๋ฅธ ๊ฒฝ๋กœ๋กœ, ์ „์ฒด Fabric ์ปค๋ฐ‹ ์‚ฌ์ดํด์„ ์šฐํšŒํ•ฉ๋‹ˆ๋‹ค
  • ์ „์ฒด Fabric ์ปค๋ฐ‹ โ€” ๋ ˆ์ด์•„์›ƒ ์žฌ๊ณ„์‚ฐ์ด ํ•„์š”ํ•œ ๊ฒฝ์šฐ(width, height, flex, padding)์—๋งŒ ํŠธ๋ฆฌ๊ฑฐ๋ฉ๋‹ˆ๋‹ค

์ด ๋“€์–ผ ๊ฒฝ๋กœ ์ ‘๊ทผ ๋ฐฉ์‹ ๋•๋ถ„์— ๋‹จ์ˆœํ•œ opacity ํŽ˜์ด๋“œ๋Š” ์ด์ „๊ณผ ๋™์ผํ•œ ์†๋„๋ฅผ ์œ ์ง€ํ•˜๋ฉด์„œ, ๋ ˆ์ด์•„์›ƒ ์• ๋‹ˆ๋ฉ”์ด์…˜์€ ํšŒ๊ท€ ์—†์ด ๋„ค์ดํ‹ฐ๋ธŒ ์Šค๋ ˆ๋“œ ์„ฑ๋Šฅ์„ ํ™•๋ณดํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

Reanimated ํ˜ธํ™˜์„ฑ

Reanimated 4.x(ํ˜„์žฌ ๋ฒ ํƒ€)๋Š” ๊ณต์œ  ์• ๋‹ˆ๋ฉ”์ด์…˜ ๋ฐฑ์—”๋“œ์™€ ์™„์ „ํžˆ ํ†ตํ•ฉ๋ฉ๋‹ˆ๋‹ค. ๊ธฐ์กด Reanimated 3.x ์›Œํฌ๋ฆฟ์€ ๊ณ„์† ์ž‘๋™ํ•˜์ง€๋งŒ, ๊ณต์œ  ๋ฐฑ์—”๋“œ๋กœ ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜ํ•˜๋ฉด ์ด์ „์—๋Š” ๋ถˆ๊ฐ€๋Šฅํ–ˆ๋˜ ์„ฑ๋Šฅ ํ–ฅ์ƒ์ด ๊ฐ€๋Šฅํ•ด์ง‘๋‹ˆ๋‹ค. ํŠนํžˆ 120Hz์—์„œ ์‹คํ–‰๋˜๋Š” ๋ ˆ์ด์•„์›ƒ ์• ๋‹ˆ๋ฉ”์ด์…˜์—์„œ ํฐ ํšจ๊ณผ๋ฅผ ๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

ํฌ์ŠคํŠธ ๋ธŒ๋ฆฌ์ง€ ์•„ํ‚คํ…์ฒ˜: ๋ธŒ๋ฆฌ์ง€์˜ ์™„์ „ํ•œ ์ œ๊ฑฐ

React Native 0.85๋Š” ๋ธŒ๋ฆฌ์ง€ ํด๋ฐฑ์ด๋‚˜ ๋ ˆ๊ฑฐ์‹œ ์ƒํ˜ธ ์šด์šฉ ๋ ˆ์ด์–ด๊ฐ€ ์ „ํ˜€ ์—†๋Š” ์ตœ์ดˆ์˜ ์•ˆ์ • ๋ฆด๋ฆฌ์Šค์ž…๋‹ˆ๋‹ค. JSI(JavaScript Interface) ๊ธฐ๋ฐ˜์˜ ์ƒˆ๋กœ์šด ์•„ํ‚คํ…์ฒ˜๋Š” JavaScript์™€ ๋„ค์ดํ‹ฐ๋ธŒ ์ฝ”๋“œ ๊ฐ„์˜ ์ง์ ‘์ ์ธ ๋™๊ธฐ ํ†ต์‹ ์„ 2ms ๋ฏธ๋งŒ์˜ ์ธํ„ฐ๋กญ ์ง€์—ฐ ์‹œ๊ฐ„์œผ๋กœ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.

๋ฉด์ ‘ ์ค€๋น„๋ฅผ ์œ„ํ•œ ์‹ค์งˆ์  ์˜๋ฏธ:

TurboModuleExample.tsxtypescript
// TurboModules now lazy-load by default in 0.85
// Cold-start memory reduced by ~40%
import { TurboModuleRegistry } from 'react-native';

// Module loads only when first accessed, not at app startup
const CameraModule = TurboModuleRegistry.getEnforcing('Camera');

// Direct synchronous call via JSI โ€” no bridge serialization
const hasPermission = CameraModule.checkPermission();

0.85์—์„œ๋Š” TurboModules๊ฐ€ ๊ธฐ๋ณธ์ ์œผ๋กœ ์ง€์—ฐ ๋กœ๋“œ๋˜์–ด ์ฝœ๋“œ ์Šคํƒ€ํŠธ ๋ฉ”๋ชจ๋ฆฌ๊ฐ€ ์•ฝ 40% ๊ฐ์†Œํ•ฉ๋‹ˆ๋‹ค. ๋ชจ๋“  ๋„ค์ดํ‹ฐ๋ธŒ ๋ชจ๋“ˆ์„ ์ฆ‰์‹œ ๋“ฑ๋กํ•˜๋˜ ์Šคํƒ€ํŠธ์—… ํŽ˜๋„ํ‹ฐ๊ฐ€ ์ œ๊ฑฐ๋ฉ๋‹ˆ๋‹ค. ์ด๋Š” React Native ์„ฑ๋Šฅ ์ตœ์ ํ™”์— ๊ด€ํ•œ ๋ฉด์ ‘์—์„œ ์ž์ฃผ ์ถœ์ œ๋˜๋Š” ์ฃผ์ œ์ž…๋‹ˆ๋‹ค.

Metro TLS: ๊ฐœ๋ฐœ ์„œ๋ฒ„์˜ HTTPS ์ง€์›

๊ธฐ์—… ํ”„๋ก์‹œ ๋’ค์—์„œ ์ž‘์—…ํ•˜๊ฑฐ๋‚˜ ๋ณด์•ˆ ์ „์šฉ API๋ฅผ ํ…Œ์ŠคํŠธํ•˜๋Š” ์—”ํ„ฐํ”„๋ผ์ด์ฆˆ ํŒ€์€ Metro์˜ HTTP ์ „์šฉ ๊ฐœ๋ฐœ ์„œ๋ฒ„์— ๋Œ€ํ•œ ์šฐํšŒ ๋ฐฉ๋ฒ•์ด ํ•„์š”ํ–ˆ์Šต๋‹ˆ๋‹ค. Metro๋Š” ์ด์ œ TLS๋ฅผ ๋„ค์ดํ‹ฐ๋ธŒ๋กœ ์ง€์›ํ•ฉ๋‹ˆ๋‹ค:

metro.config.jsjavascript
const fs = require('fs');
const { getDefaultConfig } = require('@react-native/metro-config');

const config = getDefaultConfig(__dirname);

// Enable HTTPS + WSS (Fast Refresh over secure WebSocket)
config.server.tls = {
  ca: fs.readFileSync('./certs/ca.pem'),
  cert: fs.readFileSync('./certs/cert.pem'),
  key: fs.readFileSync('./certs/key.pem'),
};

module.exports = config;

๋กœ์ปฌ ๊ฐœ๋ฐœ ์‹œ mkcert๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ์ˆ˜๋™ CA ์„ค์น˜ ์—†์ด ์‹ ๋ขฐํ•  ์ˆ˜ ์žˆ๋Š” ์ธ์ฆ์„œ๋ฅผ ์ƒ์„ฑํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. TLS๊ฐ€ ํ™œ์„ฑํ™”๋˜๋ฉด Fast Refresh๊ฐ€ WSS๋ฅผ ํ†ตํ•ด ์ž‘๋™ํ•˜์—ฌ ๋ณด์•ˆ ํ™˜๊ฒฝ์—์„œ๋„ ํ•ซ ๋ฆฌ๋กœ๋“œ๊ฐ€ ์ •์ƒ์ ์œผ๋กœ ๊ธฐ๋Šฅํ•ฉ๋‹ˆ๋‹ค.

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

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

์ฃผ์š” ๋ณ€๊ฒฝ ์‚ฌํ•ญ ๋ฐ ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜ ๊ฐ€์ด๋“œ

์—…๊ทธ๋ ˆ์ด๋“œ ์‹œ ์ฃผ์˜๊ฐ€ ํ•„์š”ํ•œ ์—ฌ๋Ÿฌ ์ฃผ์š” ๋ณ€๊ฒฝ ์‚ฌํ•ญ์ด ์žˆ์Šต๋‹ˆ๋‹ค:

Jest ํ”„๋ฆฌ์…‹ ๋ถ„๋ฆฌ โ€” ๋‚ด์žฅ ํ”„๋ฆฌ์…‹์ด @react-native/jest-preset์œผ๋กœ ์ด๋™ํ–ˆ์Šต๋‹ˆ๋‹ค:

jest.config.js โ€” beforejavascript
module.exports = {
  preset: 'react-native',
};

// jest.config.js โ€” after
module.exports = {
  preset: '@react-native/jest-preset',
};

StyleSheet.absoluteFillObject ์ œ๊ฑฐ โ€” StyleSheet.absoluteFill๋กœ ๋Œ€์ฒดํ•ฉ๋‹ˆ๋‹ค:

Before (0.84 and earlier)typescript
const overlay = StyleSheet.absoluteFillObject;

// After (0.85+)
const overlay = StyleSheet.absoluteFill;

Node.js ๋ฒ„์ „ ์š”๊ตฌ ์‚ฌํ•ญ โ€” ์ตœ์†Œ Node.js 20.19.4๊ฐ€ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค. ๋ฒ„์ „ 21๊ณผ 23(๋ชจ๋‘ EOL)์€ ์ง€์›๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

ํ…์ŠคํŠธ ์˜ค๋ฒ„ํ”Œ๋กœ ๋™์ž‘ ๋ณ€๊ฒฝ โ€” borderRadius ๊ฒฝ๊ณ„ ๋ฐ–์˜ ํ…์ŠคํŠธ๊ฐ€ ๊ธฐ๋ณธ์ ์œผ๋กœ ์ˆจ๊ฒจ์ง‘๋‹ˆ๋‹ค. ๋‘ฅ๊ทผ ๋ชจ์„œ๋ฆฌ๋ฅผ ๋„˜์–ด ํ‘œ์‹œ๋˜๋Š” ํ…์ŠคํŠธ์— ์˜์กดํ•˜๋Š” ์ปดํฌ๋„ŒํŠธ๋Š” ๋ช…์‹œ์ ์œผ๋กœ overflow: 'visible' ์Šคํƒ€์ผ์„ ์ ์šฉํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

Android ์ฃผ์š” ๋ณ€๊ฒฝ ์‚ฌํ•ญ

ReactTextUpdate๊ฐ€ ๋‚ด๋ถ€ API๋กœ ๋ณ€๊ฒฝ๋˜๊ณ , ReactZIndexedViewGroup๊ณผ UIManagerHelper๊ฐ€ ๋” ์ด์ƒ ์‚ฌ์šฉ๋˜์ง€ ์•Š์œผ๋ฉฐ, CatalystInstanceImpl์ด ์™„์ „ํžˆ ์ œ๊ฑฐ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ์ด๋Ÿฌํ•œ API์— ์ง์ ‘ ์ ‘๊ทผํ•˜๋Š” ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋Š” 0.85๋กœ ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜ํ•˜๊ธฐ ์ „์— ์—…๋ฐ์ดํŠธ๊ฐ€ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.

DevTools: ์—ฌ๋Ÿฌ ๋””๋ฒ„๊ฑฐ ๋™์‹œ ์—ฐ๊ฒฐ

React Native 0.85๋Š” ์—ฌ๋Ÿฌ Chrome DevTools Protocol(CDP) ์—ฐ๊ฒฐ์˜ ๋™์‹œ ์‚ฌ์šฉ์„ ์ง€์›ํ•ฉ๋‹ˆ๋‹ค. VS Code, React Native DevTools, AI ์ฝ”๋”ฉ ์—์ด์ „ํŠธ๊ฐ€ ์„œ๋กœ์˜ ์„ธ์…˜์„ ์ข…๋ฃŒํ•˜์ง€ ์•Š๊ณ  ๋™์‹œ์— ์—ฐ๊ฒฐํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ด๋Š” ์—ฌ๋Ÿฌ ๋„๊ตฌ๋ฅผ ๊ฒฐํ•ฉํ•œ ๋””๋ฒ„๊น… ์›Œํฌํ”Œ๋กœ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ํŒ€์— ํŠนํžˆ ๊ด€๋ จ์ด ์žˆ์Šต๋‹ˆ๋‹ค. Android ๋„คํŠธ์›Œํฌ ํŒจ๋„์—์„œ๋Š” ์ด์ „ ๋ฒ„์ „์—์„œ ๋ฐœ์ƒํ•œ ์š”์ฒญ ๋ณธ๋ฌธ ๋ฏธ๋ฆฌ๋ณด๊ธฐ ํšŒ๊ท€๊ฐ€ ์ˆ˜์ •๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

Shadow Tree ์ปค๋ฐ‹ ๋ธŒ๋žœ์นญ

์ƒˆ๋กœ์šด Fabric ์ปค๋ฐ‹ ๋ธŒ๋žœ์นญ ๋ฉ”์ปค๋‹ˆ์ฆ˜์€ React Native๊ฐ€ Shadow Tree์— ์—…๋ฐ์ดํŠธ๋ฅผ ์ปค๋ฐ‹ํ•˜๋Š” ๋ฐฉ์‹์„ ๊ทผ๋ณธ์ ์œผ๋กœ ๋ณ€๊ฒฝํ•ฉ๋‹ˆ๋‹ค. ์ด์ „์—๋Š” ์• ๋‹ˆ๋ฉ”์ด์…˜ ์ปค๋ฐ‹๊ณผ React ์ƒํƒœ ์—…๋ฐ์ดํŠธ๊ฐ€ ๋™์ผํ•œ ์ปค๋ฐ‹ ๊ฒฝ๋กœ๋ฅผ ๋‘๊ณ  ๊ฒฝ์Ÿํ•˜๋ฉด์„œ, ๋ฆฌ๋ Œ๋”๋ง์„ ๋™๋ฐ˜ํ•˜๋Š” ๋ณต์žกํ•œ ์• ๋‹ˆ๋ฉ”์ด์…˜ ์ค‘์— ํ”„๋ ˆ์ž„ ๋“œ๋กญ์ด ๋ฐœ์ƒํ–ˆ์Šต๋‹ˆ๋‹ค.

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

View Transition API (์ธํ”„๋ผ)

์ƒˆ๋กœ์šด ๊ธฐ๋Šฅ ํ”Œ๋ž˜๊ทธ viewTransitionEnabled๋Š” ๋ทฐ ๊ฐ„ ์• ๋‹ˆ๋ฉ”์ด์…˜ ์ „ํ™˜์„ ๊ฐ€๋Šฅํ•˜๊ฒŒ ํ•˜๋Š” ํ–ฅํ›„ View Transition API์˜ ๊ธฐ๋ฐ˜์ž…๋‹ˆ๋‹ค. 0.85์—์„œ๋Š” ๊ธฐ๋ณธ๊ฐ’์ด false๋กœ ์„ค์ •๋˜์–ด ์žˆ์œผ๋ฉฐ, ์‚ฌ์šฉ์ž ๋Œ€์ƒ ๊ธฐ๋Šฅ์ด ์•„๋‹Œ ์ธํ”„๋ผ ์ˆ˜์ค€์˜ ์ค€๋น„ ๋‹จ๊ณ„์ž…๋‹ˆ๋‹ค. ์ด๋Š” ์›น์˜ View Transitions API์™€ ์œ ์‚ฌํ•œ ๋‚ด์žฅ ๋‚ด๋น„๊ฒŒ์ด์…˜ ์ „ํ™˜์„ ํ–ฅํ•œ React Native์˜ ๋ฐฉํ–ฅ์„ฑ์„ ๋ณด์—ฌ์ค๋‹ˆ๋‹ค.

๋ฉด์ ‘ ์งˆ๋ฌธ: React Native 0.85 ์•„ํ‚คํ…์ฒ˜

React Native ๋ฉด์ ‘์„ ์ค€๋น„ํ•˜๋Š” ๋ถ„๋“ค์„ ์œ„ํ•ด 0.85 ์•„ํ‚คํ…์ฒ˜๋ฅผ ๋ฐ˜์˜ํ•œ ํ•ต์‹ฌ ์งˆ๋ฌธ์„ ์ •๋ฆฌํ•ฉ๋‹ˆ๋‹ค:

Q: ๊ณต์œ  ์• ๋‹ˆ๋ฉ”์ด์…˜ ๋ฐฑ์—”๋“œ๊ฐ€ ํ•ด๊ฒฐํ•˜๋Š” ๋ฌธ์ œ๋Š” ๋ฌด์—‡์ž…๋‹ˆ๊นŒ?

๊ณต์œ  ์• ๋‹ˆ๋ฉ”์ด์…˜ ๋ฐฑ์—”๋“œ๋Š” ์ด์ „์— ๋ถ„๋ฆฌ๋˜์–ด ์žˆ๋˜ ๋‘ ๊ฐœ์˜ ์• ๋‹ˆ๋ฉ”์ด์…˜ ์กฐ์ • ์‹œ์Šคํ…œ(Animated์™€ Reanimated)์„ React Native ์ฝ”์–ด์˜ ๋‹จ์ผ ์—”์ง„์œผ๋กœ ํ†ตํ•ฉํ•ฉ๋‹ˆ๋‹ค. 0.85 ์ด์ „์—๋Š” ํ•œ ์‹œ์Šคํ…œ์˜ ์„ฑ๋Šฅ ์ตœ์ ํ™”๊ฐ€ ๋‹ค๋ฅธ ์‹œ์Šคํ…œ์— ํ˜œํƒ์„ ์ค„ ์ˆ˜ ์—†์—ˆ์Šต๋‹ˆ๋‹ค. ๊ณต์œ  ๋ฐฑ์—”๋“œ๋Š” ๋˜ํ•œ ๋„ค์ดํ‹ฐ๋ธŒ ๋“œ๋ผ์ด๋ฒ„๋กœ ๋ ˆ์ด์•„์›ƒ ์†์„ฑ ์• ๋‹ˆ๋ฉ”์ด์…˜์„ ๋ฐฉํ•ดํ•˜๋˜ ์ œํ•œ์„ ์ œ๊ฑฐํ•ฉ๋‹ˆ๋‹ค.

Q: 0.85์—์„œ TurboModules๊ฐ€ ๊ธฐ๋ณธ์ ์œผ๋กœ ์ง€์—ฐ ๋กœ๋“œ๋˜๋Š” ์ด์œ ๋Š” ๋ฌด์—‡์ž…๋‹ˆ๊นŒ?

์Šคํƒ€ํŠธ์—… ์‹œ ๋ชจ๋“  TurboModules๋ฅผ ์ฆ‰์‹œ ๋“ฑ๋กํ•˜๋ฉด ์„ธ์…˜ ๋™์•ˆ ์‚ฌ์šฉ๋˜์ง€ ์•Š์„ ์ˆ˜ ์žˆ๋Š” ๋ชจ๋“ˆ์—๋„ ๋ฉ”๋ชจ๋ฆฌ๊ฐ€ ์†Œ๋น„๋ฉ๋‹ˆ๋‹ค. ์ง€์—ฐ ๋กœ๋“œ๋Š” ์ฒซ ๋ฒˆ์งธ ์ ‘๊ทผ ์‹œ๊นŒ์ง€ ์ธ์Šคํ„ด์Šคํ™”๋ฅผ ์ง€์—ฐ์‹œ์ผœ, ๊ฐœ๋ฐœ์ž ๋Œ€์ƒ API๋ฅผ ๋ณ€๊ฒฝํ•˜์ง€ ์•Š์œผ๋ฉด์„œ ์ฝœ๋“œ ์Šคํƒ€ํŠธ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ์•ฝ 40% ์ ˆ๊ฐํ•ฉ๋‹ˆ๋‹ค.

Q: ์• ๋‹ˆ๋ฉ”์ด์…˜ ๋ฐฑ์—”๋“œ์˜ ๋‘ ๊ฐ€์ง€ ์—…๋ฐ์ดํŠธ ๊ฒฝ๋กœ๋ฅผ ์„ค๋ช…ํ•˜์‹ญ์‹œ์˜ค.

synchronouslyUpdateProps๋Š” Fabric ์ปค๋ฐ‹์„ ํŠธ๋ฆฌ๊ฑฐํ•˜์ง€ ์•Š๊ณ  ๋ ˆ์ด์•„์›ƒ์ด ์•„๋‹Œ ์†์„ฑ ๋ณ€๊ฒฝ(opacity, transform)์„ ์ฒ˜๋ฆฌํ•ฉ๋‹ˆ๋‹ค. ์• ๋‹ˆ๋ฉ”์ด์…˜์ด ๋ ˆ์ด์•„์›ƒ ์†์„ฑ(width, height, padding)์„ ์ˆ˜์ •ํ•  ๋•Œ๋Š” ์ ์ ˆํ•œ ๋ ˆ์ด์•„์›ƒ ์žฌ๊ณ„์‚ฐ์„ ์œ„ํ•ด ์ „์ฒด Fabric ์ปค๋ฐ‹์ด ํŠธ๋ฆฌ๊ฑฐ๋ฉ๋‹ˆ๋‹ค. ์ด ๋“€์–ผ ๊ฒฝ๋กœ ์ ‘๊ทผ ๋ฐฉ์‹์€ ๋‹จ์ˆœํ•œ ์• ๋‹ˆ๋ฉ”์ด์…˜์˜ ์„ฑ๋Šฅ์„ ์œ ์ง€ํ•˜๋ฉด์„œ ๋„ค์ดํ‹ฐ๋ธŒ ์Šค๋ ˆ๋“œ์—์„œ์˜ ๋ ˆ์ด์•„์›ƒ ์• ๋‹ˆ๋ฉ”์ด์…˜์„ ๊ฐ€๋Šฅํ•˜๊ฒŒ ํ•ฉ๋‹ˆ๋‹ค.

Q: Shadow Tree ์ปค๋ฐ‹ ๋ธŒ๋žœ์นญ์ด๋ž€ ๋ฌด์—‡์ž…๋‹ˆ๊นŒ?

์ปค๋ฐ‹ ๋ธŒ๋žœ์นญ์€ ์• ๋‹ˆ๋ฉ”์ด์…˜ ๊ตฌ๋™ Shadow Tree ์—…๋ฐ์ดํŠธ์™€ React ์ƒํƒœ ๊ตฌ๋™ ์—…๋ฐ์ดํŠธ๋ฅผ ๋…๋ฆฝ์ ์ธ ๋ธŒ๋žœ์น˜๋กœ ๋ถ„๋ฆฌํ•ฉ๋‹ˆ๋‹ค. ๊ฐ ๋ธŒ๋žœ์น˜๋Š” ๋…๋ฆฝ์ ์œผ๋กœ ์ปค๋ฐ‹ํ•˜๊ณ , ํ”„๋ ˆ์ž„ ๊ฒฝ๊ณ„์—์„œ ์กฐ์ •๋ฉ๋‹ˆ๋‹ค. ์ด๋ฅผ ํ†ตํ•ด ๋™์ผํ•œ ์ปค๋ฐ‹ ๊ฒฝ๋กœ๋ฅผ ๋‘๊ณ  ๊ฒฝ์Ÿํ•˜๋Š” React ๋ฆฌ๋ Œ๋”๋ง์œผ๋กœ ์ธํ•œ ์• ๋‹ˆ๋ฉ”์ด์…˜ ๋ฒ„๋ฒ…์ž„์„ ๋ฐฉ์ง€ํ•ฉ๋‹ˆ๋‹ค. ์ด๋Š” ์• ๋‹ˆ๋ฉ”์ด์…˜ ์š”์†Œ๊ฐ€ ์žˆ๋Š” ๋ฆฌ์ŠคํŠธ ์Šคํฌ๋กค์—์„œ ํ”„๋ ˆ์ž„ ๋“œ๋กญ์˜ ์ผ๋ฐ˜์ ์ธ ์›์ธ์ด์—ˆ์Šต๋‹ˆ๋‹ค.

์—„๊ฒฉํ•œ TypeScript API: ๊ฐ•์ œ ์ ์šฉ์„ ํ–ฅํ•œ ์ง„ํ–‰

React Native 0.80์—์„œ ์„ ํƒ์  ๊ธฐ๋Šฅ์œผ๋กœ ๋„์ž…๋œ ์—„๊ฒฉํ•œ TypeScript API๋Š” ๊ธฐ๋ณธ๊ฐ’์ด ๋˜๊ธฐ ์œ„ํ•œ ๊ณผ์ •์„ ๊ณ„์†ํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ํ™œ์„ฑํ™” ๋ฐฉ๋ฒ•:

tsconfig.jsonjson
{
  "compilerOptions": {
    "customConditions": ["react-native-strict-api"]
  }
}

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

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

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

๊ฒฐ๋ก 

  • ๊ณต์œ  ์• ๋‹ˆ๋ฉ”์ด์…˜ ๋ฐฑ์—”๋“œ๊ฐ€ Animated์™€ Reanimated๋ฅผ ํ•˜๋‚˜์˜ ์—”์ง„์œผ๋กœ ํ†ตํ•ฉํ•˜์—ฌ, useNativeDriver: true๋ฅผ ์‚ฌ์šฉํ•œ ๋ ˆ์ด์•„์›ƒ ์†์„ฑ ์• ๋‹ˆ๋ฉ”์ด์…˜์„ ์ตœ์ดˆ๋กœ ์‹คํ˜„
  • React Native 0.85๋Š” ๋ ˆ๊ฑฐ์‹œ ์ƒํ˜ธ ์šด์šฉ ์—†์ด ํฌ์ŠคํŠธ ๋ธŒ๋ฆฌ์ง€ ์ „ํ™˜์„ ์™„๋ฃŒํ•˜๊ณ , ์ง€์—ฐ ๋กœ๋“œ TurboModules๋กœ ์ฝœ๋“œ ์Šคํƒ€ํŠธ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ 40% ์ ˆ๊ฐ
  • Metro TLS ์ง€์›์œผ๋กœ ์—”ํ„ฐํ”„๋ผ์ด์ฆˆ ๊ฐœ๋ฐœ ํ™˜๊ฒฝ์˜ HTTPS ์š”๊ตฌ ์‚ฌํ•ญ ํ•ด๊ฒฐ
  • Shadow Tree ์ปค๋ฐ‹ ๋ธŒ๋žœ์นญ์œผ๋กœ React ์ปค๋ฐ‹ ๊ฒฝ์Ÿ์— ์˜ํ•œ ์• ๋‹ˆ๋ฉ”์ด์…˜ ๋ฒ„๋ฒ…์ž„ ์ œ๊ฑฐ
  • ์—„๊ฒฉํ•œ TypeScript API๋Š” ํ–ฅํ›„ ๊ฐ•์ œ ์ ์šฉ์— ๋Œ€๋น„ํ•˜์—ฌ ์ง€๊ธˆ๋ถ€ํ„ฐ ํ™œ์„ฑํ™”ํ•ด์•ผ ํ•จ
  • ์—…๊ทธ๋ ˆ์ด๋“œ ์ „์— ์ฃผ์š” ๋ณ€๊ฒฝ ์‚ฌํ•ญ(Jest ํ”„๋ฆฌ์…‹ ๋ถ„๋ฆฌ, StyleSheet.absoluteFillObject ์ œ๊ฑฐ, Node.js 20+ ์š”๊ตฌ ์‚ฌํ•ญ)์„ ์ฒ˜๋ฆฌํ•ด์•ผ ํ•จ

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

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

Anthony Fillion-Maillet

์ž‘์„ฑ์ž

Anthony Fillion-Maillet

ํ’€์Šคํƒ ๊ฐœ๋ฐœ์ž, SharpSkill ์ฐฝ์—…์ž

10๋…„ ์ด์ƒ ํ’€์Šคํƒ ๊ฐœ๋ฐœ์„ ํ•ด์™”์Šต๋‹ˆ๋‹ค. SharpSkill์„ ์šด์˜ํ•˜๋ฉฐ ์ด๊ณณ์— ๊ฒŒ์‹œ๋˜๋Š” ๋ชจ๋“  ๋‚ด์šฉ์— ์ฑ…์ž„์„ ์ง‘๋‹ˆ๋‹ค.

2026๋…„ 5์›” 16์ผ ์—…๋ฐ์ดํŠธ

ํƒœ๊ทธ

#react-native
#animation
#typescript
#mobile-development
#interview

๊ณต์œ 

๊ด€๋ จ ๊ธฐ์‚ฌ

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

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

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

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

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

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

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

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

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