React Compiler 2026: ์ž๋™ ๋ฉ”๋ชจ์ด์ œ์ด์…˜์˜ ์›๋ฆฌ์™€ ๊ธฐ์ˆ  ๋ฉด์ ‘ ์™„๋ฒฝ ๊ฐ€์ด๋“œ

React Compiler v1.0์˜ ์ž๋™ ๋ฉ”๋ชจ์ด์ œ์ด์…˜ ๋‚ด๋ถ€ ๊ตฌ์กฐ, ์ปดํŒŒ์ผ ํŒŒ์ดํ”„๋ผ์ธ, ์ˆ˜๋™ ์ตœ์ ํ™”๊ฐ€ ํ•„์š”ํ•œ ์‹œ๋‚˜๋ฆฌ์˜ค๋ฅผ ์ƒ์„ธํžˆ ๋ถ„์„ํ•ฉ๋‹ˆ๋‹ค. 2026๋…„ React ๊ธฐ์ˆ  ๋ฉด์ ‘์—์„œ ์ž์ฃผ ์ถœ์ œ๋˜๋Š” ํ•ต์‹ฌ ์งˆ๋ฌธ์„ ํฌ๊ด„์ ์œผ๋กœ ๋‹ค๋ฃน๋‹ˆ๋‹ค.

React Compiler 2026 automatic memoization interview questions

React Compiler๋Š” 2025๋…„ 10์›”์— ์•ˆ์ • ๋ฒ„์ „ v1.0์— ๋„๋‹ฌํ•˜๋ฉฐ, React ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ์„ฑ๋Šฅ ์ตœ์ ํ™” ๋ฐฉ์‹์„ ๊ทผ๋ณธ์ ์œผ๋กœ ๋ฐ”๊พธ์—ˆ์Šต๋‹ˆ๋‹ค. 2026๋…„ ๊ธฐ์ˆ  ๋ฉด์ ‘์—์„œ๋Š” ์ปดํŒŒ์ผ๋Ÿฌ์˜ ๋‚ด๋ถ€ ๊ตฌ์กฐ, ๋ฉ”๋ชจ์ด์ œ์ด์…˜ ์ „๋žต, ๊ทธ๋ฆฌ๊ณ  ์ˆ˜๋™ ์ตœ์ ํ™”๊ฐ€ ์—ฌ์ „ํžˆ ํ•„์š”ํ•œ ์‹œ๋‚˜๋ฆฌ์˜ค์— ๋Œ€ํ•œ ์ดํ•ด๊ฐ€ ํ•„์ˆ˜์ ์ž…๋‹ˆ๋‹ค.

๋ฉด์ ‘ ํ•ต์‹ฌ ํฌ์ธํŠธ

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

React Compiler๋ž€ ๋ฌด์—‡์ด๋ฉฐ, ์ฝ”๋“œ๋ฅผ ์–ด๋–ป๊ฒŒ ์ตœ์ ํ™”ํ•˜๋Š”๊ฐ€

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

์ปดํŒŒ์ผ๋Ÿฌ๋Š” Babel ํ”Œ๋Ÿฌ๊ทธ์ธ์œผ๋กœ ๋™์ž‘ํ•ฉ๋‹ˆ๋‹ค(Next.js 15.3.1 ์ด์ƒ์—์„œ๋Š” SWC ์ง€์›์ด ํ™•๋Œ€๋˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค). ๊ฐ ์ปดํฌ๋„ŒํŠธ๋ฅผ ๋…๋ฆฝ์ ์œผ๋กœ ์ฒ˜๋ฆฌํ•˜๋ฉฐ, Babel AST๋ฅผ ์ปค์Šคํ…€ ๊ณ ์ˆ˜์ค€ ์ค‘๊ฐ„ ํ‘œํ˜„(HIR)์œผ๋กœ ๋ณ€ํ™˜ํ•œ ํ›„ ์—ฌ๋Ÿฌ ์ตœ์ ํ™” ํŒจ์Šค๋ฅผ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค.

Meta์˜ ํ”„๋กœ๋•์…˜ ํ™˜๊ฒฝ ๊ฒฐ๊ณผ๊ฐ€ ๊ทธ ํšจ๊ณผ๋ฅผ ์ž…์ฆํ•ฉ๋‹ˆ๋‹ค. Quest Store์—์„œ๋Š” ์ดˆ๊ธฐ ๋กœ๋”ฉ์ด ์ตœ๋Œ€ 12% ๋นจ๋ผ์กŒ๊ณ , ์ธํ„ฐ๋ž™์…˜์€ 2.5๋ฐฐ ์ด์ƒ ๋นจ๋ผ์กŒ์Šต๋‹ˆ๋‹ค. Sanity Studio์—์„œ๋Š” 1,231๊ฐœ์˜ ์ปดํŒŒ์ผ๋œ ์ปดํฌ๋„ŒํŠธ์—์„œ ๋ Œ๋”๋ง ์‹œ๊ฐ„์ด 20-30% ๊ฐ์†Œํ–ˆ๋‹ค๊ณ  ๋ณด๊ณ ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

