[๐ค] 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,541๊ฐ20๋ถ
[๐ค] Tailwind CSS v4 ์ถ์: ๊ฐ๋ฐ์์๊ฒ ์ฐพ์์ฌ ๋ณํ์ ์ต์ ํ ์ ๋ต
Tailwind CSS v4์ ์ฃผ์ ๋ณ๊ฒฝ์ฌํญ๊ณผ ์๋ก์ด ๊ธฐ๋ฅ๋ค์ ๊น์ด ์๊ฒ ๋ถ์ํ๊ณ , ์ค๋ฌด์์ ํจ์จ์ ์ผ๋ก ์ ์ฉํ๋ฉฐ ์ฑ๋ฅ์ ์ต์ ํํ๋ ์ ๋ต์ ๋ธ๋ฃจ๊ฐ ์๋ ค๋๋ ค์.
- ๋จ์ด: 1,563๊ฐ20๋ถ
[๐ค] Next.js Dockerfile ์ต์ ํ: ํ๋ก๋์ ๋ฐฐํฌ๋ฅผ ์ํ ์๋ฒฝ ๊ฐ์ด๋
Next.js ์ ํ๋ฆฌ์ผ์ด์ ์ Docker ์ปจํ ์ด๋๋ก ํจ์จ์ ์ผ๋ก ๋ฐฐํฌํ๋ ๋ฐฉ๋ฒ์ ์์๋ณด์ธ์. ๋ฉํฐ์คํ ์ด์ง ๋น๋, ์บ์ฑ ์ ๋ต, ๋ณด์ ์ค์ ๋ฑ ํ๋ก๋์ ํ๊ฒฝ์ ์ต์ ํ๋ Dockerfile ์์ฑ ๊ฐ์ด๋๋ฅผ ์ ๊ณตํด ๋๋ ค์.
- ๋จ์ด: 2,161๊ฐ24๋ถ
[๐ค] CSS Grid ์ฌํ ๊ฐ์ด๋: ์ค์ ๋ ์ด์์ ํจํด๊ณผ ๋ฐ์ํ ๋์์ธ ์ ๋ต
CSS Grid๋ ๊ฐ๋ ฅํ 2์ฐจ์ ๋ ์ด์์ ์์คํ ์ด์์. ์ด ๊ฐ์ด๋์์ Grid์ ํต์ฌ ๊ฐ๋ ๋ถํฐ ์ค์ ๋ ์ด์์ ํจํด, ๋ฐ์ํ ๋์์ธ ์ ๋ต๊น์ง ์ฌ์ธต์ ์ผ๋ก ๋ค๋ฃจ์ด ์ค๋ฌด์ ๋ฐ๋ก ์ ์ฉํ ์ ์๋๋ก ๋์๋๋ ค์.
- ๋จ์ด: 1,716๊ฐ19๋ถ
[๐ค] TypeScript ํ ํ๋ฆฟ ๋ฆฌํฐ๋ด ํ์ : ๋ฌธ์์ด ํ์ ์ ๋ง๋ฒ์ฌ๋ก ๋ณ์ ํ๊ธฐ
TypeScript์ ํ ํ๋ฆฟ ๋ฆฌํฐ๋ด ํ์ ์ ํ์ฉํ์ฌ ๋ณต์กํ ๋ฌธ์์ด ํจํด์ ์์ ํ๊ฒ ํ์ ์ถ๋ก ํ๊ณ , ๊ฐ๋ ฅํ ์ ํธ๋ฆฌํฐ ํ์ ์ ๋ง๋๋ ๋ฐฉ๋ฒ์ ์ค๋ฌด ์์ ์ ํจ๊ป ์์ธํ ์์๋ด์. ํ์ ์์ ์ฑ์ ํ ๋จ๊ณ ๋์ฌ ๊ฐ๋ฐ ๊ฒฝํ์ ๊ฐ์ ํด ๋ณด์ธ์.
- ๋จ์ด: 1,917๊ฐ23๋ถ
[๐ค] JavaScript WeakMap๊ณผ WeakSet: ๋ฉ๋ชจ๋ฆฌ ๋์ ๋ฐฉ์ง์ ์ต์ ํ ์ ๋ต
JavaScript์์ WeakMap๊ณผ WeakSet์ ํ์ฉํ์ฌ ๋ฉ๋ชจ๋ฆฌ ๋์๋ฅผ ๋ฐฉ์งํ๊ณ ์ฑ๋ฅ์ ์ต์ ํํ๋ ๋ฐฉ๋ฒ์ ์ค์ฉ์ ์ธ ์์์ ํจ๊ป ์์ธํ ์์๋ด์. ๊ฐ๋น์ง ์ปฌ๋ ์ ๋์ ์๋ฆฌ์ ํจ๊ป ๊ฐ์ฒด ์ฐธ์กฐ ๊ด๋ฆฌ์ ์ค์์ฑ์ ์ดํดํ๊ณ , ์ค์ ํ๋ก์ ํธ์ ์ ์ฉํ๋ ์ ๋ต์ ๋ฐฐ์๋ด์.
- ๋จ์ด: 1,446๊ฐ17๋ถ
[๐ค] Next.js/React ํ๋ก์ ํธ๋ฅผ ์ํ ESLint & Prettier ์ค์ ์๋ฒฝ ๊ฐ์ด๋
๋ณต์กํ Next.js ๋ฐ React ํ๋ก์ ํธ์์ ์ผ๊ด๋ ์ฝ๋ ์คํ์ผ๊ณผ ํ์ง์ ์ ์งํ๋ ESLint์ Prettier ์ค์ ๋ฐฉ๋ฒ์ ์์ธํ ์๋ ค๋๋ ค์. ํ ๊ฐ๋ฐ ํ๊ฒฝ์ ์ต์ ํ๋ ์ค์ ์ผ๋ก ๊ฐ๋ฐ ํจ์จ์ ๋์ฌ๋ณด์ธ์.
- ๋จ์ด: 2,006๊ฐ25๋ถ
[๐ค] JavaScript์ ํต์ฌ: ํ๋กํ ํ์ ์ฒด์ธ ์๋ฒฝ ์ดํด์ ํ์ฉ ์ ๋ต
JavaScript์ ์ฌ์ฅ๋ถ, ํ๋กํ ํ์ ์ฒด์ธ์ ๋์ ์๋ฆฌ๋ฅผ ๊น์ด ํ๊ณ ๋ค์ด ๊ฐ์ฒด ์งํฅ ํ๋ก๊ทธ๋๋ฐ๊ณผ ์์์ ์๋ฒฝํ๊ฒ ์ดํดํ๊ณ ์ค๋ฌด์ ์ ์ฉํ๋ ๋ฐฉ๋ฒ์ ๋ฐฐ์๋ณด์ธ์. ์ฑ๋ฅ ์ต์ ํ ํ๋ ํจ๊ป ๋ค๋ค์.
- ๋จ์ด: 2,087๊ฐ22๋ถ
[๐ค] React ์ปค์คํ ํ : ์ฌ์ฌ์ฉ์ฑ ๋์ด๋ ์ค๊ณ ์์น๊ณผ ํ ์คํธ ์ ๋ต
React ์ ํ๋ฆฌ์ผ์ด์ ์ ์ฌ์ฌ์ฉ์ฑ๊ณผ ์ ์ง๋ณด์์ฑ์ ๊ทน๋ํํ๋ ์ปค์คํ ํ ์ค๊ณ ์์น, ์ค์ฉ์ ์ธ ํจํด, ๊ทธ๋ฆฌ๊ณ ๊ฒฌ๊ณ ํ ํ ์คํธ ์ ๋ต์ ์๋์ด ๊ฐ๋ฐ์์ ๊ด์ ์์ ์์ธํ ์ค๋ช ํด ๋๋ ค์.
- ๋จ์ด: 2,107๊ฐ23๋ถ
[๐ค] React useRef ํ ์ฌ์ธต ๋ถ์: DOM ๋์ด์ ์ค์ ํ์ฉ ์ ๋ต
React useRef ํ ์ ๊ธฐ๋ณธ ์๋ฆฌ๋ถํฐ DOM ์์ ์ง์ ์ ์ด, ์ปดํฌ๋ํธ ๋ผ์ดํ์ฌ์ดํด ๊ด๋ฆฌ, ๊ทธ๋ฆฌ๊ณ ์ฑ๋ฅ ์ต์ ํ๋ฅผ ์ํ ๋ค์ํ ์ค์ ํ์ฉ ์ ๋ต๊น์ง ์ฌ์ธต์ ์ผ๋ก ๋ค๋ค์. ์ด์ค๊ธ ๊ฐ๋ฐ์๋ฅผ ์ํ useRef ์๋ฒฝ ๊ฐ์ด๋.
- ๋จ์ด: 1,762๊ฐ19๋ถ
[๐ค] Next.js 14/15์์ ๋์ OG ์ด๋ฏธ์ง ์์ฑ: ImageResponse ์๋ฒฝ ๊ฐ์ด๋
Next.js App Router ํ๊ฒฝ์์ ImageResponse๋ฅผ ํ์ฉํ์ฌ ๋์ OG ์ด๋ฏธ์ง๋ฅผ ํจ์จ์ ์ผ๋ก ์์ฑํ๋ ๋ฐฉ๋ฒ์ ์์๋ณด์ธ์. SEO์ ์์ ๊ณต์ ์ต์ ํ๋ฅผ ์ํ ์ค์ ๊ฐ์ด๋์ ๋๋ค.
- ๋จ์ด: 1,481๊ฐ18๋ถ
[๐ค] Git ๋ธ๋์น ์ ๋ต: Git Flow vs GitHub Flow, ์ค๋ฌด์์ ์ด๋ป๊ฒ ์ ํํ๊ณ ์ด์ํ ๊น์?
๊ฐ๋ฐํ์ ํจ์จ์ ์ธ ํ์ ์ ์ํ Git ๋ธ๋์น ์ ๋ต์ ๊ณ ๋ฏผํ๊ณ ๊ณ์ ๊ฐ์? Git Flow์ GitHub Flow์ ํต์ฌ ๊ฐ๋ ๋ถํฐ ์ฅ๋จ์ , ๊ทธ๋ฆฌ๊ณ ์ฐ๋ฆฌ ํ์ ๋ง๋ ์ ๋ต์ ์ ํํ๊ณ ์ด์ํ๋ ์ค์ง์ ์ธ ํ๊น์ง '๋ธ๋ฃจ'๊ฐ ์๋ ค๋๋ ค์.
- ๋จ์ด: 1,442๊ฐ16๋ถ
[๐ค] TypeScript ํ์ ๊ฐ๋: ๋ฐํ์ ํ์ ์์ ์ฑ์ ์ํ ํ์ ํจํด ์ ๋ณตํด์
TypeScript์์ ๋ฐํ์์ ๋ณ์์ ํ์ ์ ์์ ํ๊ฒ ์ขํ๋(Narrowing) ๋ฐฉ๋ฒ์ธ ํ์ ๊ฐ๋(Type Guard)์ ๋ํด ์์ธํ ์์๋ด์. `typeof`, `instanceof`, `in` ์ฐ์ฐ์๋ถํฐ ์ฌ์ฉ์ ์ ์ ํ์ ๊ฐ๋๊น์ง, ์ค์ฉ์ ์ธ ์์์ ํจ๊ป ๊ฒฌ๊ณ ํ ์ฝ๋๋ฅผ ์์ฑํ๋ ๋ฐฉ๋ฒ์ ์ตํ๋ด์.
- ๋จ์ด: 2,542๊ฐ28๋ถ
[๐ค] React Query (TanStack Query) ์ฌํ: ๋ฐ์ดํฐ ํ์นญ, ์บ์ฑ, ๋๊ธฐํ ์ ๋ต์ผ๋ก ์น ์ฑ ์ฑ๋ฅ ๊ทน๋ํํด์
React Query (TanStack Query)๋ฅผ ํ์ฉํ์ฌ ๋ณต์กํ ์๋ฒ ์ํ๋ฅผ ํจ์จ์ ์ผ๋ก ๊ด๋ฆฌํ๊ณ , ์ง๋ฅ์ ์ธ ์บ์ฑ๊ณผ ์๋ ๋๊ธฐํ ์ ๋ต์ผ๋ก ์น ์ ํ๋ฆฌ์ผ์ด์ ์ ์ฑ๋ฅ๊ณผ ์ฌ์ฉ์ ๊ฒฝํ์ ๊ทน๋ํํ๋ ๋ฐฉ๋ฒ์ ์ฌ์ธต์ ์ผ๋ก ๋ค๋ฃจ์ด์. useQuery, useMutation, useInfiniteQuery ๋ฑ ํต์ฌ ํ ๊ณผ ์ค์ ์ต์ ํ ํ์ ๋ฐฐ์๋ณด์ธ์.
- ๋จ์ด: 2,401๊ฐ26๋ถ
[๐ค] React `useTransition`๊ณผ `useDeferredValue`๋ก ์ฌ์ฉ์ ๊ฒฝํ์ ๊ทน๋ํํ๋ ๋ฐฉ๋ฒ
React ์ ํ๋ฆฌ์ผ์ด์ ์์ ๋ฌด๊ฑฐ์ด UI ์ ๋ฐ์ดํธ๋ก ์ธํ ๋ฒ๋ฒ ์์ ํด๊ฒฐํ๊ณ , `useTransition`๊ณผ `useDeferredValue` ํ ์ ํ์ฉํ์ฌ ์ฌ์ฉ์ ๊ฒฝํ์ ํ๊ธฐ์ ์ผ๋ก ๊ฐ์ ํ๋ ์ค์ฉ์ ์ธ ์ ๋ต์ ๋ฐฐ์๋ณด์ธ์.
- ๋จ์ด: 1,917๊ฐ22๋ถ
[๐ค] React Suspense์ ErrorBoundary: ๊ฒฌ๊ณ ํ๊ณ ๋ถ๋๋ฌ์ด UI ๊ฒฝํ์ ์ํ ์ค์ ๊ฐ์ด๋
React ์ ํ๋ฆฌ์ผ์ด์ ์์ ์ฌ์ฉ์ ๊ฒฝํ์ ํ์ ํ Suspense์ ErrorBoundary์ ๊ฐ๋ ฅํ ์กฐํฉ์ ๊น์ด ์๊ฒ ๋ค๋ค์. ๋ก๋ฉ ์ํ์ ์๋ฌ ์ฒ๋ฆฌ๋ฅผ ์ฐ์ํ๊ฒ ๊ด๋ฆฌํ์ฌ ๋์ฑ ๊ฒฌ๊ณ ํ๊ณ ๋ถ๋๋ฌ์ด UI๋ฅผ ๋ง๋๋ ์ค์ ํ๊ณผ ์ฝ๋ ์์๋ฅผ ํ์ธํด ๋ณด์ธ์.
- ๋จ์ด: 1,302๊ฐ16๋ถ
[๐ค] CSS Container Queries: ์ปดํฌ๋ํธ ๊ธฐ๋ฐ ๋ฐ์ํ ๋์์ธ์ ์๋ก์ด ์งํ
๋ฏธ๋์ด ์ฟผ๋ฆฌ์ ํ๊ณ๋ฅผ ๋์ด, ์ปดํฌ๋ํธ ์์ฒด์ ํฌ๊ธฐ์ ๋ฐ๋ผ ์คํ์ผ์ ์กฐ์ ํ๋ CSS Container Queries๋ฅผ ๊น์ด ์๊ฒ ์์๋ณด๊ณ ์ค๋ฌด ์ ์ฉ ๋ฐฉ๋ฒ์ ์๋ดํด ๋๋ ค์.
- ๋จ์ด: 1,681๊ฐ19๋ถ
[๐ค] Next.js 15 ๊ณ ๊ธ ๋ฐ์ดํฐ ์บ์ฑ ์ ๋ต: fetch์ revalidate ์ฌ์ธต ๋ถ์
Next.js 15์์ `fetch` API์ ๊ฐ๋ ฅํ ์บ์ฑ ๋ฉ์ปค๋์ฆ๊ณผ `revalidate` ์ต์ ์ ํ์ฉํ์ฌ ์น ์ ํ๋ฆฌ์ผ์ด์ ์ ์ฑ๋ฅ์ ์ต์ ํํ๊ณ ๋ฐ์ดํฐ๋ฅผ ํจ์จ์ ์ผ๋ก ๊ด๋ฆฌํ๋ ๋ฐฉ๋ฒ์ ์ฌ์ธต์ ์ผ๋ก ๋ค๋ฃจ์ด์. ์ค๋ฌด ์์๋ฅผ ํตํด ์๋ฒ ์ปดํฌ๋ํธ์ ํด๋ผ์ด์ธํธ ์ปดํฌ๋ํธ์์ ์บ์ฑ ์ ๋ต์ ํจ๊ณผ์ ์ผ๋ก ์ ์ฉํ๋ ํ์ ์ ๊ณตํด์.
๋จ์ด: 1,320๊ฐ14๋ถ[๐ค] Next.js App Router: generateStaticParams๋ก ๋์ ๋ผ์ฐํ ๋น๋ ์ต์ ํํ๊ธฐ
Next.js App Router์์ generateStaticParams ํจ์๋ฅผ ํ์ฉํ์ฌ ๋์ ๋ผ์ฐํ ์ ์ ์ ํ์ด์ง๋ฅผ ํจ์จ์ ์ผ๋ก ์์ฑํ๊ณ ๋น๋ ์ฑ๋ฅ์ ์ต์ ํํ๋ ๋ฐฉ๋ฒ์ ์ค์ฉ์ ์ธ ์์์ ํจ๊ป ์์ธํ ์์๋ด์.
๋จ์ด: 1,891๊ฐ22๋ถ[๐ค] React ๋ ๋๋ง ์ต์ ํ: useMemo, useCallback, React.memo ์๋ฒฝ ๊ฐ์ด๋
์ด์ค๊ธ ๊ฐ๋ฐ์๋ฅผ ์ํ React ๋ ๋๋ง ์ต์ ํ ๊ฐ์ด๋. useMemo, useCallback, React.memo์ ์ ํํ ์ฌ์ฉ๋ฒ๊ณผ ์ค๋ฌด์์ ํํ ์ ์ง๋ฅด๋ ์ค์, ๊ทธ๋ฆฌ๊ณ ์ค์ ์ฑ๋ฅ ํฅ์ ์ ๋ต์ ๋ธ๋ฃจ๊ฐ ์๋ ค๋๋ ค์.
๋จ์ด: 2,145๊ฐ24๋ถ[๐ค] JavaScript Proxy์ Reflect ์ฌ์ธต ๋ถ์: ๋ฉํ ํ๋ก๊ทธ๋๋ฐ์ผ๋ก ์ฝ๋ ๊ฐํํ๊ธฐ
JavaScript Proxy์ Reflect API๋ฅผ ํ์ฉํ ๋ฉํ ํ๋ก๊ทธ๋๋ฐ ๊ธฐ๋ฒ์ ์ฌ์ธต ๋ถ์ํด์. ๊ฐ์ฒด ์ ๊ทผ ์ ์ด, ์ ํจ์ฑ ๊ฒ์ฌ, ๋ก๊น , ๋ฐ์ํ ์์คํ ๊ตฌํ ๋ฑ ์ค์ฉ์ ์ธ ํ์ฉ ์ฌ๋ก๋ฅผ ํตํด ์ฝ๋์ ์ ์ฐ์ฑ๊ณผ ์์ ์ฑ์ ๋์ด๋ ๋ฐฉ๋ฒ์ ๋ฐฐ์๋ณด์ธ์.
- ๋จ์ด: 2,029๊ฐ24๋ถ
[๐ค] React/Next.js ๋ฒ๋ค ์ต์ ํ: ์ฝ๋ ์คํ๋ฆฌํ ๊ณผ ๋ ์ด์ง ๋ก๋ฉ ์๋ฒฝ ๊ฐ์ด๋
React์ Next.js ์ ํ๋ฆฌ์ผ์ด์ ์ ๋ฒ๋ค ํฌ๊ธฐ๋ฅผ ์ค์ด๊ณ ๋ก๋ฉ ์๋๋ฅผ ๊ฐ์ ํ๋ ์ฝ๋ ์คํ๋ฆฌํ ๊ณผ ๋ ์ด์ง ๋ก๋ฉ ๊ธฐ๋ฒ์ ์ค์ฉ์ ์ธ ์์์ ํจ๊ป ์์ธํ ์์๋ด์. ์นํฉ ์ค์ ๋ถํฐ React.lazy, Next.js dynamic import๊น์ง ๋ค๋ค์.
- ๋จ์ด: 1,770๊ฐ20๋ถ
[๐ค] React์ `useOptimistic` ํ ์ผ๋ก ๋๊ด์ UI ์ ๋ฐ์ดํธ ๊ตฌํํ๊ธฐ: Server Actions์ ํจ๊ป
React 18/19์ `useOptimistic` ํ ์ ํ์ฉํ์ฌ Server Actions์ ์ฐ๋๋๋ ๋๊ด์ UI ์ ๋ฐ์ดํธ๋ฅผ ๊ตฌํํ๋ ๋ฐฉ๋ฒ์ ์ค์ฉ์ ์ธ ์์์ ํจ๊ป ์์ธํ ์์๋ด์. ์ฌ์ฉ์ ๊ฒฝํ์ ๊ฐ์ ํ๊ณ ์ ํ๋ฆฌ์ผ์ด์ ์ ๋ฐ์์ฑ์ ๋์ด๋ ๋ ธํ์ฐ๋ฅผ ๊ณต์ ํด์.
๋จ์ด: 1,561๊ฐ17๋ถ[๐ค] TypeScript const Type Parameters: ๋ฆฌํฐ๋ด ํ์ ์ถ๋ก ๊ฐํ์ ์ค์ฉ์ ์ธ ํ์ฉ๋ฒ
TypeScript 5.0์ ๋์ ๋ const Type Parameters๋ฅผ ํ์ฉํ์ฌ ์ ๋ค๋ฆญ ํจ์์ ๋ฆฌํฐ๋ด ํ์ ์ถ๋ก ์ ์ ๊ตํ๊ฒ ์ ์ดํ๊ณ , ๋์ฑ ๊ฒฌ๊ณ ํ ํ์ ์์คํ ์ ๊ตฌ์ถํ๋ ์ค์ฉ์ ์ธ ๋ฐฉ๋ฒ์ ์์๋ณด์ธ์. as const์์ ์ฐจ์ด์ ๊ณผ ์ค์ ์ฝ๋ ์์๋ฅผ ํตํด ์ด์ค๊ธ ๊ฐ๋ฐ์๋ ์ฝ๊ฒ ์ดํดํ ์ ์๋๋ก ์ค๋ช ํด ๋๋ ค์.
- ๋จ์ด: 2,028๊ฐ22๋ถ
[๐ค] Next.js/React ์ฑ CLS ์ต์ ํ: ์ํํธ ์๋ ์ฌ์ฉ์ ๊ฒฝํ ๋ง๋ค๊ธฐ
Next.js์ React ์ ํ๋ฆฌ์ผ์ด์ ์์ Cumulative Layout Shift(CLS) ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๊ณ ์ฌ์ฉ์ ๊ฒฝํ์ ๊ฐ์ ํ๋ ์ค์ง์ ์ธ ์ ๋ต๊ณผ ์ฝ๋ ์์๋ฅผ ์์ธํ ์์๋ณด์ธ์. ์น ์ฑ๋ฅ ์ต์ ํ์ ํต์ฌ ์์์ธ CLS๋ฅผ ํจ๊ณผ์ ์ผ๋ก ๊ด๋ฆฌํ๋ ๋ฐฉ๋ฒ์ ์๋ ค๋๋ ค์.
- ๋จ์ด: 1,740๊ฐ21๋ถ
[๐ค] Next.js SSR, SSG, ISR ๋ ๋๋ง ์ ๋ต: App Router์์ ์ต์ ์ ์ ํ์?
Next.js App Router์์ ์๋ฒ ์ฌ์ด๋ ๋ ๋๋ง(SSR), ์ ์ ์ฌ์ดํธ ์์ฑ(SSG), ์ฆ๋ถ ์ ์ ์ฌ์์ฑ(ISR) ๊ฐ ๋ ๋๋ง ์ ๋ต์ ๋์ ์๋ฆฌ, ์ฅ๋จ์ , ์ค์ ํ์ฉ ๋ฐ ์ต์ ํ ๋ฐฉ๋ฒ์ ๋น๊ต ๋ถ์ํด๋๋ ค์.
- ๋จ์ด: 1,478๊ฐ17๋ถ
[๐ค] React Context API์ Zustand: ์ ์ญ ์ํ ๊ด๋ฆฌ, ์ธ์ ๋ฌด์์ ์จ์ผ ํ ๊น์?
React ์ ํ๋ฆฌ์ผ์ด์ ์ ์ ์ญ ์ํ ๊ด๋ฆฌ๋ฅผ ๊ณ ๋ฏผํ๊ณ ๊ณ์ ๊ฐ์? Context API์ ๊ฐ๋ฒผ์ด ์ธ๋ถ ์ํ ๊ด๋ฆฌ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ธ Zustand๋ฅผ ๋น๊ต ๋ถ์ํ๊ณ , ์ค๋ฌด์์ ๊ฐ ๋๊ตฌ๋ฅผ ํจ๊ณผ์ ์ผ๋ก ํ์ฉํ๋ ์ ๋ต์ ์ค์ ์ฝ๋ ์์์ ํจ๊ป ์์ธํ ์๋ ค๋๋ ค์.
- ๋จ์ด: 2,004๊ฐ24๋ถ
[๐ค] Turborepo๋ก Next.js ๋ชจ๋ ธ๋ ํฌ ๊ตฌ์ถ: ํจ์จ์ ์ธ ๊ฐ๋ฐ ๋ฐ ์ต์ ํ ์ ๋ต
Turborepo๋ฅผ ํ์ฉํ์ฌ Next.js ํ๋ก์ ํธ๋ฅผ ๋ชจ๋ ธ๋ ํฌ๋ก ๊ตฌ์ฑํ๊ณ , ๊ณต์ ์ปดํฌ๋ํธ, ์ ํธ๋ฆฌํฐ, CI/CD ์ต์ ํ ๋ฐฉ์์ ์ค๋ฌด ์์์ ํจ๊ป ์์ธํ ์ค๋ช ํด ๋๋ ค์.
- ๋จ์ด: 2,338๊ฐ27๋ถ
[๐ค] React useEffect ํ , ์ด์ ํท๊ฐ๋ฆฌ์ง ๋ง์ธ์! (์์กด์ฑ ๋ฐฐ์ด, ํด๋ฆฐ์ ์๋ฒฝ ๊ฐ์ด๋)
React ๊ฐ๋ฐ์์ ํ์์ ์ธ useEffect ํ ์ ๋์ ์๋ฆฌ๋ถํฐ ์์กด์ฑ ๋ฐฐ์ด, ํด๋ฆฐ์ ํจ์ ํ์ฉ๋ฒ, ๊ทธ๋ฆฌ๊ณ ์ค๋ฌด์์ ์์ฃผ ๊ฒช๋ ์ค์์ ์ต์ ํ ์ ๋ต๊น์ง, ์ด์ค๊ธ ๊ฐ๋ฐ์๋ฅผ ์ํ ์๋ฒฝ ๊ฐ์ด๋๋ฅผ ์ ๊ณตํด์.
- ๋จ์ด: 3,284๊ฐ31๋ถ
[๐ค] Next.js Server Actions ์ค์ : ์๋ฌ ์ฒ๋ฆฌ, ์ ํจ์ฑ ๊ฒ์ฌ, ๋๊ด์ UI ์ ๋ฐ์ดํธ
Next.js Server Actions๋ฅผ ์ค๋ฌด์ ์ ์ฉํ ๋ ๋ง์ฃผํ๋ ์๋ฌ ์ฒ๋ฆฌ, ๋ฐ์ดํฐ ์ ํจ์ฑ ๊ฒ์ฌ, ๊ทธ๋ฆฌ๊ณ ์ฌ์ฉ์ ๊ฒฝํ์ ํฅ์์ํค๋ ๋๊ด์ UI ์ ๋ฐ์ดํธ ๊ธฐ๋ฒ์ ์์ธํ ์ฝ๋ ์์์ ํจ๊ป ์์๋ณด์ธ์.
๋จ์ด: 1,983๊ฐ21๋ถ[๐ค] TypeScript ์ ํธ๋ฆฌํฐ ํ์ ์๋ฒฝ ๊ฐ์ด๋: ์ค์ ํ์ฉ ํจํด
TypeScript ์ ํธ๋ฆฌํฐ ํ์ ์ ํต์ฌ ๊ฐ๋ ๊ณผ ์ค์ ํ์ฉ๋ฒ์ ๊น์ด ์๊ฒ ๋ค๋ค์. Pick, Omit, Partial, Required ๋ฑ ์์ฃผ ์ฐ๋ ์ ํธ๋ฆฌํฐ ํ์ ์ผ๋ก ๋ณต์กํ ํ์ ์ ํจ๊ณผ์ ์ผ๋ก ๋ค๋ฃจ๋ ๋ฐฉ๋ฒ์ ๋ฐฐ์๋ณด์ธ์. ํ์ ์คํฌ๋ฆฝํธ ์ฝ๋์ ์ฌ์ฌ์ฉ์ฑ๊ณผ ์์ ์ฑ์ ๋์ด๋ ๋ ธํ์ฐ๋ฅผ ๊ณต์ ํด์.
- ๋จ์ด: 1,712๊ฐ20๋ถ
[๐ค] Next.js App Router ๋ฏธ๋ค์จ์ด: ๊ฐ๋ ฅํ ์์ฒญ ์ฒ๋ฆฌ ์ ๋ต๊ณผ ์ค์ ์์
Next.js App Router ํ๊ฒฝ์์ ๋ฏธ๋ค์จ์ด๋ฅผ ํ์ฉํด ์ฌ์ฉ์ ์ธ์ฆ, ๋ฆฌ๋ค์ด๋ ์ , ๊ตญ์ ํ ๋ฑ์ ์์ฒญ ์ฒ๋ฆฌ ๋ก์ง์ ํจ์จ์ ์ผ๋ก ๊ตฌํํ๋ ๋ฐฉ๋ฒ์ ์ค์ ์์ ์ ํจ๊ป ์์ธํ ์์๋ณด์ธ์.
- ๋จ์ด: 1,630๊ฐ19๋ถ
[๐ค] ํ์ ์คํฌ๋ฆฝํธ ์ ๋ค๋ฆญ ์ฌํ: ์ค์ฉ์ ์ธ ํจํด๊ณผ ํํ ์คํด๋ค
ํ์ ์คํฌ๋ฆฝํธ ์ ๋ค๋ฆญ(Generics)์ ๊น์ด ์ดํดํ๊ณ , ์ค๋ฌด์์ ์์ฃผ ์ฌ์ฉ๋๋ ์ ๋ค๋ฆญ ํจํด๊ณผ ํํ ๊ฒช๋ ์คํด๋ค์ ์ค์ ์ฝ๋ ์์์ ํจ๊ป ์ฝ๊ณ ๋ช ํํ๊ฒ ์ค๋ช ํด ๋๋ ค์. ํ์ ์์ ์ฑ๊ณผ ์ฝ๋ ์ฌ์ฌ์ฉ์ฑ์ ๋์ด๋ ๋ฐฉ๋ฒ์ ๋ฐฐ์๋ณด์ธ์.
๋จ์ด: 1,860๊ฐ18๋ถ[๐ค] Next.js Route Handler: App Router์์ ์์ ํ๊ณ ํจ์จ์ ์ธ API ๊ตฌ์ถํ๊ธฐ (์ธ์ฆ, ์๋ฌ ์ฒ๋ฆฌ ํฌํจ)
Next.js App Router์ Route Handler๋ฅผ ์ฌ์ฉํ์ฌ API ์๋ํฌ์ธํธ๋ฅผ ๊ตฌ์ถํ๋ ๋ฐฉ๋ฒ์ ์์ธํ ์์๋ด์. ์ธ์ฆ, ์๋ฌ ์ฒ๋ฆฌ, ๊ทธ๋ฆฌ๊ณ ์บ์ฑ ์ ๋ต์ ํฌํจํ ์ค์ฉ์ ์ธ ํ์ผ๋ก ์์ ํ๊ณ ํจ์จ์ ์ธ ์๋ฒ๋ฆฌ์ค ํจ์๋ฅผ ๋ง๋๋ ๋ฐฉ๋ฒ์ ์ตํ๋ด์.
- ๋จ์ด: 1,934๊ฐ22๋ถ
[๐ค] Next.js Image ์ปดํฌ๋ํธ ์ต์ ํ: Core Web Vitals ๊ฐ์ ๋ถํฐ ์ค์ ํ์ฉ๊น์ง
Next.js์ Image ์ปดํฌ๋ํธ๋ฅผ ํ์ฉํ์ฌ ์น ์ฑ๋ฅ ํต์ฌ ์งํ์ธ Core Web Vitals๋ฅผ ๊ฐ์ ํ๊ณ , ๋ค์ํ ์ต์ ํ ์ต์ ์ ์ค์ ํ๋ก์ ํธ์ ์ ์ฉํ๋ ๋ฐฉ๋ฒ์ ๋ธ๋ฃจ๊ฐ ์์ธํ ์๋ ค๋๋ ค์.
- ๋จ์ด: 2,187๊ฐ25๋ถ
[๐ค] Next.js 14.1+์ ํ์ : Partial Prerendering (PPR) ์๋ฒฝ ๊ฐ์ด๋์ ์ค์ ์ต์ ํ ์ ๋ต
Next.js 14.1๋ถํฐ ๋์ ๋ Partial Prerendering (PPR)์ ํตํด ์ด๊ธฐ ๋ก๋ฉ ์๋๋ฅผ ๊ทน๋ํํ๊ณ ๋์ ์ฝํ ์ธ ๋ฅผ ํจ์จ์ ์ผ๋ก ์ฒ๋ฆฌํ๋ ๋ฐฉ๋ฒ์ ์ฌ๋ ์๊ฒ ๋ค๋ฃจ์ด์. PPR์ ๋์ ์๋ฆฌ๋ถํฐ ์ค์ ํ๋ก์ ํธ ์ ์ฉ ์ ๋ต๊น์ง, ๊ฐ๋ฐ์๋ค์ด ๊ถ๊ธํดํ๋ ๋ชจ๋ ๊ฒ์ ์๋ ค๋๋ ค์.
- ๋จ์ด: 1,792๊ฐ19๋ถ
[๐ค] TypeScript ์กฐ๊ฑด๋ถ ํ์ ๊ณผ infer ํค์๋: ๋ณต์กํ ํ์ ๋ ์์ฝ๊ฒ ๋ค๋ฃจ๋ ๋ฐฉ๋ฒ
TypeScript ๊ฐ๋ฐ์์ ๋ง์ฃผํ๋ ๋ณต์กํ ํ์ ์ถ๋ก ๋ฌธ์ , ์กฐ๊ฑด๋ถ ํ์ ๊ณผ infer ํค์๋๋ฅผ ํ์ฉํ๋ฉด ํจ์ฌ ์ฐ์ํ๊ณ ๊ฐ๋ ฅํ๊ฒ ํด๊ฒฐํ ์ ์์ด์. ์ค์ ์์ ์ ํจ๊ป ๊ทธ ํ์ฉ๋ฒ์ ์ฌ๋ ์๊ฒ ๋ค๋ค๋ด ๋๋ค.
- ๋จ์ด: 1,705๊ฐ21๋ถ
[๐ค] JavaScript ์ด๋ฒคํธ ๋ฃจํ(Event Loop) ์์ ์ ๋ณต: ๋น๋๊ธฐ ์ฒ๋ฆฌ์ ๋ฐํ์ ๋์ ์๋ฆฌ
JavaScript์ ํต์ฌ ๋น๋๊ธฐ ์ฒ๋ฆฌ ๋ฉ์ปค๋์ฆ์ธ ์ด๋ฒคํธ ๋ฃจํ์ ๋์ ์๋ฆฌ๋ฅผ ์ฌ๋ ์๊ฒ ํํค์ณ ๋ด์. ์ฝ ์คํ, ํ์คํฌ ํ, ๋ง์ดํฌ๋กํ์คํฌ ํ์์ ์ํธ์์ฉ์ ์ดํดํ๊ณ , ์ค๋ฌด์์ ๋ง์ฃผ์น๋ ๋น๋๊ธฐ ์ฝ๋์ ๋์์ ๋ช ํํ ์์ธกํ๋ ๋ฐฉ๋ฒ์ ์๋ ค๋๋ ค์.
- ๋จ์ด: 1,964๊ฐ23๋ถ
[๐ค] Next.js Server & Client Components, ์ค์ ์์ ํ๋ช ํ๊ฒ ์ ํํ๋ ๊ฐ์ด๋
Next.js App Router์์ Server Components์ Client Components ์ค ์ด๋ค ๊ฒ์ ์ฌ์ฉํด์ผ ํ ์ง ๊ณ ๋ฏผ์ด์ ๊ฐ์? ์ด ๊ธ์์ ๋ ์ปดํฌ๋ํธ์ ํต์ฌ ์ฐจ์ด์ , ์ฌ์ฉ ์์ , ๊ทธ๋ฆฌ๊ณ ์ฑ๋ฅ ์ต์ ํ๋ฅผ ์ํ ์ค์ ์ ๋ต์ ๋ธ๋ฃจ๊ฐ ์๋ ค๋๋ฆด๊ฒ์.
- ๋จ์ด: 1,879๊ฐ21๋ถ
[๐ค] TypeScript satisfies ์ฐ์ฐ์: ํ์ ์ถ๋ก ๊ณผ ์์ ์ฑ์ ๋์์ ์ก๋ ๋น๋ฒ
TypeScript์ `satisfies` ์ฐ์ฐ์๋ฅผ ํ์ฉํ์ฌ ํ์ ์ถ๋ก ์ ์ ์ฐ์ฑ์ ์ ์งํ๋ฉด์๋ ์๊ฒฉํ ํ์ ์์ ์ฑ์ ํ๋ณดํ๋ ๋ฐฉ๋ฒ์ ์์๋ณด์ธ์. ์ค์ฉ์ ์ธ ์์๋ฅผ ํตํด ์ค์ ํ๋ก์ ํธ์ ์ ์ฉํ๋ ๋ ธํ์ฐ๋ฅผ ๊ณต์ ํฉ๋๋ค.
- ๋จ์ด: 1,524๊ฐ16๋ถ
[๐ค] Next.js App Router ์บ์ฑ ์ ๋ต: ๋ฐ์ดํฐ ์ฌ๊ฒ์ฆ (revalidatePath, revalidateTag) ์๋ฒฝ ๊ฐ์ด๋
Next.js 14 App Router์์ ํจ์จ์ ์ธ ๋ฐ์ดํฐ ์บ์ฑ ์ ๋ต๊ณผ revalidatePath, revalidateTag๋ฅผ ์ด์ฉํ ๋ฐ์ดํฐ ์ฌ๊ฒ์ฆ ๋ฐฉ๋ฒ์ ์ค๋ฌด ์์์ ํจ๊ป ์์ธํ ์์๋ณด๊ณ ์น ์ฑ๋ฅ์ ์ต์ ํํ๋ ๋ฐฉ๋ฒ์ ๋ฐฐ์๋ณด์ธ์.