[๐ค] React 19 ์๋ก์ด ๊ธฐ๋ฅ: use ํ , Actions, ๊ทธ๋ฆฌ๊ณ ์ปดํ์ผ๋ฌ ๋ฏธ๋ฆฌ๋ณด๊ธฐ
React 19์ ํต์ฌ ๋ณ๊ฒฝ ์ฌํญ์ธ use ํ , ์๋ฒ ์ก์ , ๊ทธ๋ฆฌ๊ณ React ์ปดํ์ผ๋ฌ์ ๋์ ๋ฐฐ๊ฒฝ๊ณผ ์ค์ ํ์ฉ ์์๋ฅผ ์ด์ค๊ธ ๊ฐ๋ฐ์ ๋๋์ด์ ๋ง์ถฐ ์์ธํ ์ค๋ช ํฉ๋๋ค. ์ต์ React ์ ๋ฐ์ดํธ๋ฅผ ํตํด ์ ํ๋ฆฌ์ผ์ด์ ์ฑ๋ฅ๊ณผ ๊ฐ๋ฐ ๊ฒฝํ์ ํฅ์์ํค๋ ๋ฐฉ๋ฒ์ ์์๋ณด์ธ์.
์ ๋ณด๐ค ์ด ํฌ์คํ ์ 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์ ๋ฌผ๊ฒฐ์ ์ฌ๋ผํ์ ๋ ๋์ ๊ฐ๋ฐ ๊ฒฝํ๊ณผ ๋ ๋์ ์ฑ๋ฅ์ ์ ํ๋ฆฌ์ผ์ด์
์ ๋ง๋ค์ด๋ณด์ธ์!
๐ฎ ์ฐธ๊ณ
- React 19 Release Notes (Canary)
- The
useHook - React Actions (Server Actions)
- React Forget (Compiler) Announcement
์ฐ๊ด๋ ํฌ์คํธ
- ๋จ์ด: 1,878๊ฐ21๋ถ
[๐ค] TypeScript satisfies ์ฐ์ฐ์: ํ์ ์ถ๋ก ๊ณผ ์์ ์ฑ์ ๋์์ ์ก๋ ๋น๋ฒ
TypeScript์ `satisfies` ์ฐ์ฐ์๋ฅผ ํ์ฉํ์ฌ ํ์ ์ถ๋ก ์ ์ ์ฐ์ฑ์ ์ ์งํ๋ฉด์๋ ์๊ฒฉํ ํ์ ์์ ์ฑ์ ํ๋ณดํ๋ ๋ฐฉ๋ฒ์ ์์๋ณด์ธ์. ์ค์ฉ์ ์ธ ์์๋ฅผ ํตํด ์ค์ ํ๋ก์ ํธ์ ์ ์ฉํ๋ ๋ ธํ์ฐ๋ฅผ ๊ณต์ ํฉ๋๋ค.
- ๋จ์ด: 1,512๊ฐ16๋ถ
[๐ค] Next.js App Router ์บ์ฑ ์ ๋ต: ๋ฐ์ดํฐ ์ฌ๊ฒ์ฆ (revalidatePath, revalidateTag) ์๋ฒฝ ๊ฐ์ด๋
Next.js 14 App Router์์ ํจ์จ์ ์ธ ๋ฐ์ดํฐ ์บ์ฑ ์ ๋ต๊ณผ revalidatePath, revalidateTag๋ฅผ ์ด์ฉํ ๋ฐ์ดํฐ ์ฌ๊ฒ์ฆ ๋ฐฉ๋ฒ์ ์ค๋ฌด ์์์ ํจ๊ป ์์ธํ ์์๋ณด๊ณ ์น ์ฑ๋ฅ์ ์ต์ ํํ๋ ๋ฐฉ๋ฒ์ ๋ฐฐ์๋ณด์ธ์.