๋ฉด์ ‘ ๋‹ต๋ณ€ ๊ตฌ์„ฑ: ์ปดํŒŒ์ผ๋Ÿฌ๋ฅผ ์ •์˜ํ•˜๊ณ , ๋Ÿฐํƒ€์ž„์ด ์•„๋‹Œ ๋นŒ๋“œ ํƒ€์ž„์— ๋™์ž‘ํ•œ๋‹ค๋Š” ๊ฒƒ์„ ์„ค๋ช…ํ•˜๋ฉฐ, HIR ํŒŒ์ดํ”„๋ผ์ธ์„ ์–ธ๊ธ‰ํ•˜๊ณ , ์‹ค์ œ ์„ฑ๋Šฅ ์ง€ํ‘œ๋ฅผ ์ธ์šฉํ•ฉ๋‹ˆ๋‹ค.

์ปดํŒŒ์ผ ํŒŒ์ดํ”„๋ผ์ธ: ์†Œ์Šค ์ฝ”๋“œ์—์„œ ์ตœ์ ํ™”๋œ ์ฝ”๋“œ๊นŒ์ง€

์ด ์งˆ๋ฌธ์€ ๊นŠ์€ ์ดํ•ด๋ฅผ ํ‰๊ฐ€ํ•ฉ๋‹ˆ๋‹ค. React Compiler ํŒŒ์ดํ”„๋ผ์ธ์€ 7๊ฐœ์˜ ๋ช…ํ™•ํ•œ ๋‹จ๊ณ„๋กœ ๊ตฌ์„ฑ๋ฉ๋‹ˆ๋‹ค.

  1. ์†Œ์Šค์—์„œ AST๋กœ โ€” Babel์ด JavaScript/TypeScript๋ฅผ ์ถ”์ƒ ๊ตฌ๋ฌธ ํŠธ๋ฆฌ(AST)๋กœ ํŒŒ์‹ฑํ•ฉ๋‹ˆ๋‹ค
  2. AST์—์„œ HIR๋กœ โ€” ์ปดํŒŒ์ผ๋Ÿฌ๊ฐ€ AST๋ฅผ React์˜ ์ปดํฌ๋„ŒํŠธ ๋ชจ๋ธ ์ „์šฉ์œผ๋กœ ์„ค๊ณ„๋œ ๊ณ ์ˆ˜์ค€ ์ค‘๊ฐ„ ํ‘œํ˜„์œผ๋กœ ๋ณ€ํ™˜ํ•ฉ๋‹ˆ๋‹ค
  3. SSA ๋ณ€ํ™˜ โ€” ์ •์  ๋‹จ์ผ ํ• ๋‹น ํ˜•์‹์„ ํ†ตํ•ด ๊ฐ ๋ณ€์ˆ˜๊ฐ€ ์ •ํ™•ํžˆ ํ•œ ๋ฒˆ๋งŒ ํ• ๋‹น๋˜๋„๋ก ๋ณด์žฅํ•˜์—ฌ ์ •๋ฐ€ํ•œ ๋ฐ์ดํ„ฐ ํ๋ฆ„ ์ถ”์ ์„ ๊ฐ€๋Šฅํ•˜๊ฒŒ ํ•ฉ๋‹ˆ๋‹ค
  4. ํƒ€์ž… ์ถ”๋ก ๊ณผ ์ดํŽ™ํŠธ ๋ถ„์„ โ€” ์ปดํŒŒ์ผ๋Ÿฌ๊ฐ€ ์—ฐ์‚ฐ์„ ์˜ํ–ฅ๋„์— ๋”ฐ๋ผ ๋ถ„๋ฅ˜ํ•ฉ๋‹ˆ๋‹ค: read, store, capture, mutate, freeze
  5. ๋ฆฌ์•กํ‹ฐ๋ธŒ ๋ถ„์„ โ€” ๋ชจ๋“  ํ‘œํ˜„์‹์ด static(์ƒ์ˆ˜, ์ž„ํฌํŠธ) ๋˜๋Š” reactive(props, state, context์—์„œ ํŒŒ์ƒ)์œผ๋กœ ๋ถ„๋ฅ˜๋ฉ๋‹ˆ๋‹ค
  6. ์Šค์ฝ”ํ”„ ๋ฐœ๊ฒฌ โ€” ์ปดํŒŒ์ผ๋Ÿฌ๊ฐ€ ๋…๋ฆฝ์ ์œผ๋กœ ์บ์‹œํ•˜๊ณ  ๋ฌดํšจํ™”ํ•  ์ˆ˜ ์žˆ๋Š” ๊ฐœ๋ณ„ ๋ฉ”๋ชจ์ด์ œ์ด์…˜ ์Šค์ฝ”ํ”„๋ฅผ ์‹๋ณ„ํ•ฉ๋‹ˆ๋‹ค
  7. ์ฝ”๋“œ ์ƒ์„ฑ โ€” ์ž๋™ ๋ฉ”๋ชจ์ด์ œ์ด์…˜์ด ํฌํ•จ๋œ ์ตœ์ ํ™”๋œ JavaScript๊ฐ€ ์ถœ๋ ฅ๋ฉ๋‹ˆ๋‹ค
