[๐Ÿค–] React 19 ์ƒˆ๋กœ์šด ๊ธฐ๋Šฅ: use ํ›…, Actions, ๊ทธ๋ฆฌ๊ณ  ์ปดํŒŒ์ผ๋Ÿฌ ๋ฏธ๋ฆฌ๋ณด๊ธฐ

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

15๋ถ„
๋‹จ์–ด: 1,207๊ฐœ
๊ฒŒ์‹œ๊ธ€ ์ธ๋„ค์ผ
์ •๋ณด

๐Ÿค– ์ด ํฌ์ŠคํŒ…์€ Gemini 2.5 Flash AI๊ฐ€ ์ž‘์„ฑํ–ˆ์–ด์š”.
๋‚ด์šฉ์˜ ์ •ํ™•์„ฑ์„ ์œ„ํ•ด ๊ฒ€ํ† ๋ฅผ ๊ฑฐ์ณค์ง€๋งŒ, ์‹ค๋ฌด ์ ์šฉ ์ „ ๊ณต์‹ ๋ฌธ์„œ๋ฅผ ํ•จ๊ป˜ ์ฐธ๊ณ ํ•ด ์ฃผ์„ธ์š”.

์œ ์šฉํ•œ ํŒ

React 19์˜ ํ•ต์‹ฌ ๋ณ€ํ™”์ธ use ํ›…์œผ๋กœ ๋น„๋™๊ธฐ ๋ฐ์ดํ„ฐ ์ฒ˜๋ฆฌ๋ฅผ ๊ฐ„์†Œํ™”ํ•˜๊ณ , ์„œ๋ฒ„ ์•ก์…˜์œผ๋กœ ํด๋ผ์ด์–ธํŠธ-์„œ๋ฒ„ ํ†ต์‹ ์„ ํšจ์œจ์ ์œผ๋กœ ๋งŒ๋“ค๋ฉฐ, React ์ปดํŒŒ์ผ๋Ÿฌ๊ฐ€ ์–ด๋–ป๊ฒŒ ๋ Œ๋”๋ง ์ตœ์ ํ™”๋ฅผ ์ž๋™ํ™”ํ•˜๋Š”์ง€ ์‹ค์šฉ์ ์ธ ์˜ˆ์‹œ์™€ ํ•จ๊ป˜ ๋ฐฐ์›Œ๋ด์š”.

๐Ÿš€ React 19, ๋ฌด์—‡์ด ๋‹ฌ๋ผ์ง€๋‚˜์š”?

React๋Š” ์›น ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๊ฐœ๋ฐœ์˜ ํ•ต์‹ฌ์ ์ธ ๋„๊ตฌ๋กœ ๋Š์ž„์—†์ด ์ง„ํ™”ํ•˜๊ณ  ์žˆ์–ด์š”.
์ด๋ฒˆ React 19 ๋ฒ„์ „์€ ๋‹จ์ˆœํ•œ ์—…๋ฐ์ดํŠธ๋ฅผ ๋„˜์–ด, ๊ฐœ๋ฐœ์ž๋“ค์ด ์˜ค๋žซ๋™์•ˆ ๊ณ ๋ฏผํ–ˆ๋˜ ๋น„๋™๊ธฐ ๋ฐ์ดํ„ฐ ์ฒ˜๋ฆฌ, ์„œ๋ฒ„์™€์˜ ์ƒํ˜ธ์ž‘์šฉ, ๊ทธ๋ฆฌ๊ณ  ๋ Œ๋”๋ง ์„ฑ๋Šฅ ์ตœ์ ํ™” ๋ฐฉ์‹์— ๊ทผ๋ณธ์ ์ธ ๋ณ€ํ™”๋ฅผ ๊ฐ€์ ธ์˜ฌ ๊ฒƒ์œผ๋กœ ๊ธฐ๋Œ€๋˜๊ณ  ์žˆ์–ด์š”.
ํŠนํžˆ Next.js App Router์™€ ๊ฐ™์€ ์„œ๋ฒ„ ์ปดํฌ๋„ŒํŠธ ํ™˜๊ฒฝ์—์„œ ๋”์šฑ ๊ฐ•๋ ฅํ•œ ์‹œ๋„ˆ์ง€๋ฅผ ๋ฐœํœ˜ํ•  ๊ฒƒ์œผ๋กœ ๋ณด์—ฌ์š”.