javascript
// ์ปดํŒŒ์ผ ์ „
function UserProfile({ user, theme }) {
  const fullName = user.firstName + ' ' + user.lastName;
  const style = { color: theme.primary, fontSize: 16 };
  return <div style={style}>{fullName}</div>;
}

// ์ปดํŒŒ์ผ ํ›„ (๊ฐ„์†Œํ™”๋œ ํ‘œํ˜„)
function UserProfile({ user, theme }) {
  const $ = useMemoCache(4);
  let fullName;
  if ($[0] !== user.firstName || $[1] !== user.lastName) {
    fullName = user.firstName + ' ' + user.lastName;
    $[0] = user.firstName;
    $[1] = user.lastName;
    $[2] = fullName;
  } else {
    fullName = $[2];
  }
  // style๊ณผ JSX๋„ ๋™์ผํ•˜๊ฒŒ ๋ฉ”๋ชจ์ด์ œ์ด์…˜...
}

๋ฉด์ ‘์—์„œ ํ•ต์‹ฌ์ ์œผ๋กœ ์ดํ•ดํ•ด์•ผ ํ•  ์ ์€ ์ปดํŒŒ์ผ๋Ÿฌ๊ฐ€ ์ปดํฌ๋„ŒํŠธ ์ˆ˜์ค€์ด ์•„๋‹Œ ๊ฐ’ ์ˆ˜์ค€์—์„œ ๋ฉ”๋ชจ์ด์ œ์ด์…˜์„ ์ˆ˜ํ–‰ํ•œ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๊ฐ ๊ณ„์‚ฐ๋œ ๊ฐ’์€ ๊ณ ์œ ํ•œ ์บ์‹œ ์Šฌ๋กฏ์„ ๊ฐ€์ง€๋ฉฐ, ํ•ด๋‹น ๊ฐ’์˜ ํŠน์ • ์˜์กด์„ฑ์ด ๋ณ€๊ฒฝ๋  ๋•Œ๋งŒ ๋ฌดํšจํ™”๋ฉ๋‹ˆ๋‹ค. ์ด ์„ธ๋ฐ€ํ•œ ๋‹จ์œ„๋Š” ์‹ค์ œ ์ฝ”๋“œ์—์„œ useMemo๊ฐ€ ๋‹ฌ์„ฑํ•˜๋Š” ์ˆ˜์ค€์„ ๋„˜์–ด์„ญ๋‹ˆ๋‹ค.

React์˜ ๊ทœ์น™: ์ปดํŒŒ์ผ๋Ÿฌ๊ฐ€ ์ „์ œํ•˜๋Š” ๊ฒƒ๋“ค

React Compiler๋Š” ์ปดํฌ๋„ŒํŠธ๊ฐ€ React์˜ ๊ทœ์น™์„ ๋”ฐ๋ฅธ๋‹ค๋Š” ์ „์ œํ•˜์— ์ •์  ๋ถ„์„์„ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค. ์ด๋Ÿฌํ•œ ๊ทœ์น™์„ ์œ„๋ฐ˜ํ•˜๋Š” ์ฝ”๋“œ์— ๋Œ€ํ•ด ์ปดํŒŒ์ผ๋Ÿฌ๋Š” ํ•ด๋‹น ์ปดํฌ๋„ŒํŠธ์˜ ์ตœ์ ํ™”๋ฅผ ์กฐ์šฉํžˆ ๊ฑด๋„ˆ๋œ๋‹ˆ๋‹ค. ์ด๋Š” ๋ฉด์ ‘์—์„œ ์ž์ฃผ ๋‹ค๋ค„์ง€๋Š” ์ฃผ์ œ์ž…๋‹ˆ๋‹ค.

์„ธ ๊ฐ€์ง€ ํ•ต์‹ฌ ๊ทœ์น™:

  • ์ปดํฌ๋„ŒํŠธ์™€ ํ›…์€ ์ˆœ์ˆ˜ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค โ€” ๋™์ผํ•œ ์ž…๋ ฅ์— ๋Œ€ํ•ด ๋ Œ๋”๊ฐ€ ๋™์ผํ•œ ์ถœ๋ ฅ์„ ์ƒ์„ฑํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๋ Œ๋” ์ค‘์— ์™ธ๋ถ€์˜ ๊ฐ€๋ณ€ ์ƒํƒœ๋ฅผ ์ฝ๊ฑฐ๋‚˜ ์“ฐ๋ฉด ์•ˆ ๋ฉ๋‹ˆ๋‹ค.
  • ํ›…์€ ํ˜ธ์ถœ ๊ทœ์น™์„ ๋”ฐ๋ผ์•ผ ํ•ฉ๋‹ˆ๋‹ค โ€” ํ›…์„ ์กฐ๊ฑด๋ฌธ ๋‚ด๋ถ€, ๋ฐ˜๋ณต๋ฌธ ๋‚ด๋ถ€, ๋˜๋Š” ์ค‘์ฒฉ๋œ ํ•จ์ˆ˜ ๋‚ด๋ถ€์—์„œ ํ˜ธ์ถœํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.
  • Props์™€ State๋Š” ๋ Œ๋” ๋‚ด์—์„œ ๋ถˆ๋ณ€์ž…๋‹ˆ๋‹ค โ€” props๋‚˜ state๋ฅผ ์ง์ ‘ ๋ณ€๊ฒฝํ•ด์„œ๋Š” ์•ˆ ๋˜๋ฉฐ, ํ•ญ์ƒ setter ํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.
javascript
// ๊ทœ์น™ ์œ„๋ฐ˜: ๋ Œ๋” ์ค‘ ๋ฎคํ…Œ์ด์…˜
function BadCounter({ items }) {
  // ์ปดํŒŒ์ผ๋Ÿฌ๊ฐ€ ์ด ์ปดํฌ๋„ŒํŠธ๋ฅผ ๊ฑด๋„ˆ๋œ๋‹ˆ๋‹ค
  items.sort(); // props ๋ฐฐ์—ด์„ ๋ฎคํ…Œ์ดํŠธํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค!
  return <ul>{items.map(i => <li key={i}>{i}</li>)}</ul>;
}

// ์˜ฌ๋ฐ”๋ฅธ ๊ตฌํ˜„: ์ƒˆ๋กœ์šด ์ •๋ ฌ๋œ ๋ฐฐ์—ด ์ƒ์„ฑ
function GoodCounter({ items }) {
  const sorted = [...items].sort();
  return <ul>{sorted.map(i => <li key={i}>{i}</li>)}</ul>;
}
๋ฉด์ ‘์—์„œ ํ”ํ•œ ํ•จ์ •

์ปดํŒŒ์ผ๋Ÿฌ๊ฐ€ ์ปดํฌ๋„ŒํŠธ๋ฅผ ๊ฑด๋„ˆ๋›ฐ์–ด๋„ ์—๋Ÿฌ๊ฐ€ ๋ฐœ์ƒํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์€ ์ •์ƒ์ ์œผ๋กœ ๋™์ž‘ํ•˜์ง€๋งŒ, ํ•ด๋‹น ์ปดํฌ๋„ŒํŠธ๋Š” ์ตœ์ ํ™”๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ESLint ํ”Œ๋Ÿฌ๊ทธ์ธ(eslint-plugin-react-hooks์˜ recommended ํ”„๋ฆฌ์…‹)์ด ํ”„๋กœ๋•์…˜์— ๋„๋‹ฌํ•˜๊ธฐ ์ „์— ์ด๋Ÿฌํ•œ ์œ„๋ฐ˜์„ ๊ฐ์ง€ํ•˜๋Š” ์ฃผ์š” ์ˆ˜๋‹จ์ž…๋‹ˆ๋‹ค.

ESLint ํ†ตํ•ฉ: ๋นŒ๋“œ ์ „์— ์œ„๋ฐ˜ ์‚ฌํ•ญ ๊ฐ์ง€ํ•˜๊ธฐ

๋…๋ฆฝ ํŒจํ‚ค์ง€์ธ eslint-plugin-react-compiler๋Š” 2025๋…„ ํ›„๋ฐ˜์— ์ง€์›์ด ์ข…๋ฃŒ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ์ปดํŒŒ์ผ๋Ÿฌ ๊ด€๋ จ ๋ชจ๋“  ๋ฆฐํŠธ ๊ทœ์น™์€ eslint-plugin-react-hooks@latest์— ํ†ตํ•ฉ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

ESLint ํ”Œ๋žซ ์„ค์ • ๋ฐฉ๋ฒ•:

eslint.config.jsjavascript
import reactHooks from 'eslint-plugin-react-hooks';
import { defineConfig } from 'eslint/config';

export default defineConfig([
  reactHooks.configs.flat.recommended,
]);

์ปดํŒŒ์ผ๋Ÿฌ ๊ธฐ๋ฐ˜ ๊ทœ์น™์ด ๊ฐ์ง€ํ•˜๋Š” ์„ธ ๊ฐ€์ง€ ์ค‘์š”ํ•œ ํŒจํ„ด:

  • set-state-in-render โ€” ๋ Œ๋” ์ค‘์— setState๋ฅผ ํ˜ธ์ถœํ•˜์—ฌ ๋ฌดํ•œ ๋ฃจํ”„๋ฅผ ์œ ๋ฐœํ•˜๋Š” ๊ฒฝ์šฐ
  • set-state-in-effect โ€” ์ดํŽ™ํŠธ ๋‚ด์˜ ๊ณ ๋น„์šฉ ์—ฐ์‚ฐ์ด ์—ฐ์‡„์ ์ธ ๋ฆฌ๋ Œ๋”๋ฅผ ์œ ๋ฐœํ•˜๋Š” ๊ฒฝ์šฐ
  • refs โ€” ๋ Œ๋” ์ค‘์— ref์˜ .current์— ์ ‘๊ทผํ•˜๋Š” ๊ฒฝ์šฐ (ref๋Š” ๊ฐ€๋ณ€์ ์ธ ํƒˆ์ถœ๊ตฌ์ด๋ฉฐ, ๋ Œ๋”์— ์•ˆ์ „ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค)