0๏ธโƒฃ ์™œ React 19์— ์ฃผ๋ชฉํ•ด์•ผ ํ•˜๋‚˜์š”?

๊ธฐ์กด React ๊ฐœ๋ฐœ์—์„œ ๋น„๋™๊ธฐ ๋ฐ์ดํ„ฐ๋ฅผ ๋‹ค๋ฃจ๊ฑฐ๋‚˜, ์„œ๋ฒ„์™€ ํ†ต์‹ ํ•  ๋•Œ ๋ณต์žกํ•œ ๋กœ์ง๊ณผ ๋ณด์ผ๋Ÿฌํ”Œ๋ ˆ์ดํŠธ ์ฝ”๋“œ๊ฐ€ ๋งŽ์•˜์–ด์š”.
useEffect๋ฅผ ์ด์šฉํ•œ ๋ฐ์ดํ„ฐ ํŽ˜์นญ, useCallback๊ณผ useMemo๋ฅผ ํ†ตํ•œ ์ˆ˜๋™์ ์ธ ์ตœ์ ํ™”, ๊ทธ๋ฆฌ๊ณ  ํด๋ผ์ด์–ธํŠธ์™€ ์„œ๋ฒ„ ๊ฐ„์˜ ๋ฐ์ดํ„ฐ ๋™๊ธฐํ™” ๋“ฑ ์—ฌ๋Ÿฌ ์–ด๋ ค์›€์ด ์žˆ์—ˆ์ฃ .
React 19๋Š” ์ด๋Ÿฌํ•œ ๋ฌธ์ œ๋“ค์„ ํ•ด๊ฒฐํ•˜๊ณ  ๊ฐœ๋ฐœ ๊ฒฝํ—˜์„ ํ˜์‹ ํ•˜๊ธฐ ์œ„ํ•œ ๋‹ค์–‘ํ•œ ๊ธฐ๋Šฅ๋“ค์„ ์„ ๋ณด์ด๊ณ  ์žˆ์–ด์š”.

์ดˆ์ค‘๊ธ‰ ๊ฐœ๋ฐœ์ž๋ผ๋ฉด ์ด๋ฒˆ ์—…๋ฐ์ดํŠธ๋ฅผ ํ†ตํ•ด React์˜ ์ƒˆ๋กœ์šด ํŒจ๋Ÿฌ๋‹ค์ž„์„ ์ดํ•ดํ•˜๊ณ , ๋” ํšจ์œจ์ ์ธ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ๊ตฌ์ถ•ํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์ตํžˆ๋Š” ๊ฒƒ์ด ์ค‘์š”ํ•ด์š”.

โœจ ํ•ต์‹ฌ ๊ธฐ๋Šฅ ์‚ดํŽด๋ณด๊ธฐ

React 19์—์„œ ๊ฐ€์žฅ ์ฃผ๋ชฉํ•  ๋งŒํ•œ ์„ธ ๊ฐ€์ง€ ํ•ต์‹ฌ ๊ธฐ๋Šฅ์€ ๋ฐ”๋กœ use ํ›…, React Actions, ๊ทธ๋ฆฌ๊ณ  React Compiler์˜ˆ์š”.
๊ฐ๊ฐ์˜ ๊ธฐ๋Šฅ์ด ์–ด๋–ค ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๊ณ , ์–ด๋–ป๊ฒŒ ํ™œ์šฉ๋  ์ˆ˜ ์žˆ๋Š”์ง€ ์ž์„ธํžˆ ์•Œ์•„๋ณผ๊นŒ์š”?

1๏ธโƒฃ use ํ›…: ๋น„๋™๊ธฐ ๋ฐ์ดํ„ฐ ์ฒ˜๋ฆฌ์˜ ์ƒˆ๋กœ์šด ํŒจ๋Ÿฌ๋‹ค์ž„

โšก๏ธ use ํ›…์ด๋ž€?

use ํ›…์€ React 19์—์„œ ์ƒˆ๋กœ ๋„์ž…๋œ ํ›…์œผ๋กœ, ์ปดํฌ๋„ŒํŠธ ๋‚ด๋ถ€์—์„œ Promise๋ฅผ ์ง์ ‘ ์ฝ๊ฑฐ๋‚˜ Context๋ฅผ ์กฐ๊ฑด๋ถ€๋กœ ์ฝ์„ ์ˆ˜ ์žˆ๊ฒŒ ํ•ด์ค˜์š”.
๊ธฐ์กด์—๋Š” useEffect๋‚˜ ์™ธ๋ถ€ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ํ†ตํ•ด ๋น„๋™๊ธฐ ๋ฐ์ดํ„ฐ๋ฅผ ์ฒ˜๋ฆฌํ•ด์•ผ ํ–ˆ์ง€๋งŒ, use ํ›… ๋•๋ถ„์— ์ปดํฌ๋„ŒํŠธ๊ฐ€ ๋” ๊ฐ„๊ฒฐํ•˜๊ณ  ์ง๊ด€์ ์œผ๋กœ ๋น„๋™๊ธฐ ๋ฐ์ดํ„ฐ๋ฅผ ๋‹ค๋ฃฐ ์ˆ˜ ์žˆ๊ฒŒ ๋˜์—ˆ์–ด์š”.
๋˜ํ•œ, use ํ›…์€ if ๋ฌธ์ด๋‚˜ for ๋ฃจํ”„์™€ ๊ฐ™์€ ์กฐ๊ฑด๋ถ€ ๋กœ์ง ์•ˆ์—์„œ๋„ ํ˜ธ์ถœ๋  ์ˆ˜ ์žˆ๋‹ค๋Š” ์ ์—์„œ ๊ธฐ์กด ํ›…๋“ค๊ณผ ์ฐจ๋ณ„ํ™”๋ผ์š”.

๐Ÿ’ก ์™œ ์œ ์šฉํ•œ๊ฐ€์š”?

  • ๊ฐ„๊ฒฐํ•œ ๋น„๋™๊ธฐ ๋ฐ์ดํ„ฐ ํŽ˜์นญ: useEffect์™€ useState๋ฅผ ์กฐํ•ฉํ•˜์—ฌ ๋ฐ์ดํ„ฐ๋ฅผ ๊ฐ€์ ธ์˜ค๋˜ ๋ฐฉ์‹๋ณด๋‹ค ํ›จ์”ฌ ๊ฐ„๊ฒฐํ•˜๊ฒŒ Promise์˜ ๊ฒฐ๊ณผ๊ฐ’์„ ์ง์ ‘ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์–ด์š”.
  • ์กฐ๊ฑด๋ถ€ Context ์ ‘๊ทผ: ํŠน์ • ์กฐ๊ฑด์—์„œ๋งŒ Context ๊ฐ’์„ ์ฝ์–ด์•ผ ํ•  ๋•Œ ์œ ์šฉํ•ด์š”.
  • Suspense์™€์˜ ํ†ตํ•ฉ: use ํ›…์€ Promise๊ฐ€ resolve๋  ๋•Œ๊นŒ์ง€ ์ปดํฌ๋„ŒํŠธ ๋ Œ๋”๋ง์„ ์ผ์‹œ ์ค‘์ง€ํ•˜๊ณ  Suspense fallback์„ ๋ณด์—ฌ์ฃผ๋Š” ๋ฐฉ์‹์œผ๋กœ React Suspense์™€ ์ž์—ฐ์Šค๋Ÿฝ๊ฒŒ ํ†ตํ•ฉ๋ผ์š”.