๋ฉด์ ‘์—์„œ๋Š” ๊ถŒ์žฅ ๋„์ž… ์ „๋žต์„ ์„ค๋ช…ํ•  ์ˆ˜ ์žˆ์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๋จผ์ € ESLint ๊ทœ์น™์„ ํ™œ์„ฑํ™”ํ•˜๊ณ , ๋ชจ๋“  ์œ„๋ฐ˜ ์‚ฌํ•ญ์„ ์ˆ˜์ •ํ•œ ๋‹ค์Œ, ์ปดํŒŒ์ผ๋Ÿฌ๋ฅผ ํ™œ์„ฑํ™”ํ•ฉ๋‹ˆ๋‹ค. ์ด ๋‹จ๊ณ„์  ์ ‘๊ทผ ๋ฐฉ์‹์€ ์˜ˆ๊ธฐ์น˜ ์•Š์€ ๋ฌธ์ œ๋ฅผ ์ตœ์†Œํ™”ํ•ฉ๋‹ˆ๋‹ค.

์ˆ˜๋™ ์ตœ์ ํ™”๊ฐ€ ์—ฌ์ „ํžˆ ํ•„์š”ํ•œ ๊ฒฝ์šฐ

์ปดํŒŒ์ผ๋Ÿฌ๊ฐ€ ๋ชจ๋“  ์„ฑ๋Šฅ ๊ด€๋ จ ์ž‘์—…์„ ๋Œ€์ฒดํ•˜๋Š” ๊ฒƒ์€ ์•„๋‹™๋‹ˆ๋‹ค. ๋ช‡ ๊ฐ€์ง€ ์‹œ๋‚˜๋ฆฌ์˜ค์—์„œ๋Š” ์ˆ˜๋™ ๊ฐœ์ž…์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.

1. ์™ธ๋ถ€ ์Šคํ† ์–ด ๊ตฌ๋…

์ปดํŒŒ์ผ๋Ÿฌ๋Š” React์˜ state, props, context๋งŒ ์ถ”์ ํ•ฉ๋‹ˆ๋‹ค. ์™ธ๋ถ€ ์Šคํ† ์–ด(Redux, Zustand, MobX)์—๋Š” ๋ Œ๋” ์ตœ์ ํ™”๋ฅผ ์œ„ํ•ด useSyncExternalStore ๋˜๋Š” ์Šคํ† ์–ด ์ž์ฒด์˜ ์…€๋ ‰ํ„ฐ ๋ฉ”์ปค๋‹ˆ์ฆ˜์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.

2. ๋Œ€๊ทœ๋ชจ ๋ฐ์ดํ„ฐ์…‹์— ๋Œ€ํ•œ ๊ณ ๋น„์šฉ ์—ฐ์‚ฐ

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

3. Ref ๊ธฐ๋ฐ˜ ๋ช…๋ นํ˜• ๋กœ์ง

Ref๋Š” ์ปดํŒŒ์ผ๋Ÿฌ์˜ ๋ฆฌ์•กํ‹ฐ๋ธŒ ๋ชจ๋ธ์—์„œ ์˜๋„์ ์œผ๋กœ ์ œ์™ธ๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค. ์• ๋‹ˆ๋ฉ”์ด์…˜, canvas ๋ Œ๋”๋ง, ์„œ๋“œํŒŒํ‹ฐ DOM ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ํ†ตํ•ฉ์—๋Š” ์ˆ˜๋™ ์ œ์–ด๊ฐ€ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.

4. ์ปดํฌ๋„ŒํŠธ ๊ฐ„ ๋ฉ”๋ชจ์ด์ œ์ด์…˜

์ปดํŒŒ์ผ๋Ÿฌ๋Š” ๋‹จ์ผ ์ปดํฌ๋„ŒํŠธ ๋˜๋Š” ํ›… ๋‚ด์—์„œ ๋ฉ”๋ชจ์ด์ œ์ด์…˜์„ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค. ์ปดํฌ๋„ŒํŠธ ๊ฐ„์— ๊ณ„์‚ฐ๋œ ๊ฐ’์„ ๊ณต์œ ํ•˜๋ ค๋ฉด state ๋Œ์–ด์˜ฌ๋ฆฌ๊ธฐ, context, ๋˜๋Š” ์™ธ๋ถ€ ์บ์‹œ ๊ณ„์ธต์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.

javascript
// ์ปดํŒŒ์ผ๋Ÿฌ๊ฐ€ ์ž๋™์œผ๋กœ ์ฒ˜๋ฆฌํ•˜๋Š” ๊ฒฝ์šฐ
function ProductCard({ product, currency }) {
  const formattedPrice = formatCurrency(product.price, currency);
  const discount = product.originalPrice - product.price;
  return (
    <div>
      <span>{formattedPrice}</span>
      {discount > 0 && <Badge>Save {discount}</Badge>}
    </div>
  );
}

// ์ˆ˜๋™ ์ตœ์ ํ™”๊ฐ€ ํ•„์š”ํ•œ ๊ฒฝ์šฐ: ๊ณ ๋น„์šฉ ์™ธ๋ถ€ ์—ฐ์‚ฐ
function DataGrid({ rows }) {
  const processedRows = useMemo(
    () => rows.map(row => heavyTransform(row)), // O(n) with large n
    [rows]
  );
  return <VirtualList items={processedRows} />;
}

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

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

ํ”„๋ ˆ์ž„์›Œํฌ๋ณ„ React Compiler ํ™œ์„ฑํ™” ๋ฐฉ๋ฒ•

๋ฉด์ ‘์—์„œ๋Š” ๋„๊ตฌ ์ฒด์ธ ์„ค์ •์— ๋Œ€ํ•œ ์‹ค๋ฌด์  ์ง€์‹๋„ ํ‰๊ฐ€๋ฉ๋‹ˆ๋‹ค.

Next.js (15.3.1 ์ด์ƒ): SWC ๋„ค์ดํ‹ฐ๋ธŒ ์ง€์›. next.config.js์—์„œ ํ™œ์„ฑํ™”ํ•ฉ๋‹ˆ๋‹ค:

next.config.jsjavascript
const nextConfig = {
  experimental: {
    reactCompiler: true,
  },
};
export default nextConfig;

Vite 8 + @vitejs/plugin-react v6: v6์—์„œ ๋‚ด๋ถ€ Babel์„ ํ๊ธฐํ•˜๊ณ  oxc๋กœ ์ „ํ™˜ํ–ˆ๊ธฐ ๋•Œ๋ฌธ์— ์ปดํŒŒ์ผ๋Ÿฌ์—๋Š” @rolldown/plugin-babel์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค:

vite.config.jsjavascript
import { defineConfig } from 'vite';
import react from '@vitejs/plugin-react';
import babel from '@rolldown/plugin-babel';
import { reactCompilerPreset } from 'babel-plugin-react-compiler';

export default defineConfig({
  plugins: [
    react(),
    babel({ presets: [reactCompilerPreset] }),
  ],
});

Expo SDK 54 ์ด์ƒ: ๊ธฐ๋ณธ์ ์œผ๋กœ ํ™œ์„ฑํ™”๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค. ๋ณ„๋„์˜ ์„ค์ •์ด ํ•„์š”ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

๋ฒ„์ „ ํ˜ธํ™˜์„ฑ

React Compiler v1.0์€ React 17, 18, 19์—์„œ ๋™์ž‘ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ์™„์ „ํ•œ ์ตœ์ ํ™” ๊ธฐ๋Šฅ์€ React 19์—์„œ๋งŒ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ, ๋Ÿฐํƒ€์ž„์ด useMemoCache๋ฅผ ํ†ตํ•œ ์„ธ๋ฐ€ํ•œ ์บ์‹œ ๋ฌดํšจํ™”๋ฅผ ์ง€์›ํ•ฉ๋‹ˆ๋‹ค.

React Compiler vs ์ˆ˜๋™ ๋ฉ”๋ชจ์ด์ œ์ด์…˜: ๋ฉด์ ‘์šฉ ๋น„๊ต

| ํ•ญ๋ชฉ | React Compiler | ์ˆ˜๋™ (useMemo/useCallback) | |------|---------------|----------------------------------| | ์„ธ๋ฐ€๋„ | ๊ฐ’ ์ˆ˜์ค€, ํ‘œํ˜„์‹๋ณ„ | ๋ธ”๋ก ์ˆ˜์ค€, ๊ฐœ๋ฐœ์ž๊ฐ€ ์ •์˜ | | ์กฐ๊ฑด๋ถ€ ๋ฉ”๋ชจ์ด์ œ์ด์…˜ | ์ง€์› | ๋ถˆ๊ฐ€๋Šฅ | | ์œ ์ง€๋ณด์ˆ˜ ๋น„์šฉ | ์ œ๋กœ โ€” ์ž๋™ | ๋†’์Œ โ€” ์˜์กด์„ฑ ๋ฐฐ์—ด, ๋ž˜ํผ ์ปดํฌ๋„ŒํŠธ | | ์ปดํฌ๋„ŒํŠธ ๊ฐ„ | ๋‹จ์ผ ์ปดํฌ๋„ŒํŠธ ๋ฒ”์œ„ | ๋‹จ์ผ ์ปดํฌ๋„ŒํŠธ ๋ฒ”์œ„ | | ์™ธ๋ถ€ ์Šคํ† ์–ด | ์ถ”์ ํ•˜์ง€ ์•Š์Œ | ์ถ”์ ํ•˜์ง€ ์•Š์Œ (useSyncExternalStore ์‚ฌ์šฉ) | | ํด๋ž˜์Šค ์ปดํฌ๋„ŒํŠธ | ์ง€์›ํ•˜์ง€ ์•Š์Œ | N/A (React.memo ์‚ฌ์šฉ) | | ๋นŒ๋“œ ์š”๊ตฌ ์‚ฌํ•ญ | Babel ํ”Œ๋Ÿฌ๊ทธ์ธ ๋˜๋Š” SWC | ์—†์Œ | | ์„ฑ๋Šฅ ์ƒํ•œ | ๋ฆฌ๋ Œ๋” 20-60% ๊ฐ์†Œ (์ผ๋ฐ˜์ ) | ๊ฐœ๋ฐœ์ž ์—ญ๋Ÿ‰์— ๋”ฐ๋ผ ๋‹ค๋ฆ„ |