๐Ÿ› ๏ธ ํ™œ์šฉ ์˜ˆ์‹œ

๋‹ค์Œ์€ use ํ›…์„ ์‚ฌ์šฉํ•˜์—ฌ ๋น„๋™๊ธฐ ๋ฐ์ดํ„ฐ๋ฅผ ๊ฐ€์ ธ์˜ค๋Š” ๊ฐ„๋‹จํ•œ ์˜ˆ์‹œ์˜ˆ์š”.
์ด ์˜ˆ์‹œ์—์„œ๋Š” ์‚ฌ์šฉ์ž ๋ชฉ๋ก์„ ๊ฐ€์ ธ์™€์„œ ๋ณด์—ฌ์ฃผ๋Š” ์ปดํฌ๋„ŒํŠธ๋ฅผ ๋งŒ๋“ค์–ด์š”.

import { use, Suspense } from 'react'; interface User { id: number; name: string; email: string; } async function fetchUsers(): Promise<User[]> { const response = await fetch('https://jsonplaceholder.typicode.com/users'); if (!response.ok) { throw new Error('Failed to fetch users'); } return response.json(); } function UserListContent() { // use ํ›…์œผ๋กœ Promise๋ฅผ ์ง์ ‘ ์ฝ์–ด์š”. const users = use(fetchUsers()); return ( <ul> {users.map((user) => ( <li key={user.id}> {user.name} ({user.email}) </li> ))} </ul> ); } export default function UserList() { return ( <div> <h1>์‚ฌ์šฉ์ž ๋ชฉ๋ก</h1> <Suspense fallback={<div>์‚ฌ์šฉ์ž ์ •๋ณด๋ฅผ ๋ถˆ๋Ÿฌ์˜ค๋Š” ์ค‘...</div>}> <UserListContent /> </Suspense> </div> ); }

์œ„ ์ฝ”๋“œ์—์„œ UserListContent ์ปดํฌ๋„ŒํŠธ๋Š” use(fetchUsers())๋ฅผ ํ†ตํ•ด fetchUsers Promise์˜ ๊ฒฐ๊ณผ๋ฅผ ์ง์ ‘ ๋ฐ›์•„์™€์š”.
fetchUsers๊ฐ€ ๋ฐ์ดํ„ฐ๋ฅผ ๊ฐ€์ ธ์˜ค๋Š” ๋™์•ˆ์—๋Š” Suspense ์ปดํฌ๋„ŒํŠธ์˜ fallback์ด ํ‘œ์‹œ๋˜๊ณ , ๋ฐ์ดํ„ฐ๊ฐ€ ์ค€๋น„๋˜๋ฉด UserListContent๊ฐ€ ๋ Œ๋”๋ง๋ผ์š”.
์ด๋Š” ๊ธฐ์กด useEffect์™€ useState๋ฅผ ์‚ฌ์šฉํ•˜๋˜ ๋ฐฉ์‹๋ณด๋‹ค ํ›จ์”ฌ ์ง๊ด€์ ์ด๊ณ  ๊ฐ„๊ฒฐํ•˜์ฃ .

2๏ธโƒฃ React Actions: ํด๋ผ์ด์–ธํŠธ-์„œ๋ฒ„ ์ƒํ˜ธ์ž‘์šฉ์˜ ๊ฐ„์†Œํ™”

โšก๏ธ React Actions๋ž€?

React Actions๋Š” ํด๋ผ์ด์–ธํŠธ ์ปดํฌ๋„ŒํŠธ์—์„œ ์„œ๋ฒ„ ์ฝ”๋“œ๋ฅผ ์ง์ ‘ ํ˜ธ์ถœํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•ด์ฃผ๋Š” ๊ธฐ๋Šฅ์ด์—์š”.
ํŠนํžˆ Next.js App Router์˜ Server Actions์™€ ์œ ์‚ฌํ•œ ๊ฐœ๋…์œผ๋กœ, ํด๋ผ์ด์–ธํŠธ์™€ ์„œ๋ฒ„ ๊ฐ„์˜ ๋ฐ์ดํ„ฐ ์ „์†ก ๋ฐ ์ƒํƒœ ๋ณ€๊ฒฝ ๋กœ์ง์„ ํฌ๊ฒŒ ๋‹จ์ˆœํ™”์‹œ์ผœ์ค˜์š”.
์ด๋Š” <form> ํƒœ๊ทธ์˜ action ์†์„ฑ์ด๋‚˜ startTransition๊ณผ ํ•จ๊ป˜ ์‚ฌ์šฉํ•˜์—ฌ ๋น„๋™๊ธฐ ์ž‘์—…์„ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•ด์ค˜์š”.

๐Ÿ’ก ์™œ ์œ ์šฉํ•œ๊ฐ€์š”?

  • ํด๋ผ์ด์–ธํŠธ-์„œ๋ฒ„ ํ†ต์‹  ๊ฐ„์†Œํ™”: API ์—”๋“œํฌ์ธํŠธ๋ฅผ ์ง์ ‘ ๋งŒ๋“ค๊ณ  fetch ํ˜ธ์ถœ์„ ์ž‘์„ฑํ•  ํ•„์š” ์—†์ด, ์„œ๋ฒ„์—์„œ ์‹คํ–‰๋  ํ•จ์ˆ˜๋ฅผ ์ง์ ‘ ํ˜ธ์ถœํ•  ์ˆ˜ ์žˆ์–ด์š”.
  • ๋ฐ์ดํ„ฐ ๋ณ€๊ฒฝ ์ตœ์ ํ™”: startTransition๊ณผ ํ•จ๊ป˜ ์‚ฌ์šฉํ•˜์—ฌ UI ๋ธ”๋กœํ‚น ์—†์ด ๋ฐ์ดํ„ฐ ๋ณ€๊ฒฝ ์ž‘์—…์„ ์ฒ˜๋ฆฌํ•˜๊ณ , ์ž๋™์œผ๋กœ ์บ์‹œ๋ฅผ ๋ฌดํšจํ™”(revalidate)ํ•  ์ˆ˜ ์žˆ์–ด์š”.
  • ๋ณด์•ˆ ๊ฐ•ํ™”: ํด๋ผ์ด์–ธํŠธ์—์„œ ์ง์ ‘ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์— ์ ‘๊ทผํ•˜๋Š” ๋Œ€์‹ , ์„œ๋ฒ„์—์„œ ์•ˆ์ „ํ•˜๊ฒŒ ๋กœ์ง์„ ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ์–ด์š”.

๐Ÿ› ๏ธ ํ™œ์šฉ ์˜ˆ์‹œ

๋‹ค์Œ์€ React Actions๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ํผ ์ œ์ถœ์„ ์ฒ˜๋ฆฌํ•˜๋Š” ์˜ˆ์‹œ์˜ˆ์š”.
์‚ฌ์šฉ์ž๊ฐ€ ์ž…๋ ฅํ•œ ๋‚ด์šฉ์„ ์„œ๋ฒ„๋กœ ๋ณด๋‚ด๊ณ , ์„œ๋ฒ„์—์„œ ์ฒ˜๋ฆฌํ•œ ํ›„ ๊ฒฐ๊ณผ๋ฅผ ๋ฐ˜ํ™˜๋ฐ›๋Š” ์‹œ๋‚˜๋ฆฌ์˜ค์˜ˆ์š”.

// app/actions.ts (์„œ๋ฒ„์—์„œ ์‹คํ–‰๋  ์•ก์…˜) 'use server'; // ์ด ํŒŒ์ผ์€ ์„œ๋ฒ„์—์„œ ์‹คํ–‰๋จ์„ ๋ช…์‹œํ•ด์š”. export async function createUser(formData: FormData) { const name = formData.get('name'); const email = formData.get('email'); // ์‹ค์ œ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ๋กœ์ง์ด๋‚˜ ์™ธ๋ถ€ API ํ˜ธ์ถœ์„ ์—ฌ๊ธฐ์— ์ž‘์„ฑํ•ด์š”. console.log('์„œ๋ฒ„์—์„œ ์‚ฌ์šฉ์ž ์ƒ์„ฑ ์š”์ฒญ์„ ๋ฐ›์•˜์Šต๋‹ˆ๋‹ค:', { name, email }); // ๋น„๋™๊ธฐ ์ž‘์—…์„ ์‹œ๋ฎฌ๋ ˆ์ด์…˜ํ•ด์š”. await new Promise((resolve) => setTimeout(resolve, 1000)); if (!name || !email) { return { success: false, message: '์ด๋ฆ„๊ณผ ์ด๋ฉ”์ผ์„ ์ž…๋ ฅํ•ด์ฃผ์„ธ์š”.' }; } // ์„ฑ๊ณต์ ์œผ๋กœ ์ฒ˜๋ฆฌ๋˜์—ˆ๋‹ค๊ณ  ๊ฐ€์ •ํ•ด์š”. return { success: true, message: `${name}๋‹˜ ํ™˜์˜ํ•ฉ๋‹ˆ๋‹ค!` }; } // app/page.tsx (ํด๋ผ์ด์–ธํŠธ ์ปดํฌ๋„ŒํŠธ) 'use client'; import { useState, useTransition } from 'react'; import { createUser } from './actions'; export default function RegisterForm() { const [message, setMessage] = useState(''); const [isPending, startTransition] = useTransition(); const handleSubmit = async (event: React.FormEvent<HTMLFormElement>) => { event.preventDefault(); const formData = new FormData(event.currentTarget); startTransition(async () => { const result = await createUser(formData); setMessage(result.message); }); }; return ( <div> <h1>ํšŒ์›๊ฐ€์ž…</h1> <form onSubmit={handleSubmit}> <input type="text" name="name" placeholder="์ด๋ฆ„" required /><br /> <input type="email" name="email" placeholder="์ด๋ฉ”์ผ" required /><br /> <button type="submit" disabled={isPending}> {isPending ? '๋“ฑ๋ก ์ค‘...' : 'ํšŒ์›๊ฐ€์ž…'} </button> </form> {message && <p>{message}</p>} </div> ); }

์œ„ ์˜ˆ์‹œ์—์„œ createUser ํ•จ์ˆ˜๋Š” 'use server' ์ง€์‹œ์–ด๋ฅผ ํ†ตํ•ด ์„œ๋ฒ„์—์„œ ์‹คํ–‰๋˜๋Š” ํ•จ์ˆ˜์ž„์„ ๋ช…์‹œํ•ด์š”.
ํด๋ผ์ด์–ธํŠธ ์ปดํฌ๋„ŒํŠธ์ธ RegisterForm์—์„œ๋Š” ์ด createUser ํ•จ์ˆ˜๋ฅผ ์ผ๋ฐ˜ ํ•จ์ˆ˜์ฒ˜๋Ÿผ ํ˜ธ์ถœํ•  ์ˆ˜ ์žˆ์–ด์š”.
useTransition ํ›…์„ ์‚ฌ์šฉํ•˜์—ฌ UI๊ฐ€ ๋ธ”๋กœํ‚น๋˜์ง€ ์•Š๋„๋ก ๋น„๋™๊ธฐ ์ž‘์—…์„ ์ฒ˜๋ฆฌํ•˜๊ณ , isPending ์ƒํƒœ๋ฅผ ํ†ตํ•ด ๋กœ๋”ฉ UI๋ฅผ ๋ณด์—ฌ์ค„ ์ˆ˜ ์žˆ์–ด์š”.

3๏ธโƒฃ React Compiler: ๋ Œ๋”๋ง ์ตœ์ ํ™”์˜ ์ž๋™ํ™”

โšก๏ธ React Compiler๋ž€?

React Compiler (์ฝ”๋“œ๋„ค์ž„: React Forget)๋Š” React ์ปดํฌ๋„ŒํŠธ์˜ ๋ Œ๋”๋ง ์„ฑ๋Šฅ์„ ์ž๋™์œผ๋กœ ์ตœ์ ํ™”ํ•ด์ฃผ๋Š” ์ปดํŒŒ์ผ๋Ÿฌ์˜ˆ์š”.
๊ธฐ์กด์—๋Š” ๊ฐœ๋ฐœ์ž๊ฐ€ useMemo, useCallback, memo์™€ ๊ฐ™์€ API๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ˆ˜๋™์œผ๋กœ ๋ Œ๋”๋ง ์ตœ์ ํ™”๋ฅผ ์ง„ํ–‰ํ•ด์•ผ ํ–ˆ์ง€๋งŒ, React Compiler๋Š” ์ด๋Ÿฌํ•œ ์ž‘์—…์„ ์ž๋™์œผ๋กœ ์ฒ˜๋ฆฌํ•ด์ค˜์š”.
์ฆ‰, ์ปดํฌ๋„ŒํŠธ๊ฐ€ ๋ถˆํ•„์š”ํ•˜๊ฒŒ ๋ฆฌ๋ Œ๋”๋ง๋˜๋Š” ๊ฒƒ์„ ๋ฐฉ์ง€ํ•˜๊ธฐ ์œ„ํ•ด ํ•„์š”ํ•œ ๊ณณ์— ์ž๋™์œผ๋กœ ๋ฉ”๋ชจ์ด์ œ์ด์…˜์„ ์ ์šฉํ•ด์ฃผ๋Š” ๊ฑฐ์ฃ .

๐Ÿ’ก ์™œ ์œ ์šฉํ•œ๊ฐ€์š”?

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

๐Ÿ› ๏ธ ํ˜„์žฌ ์ƒํƒœ ๋ฐ ๋ฏธ๋ž˜

React Compiler๋Š” ์•„์ง ์ •์‹ ๋ฆด๋ฆฌ์Šค๋œ ๊ธฐ๋Šฅ์€ ์•„๋‹ˆ์ง€๋งŒ, Meta ๋‚ด๋ถ€ ํ”„๋กœ๋•์…˜ ํ™˜๊ฒฝ์—์„œ ์ด๋ฏธ ์‚ฌ์šฉ๋˜๊ณ  ์žˆ์œผ๋ฉฐ ์ ์ง„์ ์œผ๋กœ ์™ธ๋ถ€์—๋„ ๊ณต๊ฐœ๋  ์˜ˆ์ •์ด์—์š”.
React 19์—์„œ ๊ทธ ๊ธฐ๋ฐ˜์ด ๋งˆ๋ จ๋˜๊ณ  ์žˆ์œผ๋ฉฐ, ์•ž์œผ๋กœ React ๊ฐœ๋ฐœ์˜ ํŒจ๋Ÿฌ๋‹ค์ž„์„ ๋ฐ”๊ฟ€ ๊ฐ€์žฅ ์ค‘์š”ํ•œ ๊ธฐ๋Šฅ ์ค‘ ํ•˜๋‚˜๊ฐ€ ๋  ๊ฒƒ์œผ๋กœ ์˜ˆ์ƒ๋ผ์š”.

๐Ÿ“ ์ •๋ฆฌ ๋ฐ ๋‹ค์Œ ์•ก์…˜

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

0๏ธโƒฃ ํ•ต์‹ฌ ์š”์•ฝ

  • use ํ›…: Promise์™€ Context๋ฅผ ์ปดํฌ๋„ŒํŠธ ๋‚ด๋ถ€์—์„œ ์ง์ ‘, ๊ทธ๋ฆฌ๊ณ  ์กฐ๊ฑด๋ถ€๋กœ ์ฝ์„ ์ˆ˜ ์žˆ๊ฒŒ ํ•˜์—ฌ ๋น„๋™๊ธฐ ๋ฐ์ดํ„ฐ ์ฒ˜๋ฆฌ ๋กœ์ง์„ ๊ฐ„์†Œํ™”ํ–ˆ์–ด์š”.
  • React Actions: ํด๋ผ์ด์–ธํŠธ ์ปดํฌ๋„ŒํŠธ์—์„œ ์„œ๋ฒ„ ์ฝ”๋“œ๋ฅผ ์ง์ ‘ ํ˜ธ์ถœํ•˜์—ฌ ํด๋ผ์ด์–ธํŠธ-์„œ๋ฒ„ ํ†ต์‹ ์„ ๋‹จ์ˆœํ™”ํ•˜๊ณ , ๋ฐ์ดํ„ฐ ๋ณ€๊ฒฝ ์ž‘์—…์„ ํšจ์œจ์ ์œผ๋กœ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•ด์ค˜์š”.
  • React Compiler: useMemo, useCallback๊ณผ ๊ฐ™์€ ์ˆ˜๋™ ๋ฉ”๋ชจ์ด์ œ์ด์…˜ ์—†์ด๋„ ์ปดํฌ๋„ŒํŠธ ๋ Œ๋”๋ง์„ ์ž๋™์œผ๋กœ ์ตœ์ ํ™”ํ•˜์—ฌ ๊ฐœ๋ฐœ์ž์˜ ๋ถ€๋‹ด์„ ๋œ์–ด์ฃผ๊ณ  ์ฝ”๋“œ ๋ณต์žก์„ฑ์„ ์ค„์—ฌ์ค˜์š”.

1๏ธโƒฃ ๋‹ค์Œ ์•ก์…˜

React 19์˜ ์ •์‹ ๋ฆด๋ฆฌ์Šค๊ฐ€ ๊ฐ€๊นŒ์›Œ์งˆ์ˆ˜๋ก, ์ด๋Ÿฌํ•œ ์ƒˆ๋กœ์šด ๊ธฐ๋Šฅ๋“ค์„ ๋ฏธ๋ฆฌ ํ•™์Šตํ•˜๊ณ  ์‹ค์Šตํ•ด๋ณด๋Š” ๊ฒƒ์ด ์ค‘์š”ํ•ด์š”.
ํŠนํžˆ Next.js์™€ ๊ฐ™์€ ํ”„๋ ˆ์ž„์›Œํฌ์™€ ํ•จ๊ป˜ ํ™œ์šฉ๋  ๋•Œ ๋”์šฑ ๊ฐ•๋ ฅํ•œ ์‹œ๋„ˆ์ง€๋ฅผ ๋ฐœํœ˜ํ•  ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ, ๊ด€๋ จ ๋ฌธ์„œ๋ฅผ ๊พธ์ค€ํžˆ ์‚ดํŽด๋ณด์‹œ๋Š” ๊ฒƒ์„ ์ถ”์ฒœํ•ด์š”.
์ƒˆ๋กœ์šด React์˜ ๋ฌผ๊ฒฐ์— ์˜ฌ๋ผํƒ€์„œ ๋” ๋‚˜์€ ๊ฐœ๋ฐœ ๊ฒฝํ—˜๊ณผ ๋” ๋†’์€ ์„ฑ๋Šฅ์˜ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ๋งŒ๋“ค์–ด๋ณด์„ธ์š”!

๐Ÿ“ฎ ์ฐธ๊ณ 

์—ฐ๊ด€๋œ ํฌ์ŠคํŠธ