๋ฉด์ ‘ ์š”์•ฝ: ์ปดํŒŒ์ผ๋Ÿฌ๋Š” ๊ฐœ๋ฐœ์ž๊ฐ€ ์ด์ „์— ์ˆ˜๋™์œผ๋กœ ์ฒ˜๋ฆฌํ•˜๋˜ ๋ฉ”๋ชจ์ด์ œ์ด์…˜์˜ 80-90%๋ฅผ ๋” ์„ธ๋ฐ€ํ•œ ๋‹จ์œ„์™€ ์ œ๋กœ ์œ ์ง€๋ณด์ˆ˜ ์˜ค๋ฒ„ํ—ค๋“œ๋กœ ์ž๋™ํ™”ํ•ฉ๋‹ˆ๋‹ค. ๋‚˜๋จธ์ง€ 10-20%๋Š” ์™ธ๋ถ€ ํ†ตํ•ฉ, ๊ณ ๋น„์šฉ ์—ฐ์‚ฐ, ๋ช…๋ นํ˜• DOM ์ž‘์—…๊ณผ ๊ด€๋ จ๋œ ๋ถ€๋ถ„์ž…๋‹ˆ๋‹ค.

์ž์ฃผ ๋‚˜์˜ค๋Š” ๋ฉด์ ‘ ์งˆ๋ฌธ๊ณผ ๊ฐ„๊ฒฐํ•œ ๋‹ต๋ณ€

Q: React Compiler๋Š” ๋นŒ๋“œ ํƒ€์ž„์— ๋™์ž‘ํ•ฉ๋‹ˆ๊นŒ, ๋Ÿฐํƒ€์ž„์— ๋™์ž‘ํ•ฉ๋‹ˆ๊นŒ? ๋นŒ๋“œ ํƒ€์ž„์— ๋™์ž‘ํ•ฉ๋‹ˆ๋‹ค. ์ปดํŒŒ์ผ๋Ÿฌ๋Š” ์ปดํŒŒ์ผ ๊ณผ์ •์—์„œ ์†Œ์Šค ์ฝ”๋“œ๋ฅผ ๋ณ€ํ™˜ํ•˜๋Š” Babel ํ”Œ๋Ÿฌ๊ทธ์ธ์ž…๋‹ˆ๋‹ค. ์ตœ์ ํ™”๋œ ์ถœ๋ ฅ์€ ์บ์‹œ๋œ ๊ฐ’์„ ์ €์žฅํ•˜๊ธฐ ์œ„ํ•ด ๋Ÿฐํƒ€์ž„ ํ—ฌํผ(useMemoCache)๋ฅผ ์‚ฌ์šฉํ•˜์ง€๋งŒ, ๋ชจ๋“  ๋ถ„์„์€ ๋ฐฐํฌ ์ „์— ์ˆ˜ํ–‰๋ฉ๋‹ˆ๋‹ค.

Q: ๊ธฐ์กด useMemo์™€ useCallback ํ˜ธ์ถœ์„ ์ œ๊ฑฐํ•ด์•ผ ํ•ฉ๋‹ˆ๊นŒ? React ํŒ€์€ ๊ธฐ์กด ์ˆ˜๋™ ๋ฉ”๋ชจ์ด์ œ์ด์…˜์„ ๊ทธ๋Œ€๋กœ ์œ ์ง€ํ•  ๊ฒƒ์„ ๊ถŒ์žฅํ•ฉ๋‹ˆ๋‹ค. ์ œ๊ฑฐํ•˜๋ฉด ์ปดํŒŒ์ผ ๊ฒฐ๊ณผ๊ฐ€ ๋ฏธ๋ฌ˜ํ•˜๊ฒŒ ๋‹ฌ๋ผ์งˆ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ƒˆ๋กœ์šด ์ฝ”๋“œ์—์„œ๋Š” ์ปดํŒŒ์ผ๋Ÿฌ์— ์˜์กดํ•˜๊ณ , ํ”„๋กœํŒŒ์ผ๋ง์„ ํ†ตํ•ด ๊ตฌ์ฒด์ ์ธ ํ•„์š”์„ฑ์ด ํ™•์ธ๋œ ๊ฒฝ์šฐ์—๋งŒ ์ˆ˜๋™ ๋ฉ”๋ชจ์ด์ œ์ด์…˜์„ ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค.

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

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

Q: ์ปดํŒŒ์ผ๋Ÿฌ๋Š” ์ปค์Šคํ…€ ํ›…์„ ์ตœ์ ํ™”ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ? ๋„ค, ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค. ์ปดํŒŒ์ผ๋Ÿฌ๋Š” ์ปดํฌ๋„ŒํŠธ์™€ ํ›… ๋ชจ๋‘๋ฅผ ๋ถ„์„ํ•ฉ๋‹ˆ๋‹ค. ํŒŒ์ƒ ์ƒํƒœ๋ฅผ ๊ณ„์‚ฐํ•˜๋Š” ์ปค์Šคํ…€ ํ›…์˜ ๋ฐ˜ํ™˜ ๊ฐ’์€ ์ž๋™์œผ๋กœ ๋ฉ”๋ชจ์ด์ œ์ด์…˜๋˜๋ฉฐ, ํ•ด๋‹น ํ›…์„ ํ˜ธ์ถœํ•˜๋Š” ๋ชจ๋“  ์ปดํฌ๋„ŒํŠธ์— ํ˜œํƒ์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.

๊ฒฐ๋ก 

  • React Compiler v1.0์€ 7๋‹จ๊ณ„ ์ปดํŒŒ์ผ ํŒŒ์ดํ”„๋ผ์ธ(AST, HIR, SSA, ํƒ€์ž… ์ถ”๋ก , ์ดํŽ™ํŠธ ๋ถ„์„, ๋ฆฌ์•กํ‹ฐ๋ธŒ ๋ถ„์„, ์ฝ”๋“œ ์ƒ์„ฑ)์„ ํ†ตํ•ด ์„ธ๋ฐ€ํ•œ ๊ฐ’ ์ˆ˜์ค€ ๋ฉ”๋ชจ์ด์ œ์ด์…˜์„ ์‚ฝ์ž…ํ•˜๋Š” ๋นŒ๋“œ ํƒ€์ž„ ๋„๊ตฌ์ž…๋‹ˆ๋‹ค
  • ์ปดํŒŒ์ผ๋Ÿฌ๋Š” ์ปดํฌ๋„ŒํŠธ๊ฐ€ React์˜ ๊ทœ์น™์„ ๋”ฐ๋ฅด๋Š” ๊ฒƒ์„ ์ „์ œ๋กœ ํ•˜๋ฉฐ, ์œ„๋ฐ˜ ์‹œ ์กฐ์šฉํžˆ ์ตœ์ ํ™”๋ฅผ ๊ฑด๋„ˆ๋œ๋‹ˆ๋‹ค (eslint-plugin-react-hooks์˜ recommended ํ”„๋ฆฌ์…‹์œผ๋กœ ๊ฐ์ง€ ๊ฐ€๋Šฅ)
  • ์™ธ๋ถ€ ์Šคํ† ์–ด ๊ตฌ๋…, ๋Œ€๊ทœ๋ชจ ๋ฐ์ดํ„ฐ์…‹์˜ ๊ณ ๋น„์šฉ ์—ฐ์‚ฐ, Ref ๊ธฐ๋ฐ˜ ๋ช…๋ นํ˜• ๋กœ์ง, ์ปดํฌ๋„ŒํŠธ ๊ฐ„ ์บ์‹ฑ์—๋Š” ์ˆ˜๋™ ์ตœ์ ํ™”๊ฐ€ ์—ฌ์ „ํžˆ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค
  • ํ”„๋ ˆ์ž„์›Œํฌ๋ณ„ ์„ค์ •: Next.js์—์„œ๋Š” SWC ๋„ค์ดํ‹ฐ๋ธŒ, Vite 8์—์„œ๋Š” @rolldown/plugin-babel, Expo SDK 54 ์ด์ƒ์—์„œ๋Š” ๊ธฐ๋ณธ ํ™œ์„ฑํ™”
  • ๋ฉด์ ‘์—์„œ๋Š” ์ปดํŒŒ์ผ๋Ÿฌ๊ฐ€ ์ž๋™ํ™”ํ•˜๋Š” ์˜์—ญ(๋ฉ”๋ชจ์ด์ œ์ด์…˜์˜ 80-90%)๊ณผ ์ž๋™ํ™”ํ•˜์ง€ ์•Š๋Š” ์˜์—ญ(์™ธ๋ถ€ state, ๊ณ ๋น„์šฉ ์ปดํฌ๋„ŒํŠธ ๊ฐ„ ์—ฐ์‚ฐ, ํด๋ž˜์Šค ์ปดํฌ๋„ŒํŠธ)์„ ๋ชจ๋‘ ๋ช…ํ™•ํžˆ ์„ค๋ช…ํ•  ์ˆ˜ ์žˆ์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค
  • ๊ถŒ์žฅ ๋„์ž… ๊ฒฝ๋กœ๋Š” ๋จผ์ € ESLint ๊ทœ์น™์„ ํ™œ์„ฑํ™”ํ•œ ํ›„ ์ปดํŒŒ์ผ๋Ÿฌ๋ฅผ ํ™œ์„ฑํ™”ํ•˜๋Š” ๋‹จ๊ณ„์  ์ „๋žต์ด๋ฉฐ, ๋ฉด์ ‘๊ด€์€ ์ด ์ ‘๊ทผ ๋ฐฉ์‹์— ๋Œ€ํ•ด ์งˆ๋ฌธํ•  ๊ฒƒ์œผ๋กœ ์˜ˆ์ƒ๋ฉ๋‹ˆ๋‹ค

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

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

ํƒœ๊ทธ

#react
#react-compiler
#memoization
#performance
#interview

๊ณต์œ 

๊ด€๋ จ ๊ธฐ์‚ฌ