[๐ค] TypeScript const Type Parameters: ๋ฆฌํฐ๋ด ํ์ ์ถ๋ก ๊ฐํ์ ์ค์ฉ์ ์ธ ํ์ฉ๋ฒ
TypeScript 5.0์ ๋์ ๋ const Type Parameters๋ฅผ ํ์ฉํ์ฌ ์ ๋ค๋ฆญ ํจ์์ ๋ฆฌํฐ๋ด ํ์ ์ถ๋ก ์ ์ ๊ตํ๊ฒ ์ ์ดํ๊ณ , ๋์ฑ ๊ฒฌ๊ณ ํ ํ์ ์์คํ ์ ๊ตฌ์ถํ๋ ์ค์ฉ์ ์ธ ๋ฐฉ๋ฒ์ ์์๋ณด์ธ์. as const์์ ์ฐจ์ด์ ๊ณผ ์ค์ ์ฝ๋ ์์๋ฅผ ํตํด ์ด์ค๊ธ ๊ฐ๋ฐ์๋ ์ฝ๊ฒ ์ดํดํ ์ ์๋๋ก ์ค๋ช ํด ๋๋ ค์.

์ ๋ณด๐ค ์ด ํฌ์คํ ์ Gemini 2.5 Flash AI๊ฐ ์์ฑํ์ด์.
๋ด์ฉ์ ์ ํ์ฑ์ ์ํด ๊ฒํ ๋ฅผ ๊ฑฐ์ณค์ง๋ง, ์ค๋ฌด ์ ์ฉ ์ ๊ณต์ ๋ฌธ์๋ฅผ ํจ๊ป ์ฐธ๊ณ ํด ์ฃผ์ธ์.
์ ์ฉํ ํ์ด ๊ธ์์๋ TypeScript 5.0๋ถํฐ ๋์ ๋
constType Parameters๊ฐ ์ ๋ค๋ฆญ ํจ์์์ ๋ฆฌํฐ๋ด ํ์ ์ ๋ ์ ํํ๊ฒ ์ถ๋ก ํ๋๋ก ๋๋ ์๋ฆฌ์, ์ค์ ํ๋ก์ ํธ์์ ํ์ ์์ ์ฑ์ ๋์ด๋ ๋ค์ํ ํ์ฉ ์ฌ๋ก๋ฅผ ๊น์ด ์๊ฒ ๋ค๋ค์.
๐ค ๋ฌธ์ ์ธ์: ์ ๋ค๋ฆญ ํจ์์ ๋์ ํ์ ์ถ๋ก
0๏ธโฃ ์ ๋ฆฌํฐ๋ด ํ์ ์ถ๋ก ์ด ์ค์ํ๊ฐ์?
์๋
ํ์ธ์! 10๋
์ด์ ํ์คํ ๊ฐ๋ฐ์๋ก ์ผํ๋ฉฐ ์๋ง์ ํ๋ก์ ํธ๋ฅผ ๊ฒฝํํ๊ณ , ๊ธฐ์ ๋ธ๋ก๊ทธ SEO ์ ๋ฌธ๊ฐ๋ก ํ๋ํ๋ AI ๊ฐ๋ฐ์ ๋ธ๋ฃจ์์.
์ค๋์ TypeScript์ ๊ฐ๋ ฅํ ๊ธฐ๋ฅ ์ค ํ๋์ธ 'ํ์
์ถ๋ก (Type Inference)'์ ๋์ฑ ์ ๊ตํ๊ฒ ๋ง๋ค ์ ์๋ const Type Parameters์ ๋ํด ์ด์ผ๊ธฐํด ๋ณด๋ ค๊ณ ํด์.
์ด์ค๊ธ ๊ฐ๋ฐ์๋ถ๋ค์ด TypeScript๋ฅผ ์ฌ์ฉํ๋ค ๋ณด๋ฉด, ์ ๋ค๋ฆญ(Generics) ํจ์์์ ํน์ ๊ฐ์ ์ธ์๋ก ๋๊ฒผ์ ๋ ๊ธฐ๋ํ๋ ๊ฒ๋ณด๋ค ํ์
์ด ๋๋ฌด ๋๊ฒ ์ถ๋ก ๋์ด ๋นํฉํ๋ ๊ฒฝ์ฐ๊ฐ ์ข
์ข
์์ด์.
์๋ฅผ ๋ค์ด, greet("๋ธ๋ฃจ")๋ผ๊ณ ํธ์ถํ๋ฉด "๋ธ๋ฃจ"๋ผ๋ ์ ํํ ๋ฌธ์์ด ๋ฆฌํฐ๋ด ํ์
์ผ๋ก ์ถ๋ก ๋๊ธฐ๋ฅผ ๋ฐ๋ผ์ง๋ง, ์ค์ ๋ก๋ string ํ์
์ผ๋ก ์ถ๋ก ๋๋ ๊ฒฝ์ฐ๊ฐ ๋ฐ์ํ ์ ์๊ฑฐ๋ ์.
์ด๋ฐ ๋์ ํ์
์ถ๋ก ์ ๋๋ก๋ ์ ์ฐ์ฑ์ ์ ๊ณตํ์ง๋ง, ์๊ฒฉํ ํ์
์์ ์ฑ์ด ํ์ํ ์ํฉ์์๋ ์คํ๋ ค ๋ฒ๊ทธ๋ฅผ ์ ๋ฐํ๊ฑฐ๋ ์ฝ๋์ ์๋๋ฅผ ๋ชจํธํ๊ฒ ๋ง๋ค ์ ์์ด์.
1๏ธโฃ ๊ธฐ์กด ์ ๋ค๋ฆญ ํ์ ์ถ๋ก ์ ํ๊ณ์
TypeScript์ ์ ๋ค๋ฆญ์ ํจ์๋ ํด๋์ค, ์ธํฐํ์ด์ค๋ฅผ ์ ์ฐํ๊ฒ ๋ง๋ค๋ฉด์๋ ํ์
์์ ์ฑ์ ์ ์งํ ์ ์๋๋ก ๋๋ ์์ฃผ ์ ์ฉํ ๋๊ตฌ์์.
ํ์ง๋ง ํน์ ์ํฉ, ํนํ ํจ์ ์ธ์๋ก ๋ฆฌํฐ๋ด ๊ฐ(์: "success", 123, [1, 2, 3])์ ์ ๋ฌํ ๋ ๊ธฐ๋ณธ ํ์
์ถ๋ก ๋ฐฉ์์ ์๋์ ๋ค๋ฅด๊ฒ ๋์ํ ์ ์์ด์.
๊ฐ๋จํ ์์๋ฅผ ์ดํด๋ณผ๊น์?
function identity<T>(arg: T): T { return arg; } const str = identity("hello"); // str์ ํ์ ์ "hello"๊ฐ ์๋ string์ผ๋ก ์ถ๋ก ๋ผ์. const num = identity(123); // num์ ํ์ ์ 123์ด ์๋ number๋ก ์ถ๋ก ๋ผ์. const arr = identity([1, 2, 3]); // arr์ ํ์ ์ [number, number, number]๊ฐ ์๋ number[]๋ก ์ถ๋ก ๋ผ์. console.log(typeof str); // "string" console.log(typeof num); // "number" console.log(typeof arr); // "object"
์ ์ฝ๋์์ identity ํจ์๋ ์ ๋ค๋ฆญ T๋ฅผ ๋ฐ์์.
์ฐ๋ฆฌ๋ identity("hello")๋ฅผ ํธ์ถํ์ ๋ str ๋ณ์์ ํ์
์ด "hello" ๋ฆฌํฐ๋ด ํ์
์ด ๋๊ธฐ๋ฅผ ๊ธฐ๋ํ ์ ์์ง๋ง, ์ค์ ๋ก๋ ๋ ๋์ string ํ์
์ผ๋ก ์ถ๋ก ๋ผ์.
๋ง์ฐฌ๊ฐ์ง๋ก ์ซ์ ๋ฆฌํฐ๋ด์ number๋ก, ๋ฐฐ์ด ๋ฆฌํฐ๋ด์ number[]์ ๊ฐ์ด ์์์ ํ์
์ด ๋๊ฒ ์ถ๋ก ๋์ฃ .
์ด๋ TypeScript๊ฐ ๊ธฐ๋ณธ์ ์ผ๋ก ์ ๋ค๋ฆญ ํ์
๋ณ์๋ฅผ ๋ค๋ฃฐ ๋ "์ต์ ๊ณตํต ํ์
(Least Common Type)"์ ์ฐพ์ผ๋ ค๋ ๊ฒฝํฅ์ด ์๊ธฐ ๋๋ฌธ์ด์์.
์ด๋ฌํ ๋์์ ๋๋ถ๋ถ์ ๊ฒฝ์ฐ์ ํฉ๋ฆฌ์ ์ด์ง๋ง, ๋๋ก๋ ๋ฆฌํฐ๋ด ๊ฐ์ ๊ทธ๋๋ก ํ์
์ผ๋ก ์ฌ์ฉํ๊ณ ์ถ์ ๋ ์ ์ฝ์ด ๋ ์ ์์ด์.
0๏ธโฃ const Type Parameters์ ํต์ฌ ์์ด๋์ด
TypeScript 5.0๋ถํฐ ๋์
๋ const Type Parameters๋ ์ด๋ฌํ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๊ธฐ ์ํด ๊ณ ์๋์์ด์.
์ ๋ค๋ฆญ ํ์
๋งค๊ฐ๋ณ์์ const ํ์ ์๋ฅผ ๋ถ์ด๋ฉด, TypeScript๋ ํด๋น ํ์
๋งค๊ฐ๋ณ์์ ์ ๋ฌ๋๋ ๋ฆฌํฐ๋ด ์ธ์๋ค์ ๊ฐ๋ฅํ ํ ๊ฐ์ฅ ์ข์(const-like) ๋ฆฌํฐ๋ด ํ์
์ผ๋ก ์ถ๋ก ํ๋ ค๊ณ ์๋ํด์.
์ด๋ ๋ง์น ๋ณ์์ const๋ฅผ ๋ถ์ฌ ์ฌํ ๋น์ ๋ง๊ณ ๊ฐ์ ๊ณ ์ ํ๋ ๊ฒ์ฒ๋ผ, ํ์
์ถ๋ก ์์๋ ๋ฆฌํฐ๋ด ๊ฐ์ ์ต๋ํ ๊ณ ์ ๋ ํ์
์ผ๋ก ์ ์งํ๊ฒ ๋ค๋ ์๋ฏธ๋ก ์ดํดํ ์ ์์ด์.
์ ์ฉํ ํ
constType Parameters๋ ์ ๋ค๋ฆญ ํ์ ๋งค๊ฐ๋ณ์(T)์constํค์๋๋ฅผ ์ถ๊ฐํ์ฌ, ํด๋นT์ ํ ๋น๋๋ ๋ฆฌํฐ๋ด ๊ฐ์as const์ด์ค์ ์ด ์ ์ฉ๋ ๊ฒ์ฒ๋ผ ๊ฐ์ฅ ์ข์ ๋ฆฌํฐ๋ด ํ์ ์ผ๋ก ์ถ๋ก ํ๋๋ก ๊ฐ์ ํ๋ ๊ธฐ๋ฅ์ด์์.
1๏ธโฃ const Type Parameters ์ ์ฉ ๋ฐฉ๋ฒ
const Type Parameters๋ฅผ ์ฌ์ฉํ๋ ๋ฐฉ๋ฒ์ ์์ฃผ ๊ฐ๋จํด์.
์ ๋ค๋ฆญ ํ์
๋งค๊ฐ๋ณ์๋ฅผ ์ ์ธํ ๋ const ํค์๋๋ฅผ ์์ ๋ถ์ฌ์ฃผ๊ธฐ๋ง ํ๋ฉด ๋ผ์.
function identityWithConst<const T>(arg: T): T { return arg; } const strWithConst = identityWithConst("hello"); // strWithConst์ ํ์ ์ "hello"๋ก ์ถ๋ก ๋ผ์! const numWithConst = identityWithConst(123); // numWithConst์ ํ์ ์ 123์ผ๋ก ์ถ๋ก ๋ผ์! const arrWithConst = identityWithConst([1, 2, 3]); // arrWithConst์ ํ์ ์ readonly [1, 2, 3]์ผ๋ก ์ถ๋ก ๋ผ์! console.log(strWithConst); // "hello" console.log(numWithConst); // 123 console.log(arrWithConst); // [1, 2, 3] // ํ์ ํ์ธ (์ปดํ์ผ ์์ ์๋ง ์ ํจ) // strWithConst = "world"; // Error: Type '"world"' is not assignable to type '"hello"'. // arrWithConst.push(4); // Error: Property 'push' does not exist on type 'readonly [1, 2, 3]'.
์ ์ฝ๋๋ฅผ ๋ณด์๋ฉด, identityWithConst<const T> ํจ์๋ฅผ ์ฌ์ฉํ์ ๋ strWithConst์ ํ์
์ ์ ํํ "hello" ๋ฆฌํฐ๋ด ํ์
์ผ๋ก ์ถ๋ก ๋๋ ๊ฒ์ ํ์ธํ ์ ์์ด์.
์ซ์ 123๋ ๋ง์ฐฌ๊ฐ์ง๋ก 123 ๋ฆฌํฐ๋ด ํ์
์ผ๋ก ์ถ๋ก ๋๊ณ ์.
ํนํ ๋ฐฐ์ด์ ๊ฒฝ์ฐ, readonly [1, 2, 3]์ ๊ฐ์ด readonly ์์ฑ์ด ๋ถ์ ํํ ํ์
์ผ๋ก ์ถ๋ก ๋์ด ๋์ฑ ๊ฐ๋ ฅํ ํ์
์์ ์ฑ์ ์ ๊ณตํด์.
์ด๋ as const ์ด์ค์
์ ์ฌ์ฉํ ๊ฒ๊ณผ ์ ์ฌํ ํจ๊ณผ๋ฅผ ์ ๋ค๋ฆญ ํ์
์ถ๋ก ๋จ๊ณ์์ ์ป์ ์ ์๊ฒ ํด์ฃผ๋ ๊ฒ์ด์ฃ .
๐งช ์ค์ฉ์ ์ธ ํ์ฉ ์์
const Type Parameters๋ ๋จ์ํ ๋ฆฌํฐ๋ด ํ์
์ ์ขํ๋ ๊ฒ์ ๋์ด, ์ค๋ฌด์์ ๋ง์ฃผํ๋ ๋ค์ํ ํ์
์์ ์ฑ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๋ ๋ฐ ํฐ ๋์์ด ๋ผ์.
0๏ธโฃ ํ์ ์์ ์ฑ์ ๋์ด๋ ์ค์ ๊ฐ์ฒด ์ ์
ํน์ ์ปดํฌ๋ํธ๋ ์ ํธ๋ฆฌํฐ ํจ์๊ฐ ๊ณ ์ ๋ ๋ฌธ์์ด ๋ฆฌํฐ๋ด์ ํค๋ก ๊ฐ์ง๋ ์ค์ ๊ฐ์ฒด๋ฅผ ๋ฐ์ ๋ const Type Parameters๋ฅผ ํ์ฉํ๋ฉด ์ค์๋ฅผ ์ค์ผ ์ ์์ด์.
type FeatureConfig<const T extends Record<string, string>> = { [K in keyof T]: T[K]; }; function createFeature<const T extends Record<string, string>>(config: FeatureConfig<T>) { console.log("Feature created with config:", config); return config; } // โ ์ฌ๋ฐ๋ฅธ ์ฌ์ฉ ์์ const myFeatureConfig = createFeature({ name: "UserProfile", version: "1.0.0", status: "enabled", }); // myFeatureConfig์ ํ์ ์ { name: "UserProfile"; version: "1.0.0"; status: "enabled"; } ๋ก ์ถ๋ก ๋ผ์. // ์ฆ, ๊ฐ ์์ฑ์ ๊ฐ์ด ๋ฆฌํฐ๋ด ํ์ ์ผ๋ก ๊ณ ์ ๋ผ์. // myFeatureConfig.name = "AdminPanel"; // Error: Type '"AdminPanel"' is not assignable to type '"UserProfile"'. // โ ์๋ชป๋ ํค๋ฅผ ์ฌ์ฉํ๋ฉด ์๋ฌ ๋ฐ์ // createFeature({ // name: "Blog", // ver: "1.1.0" // Error: Property 'ver' does not exist on type '{ name: string; version: string; status: string; }'. // // (์ฌ๊ธฐ์๋ T์ ์ ์ฝ์กฐ๊ฑด ๋๋ฌธ์ string์ผ๋ก ์ถ๋ก ๋์ง๋ง, ์ค์ ์ฌ์ฉ ์ ๋ ์ ๊ตํ ์๋ฌ๋ฅผ ์ ๋ํ ์ ์์ด์.) // });
์ ์์์์ createFeature ํจ์๋ const T๋ฅผ ์ฌ์ฉํ์ฌ config ๊ฐ์ฒด์ ์์ฑ ๊ฐ๋ค์ ๋ฆฌํฐ๋ด ํ์
์ผ๋ก ์ถ๋ก ํ๋๋ก ํด์.
์ด๋ ๊ฒ ํ๋ฉด myFeatureConfig.name์ ๋ค๋ฅธ ๋ฌธ์์ด์ ํ ๋นํ๋ ค ํ ๋ ํ์
์๋ฌ๊ฐ ๋ฐ์ํ์ฌ, ๋ถ๋ณ์ฑ์ ์ ์งํ๊ณ ์๋์น ์์ ๋ณ๊ฒฝ์ ๋ฐฉ์งํ ์ ์์ด์.
์ด๋ ํนํ ์ค์ ๊ฐ์ฒด๋ ์ํ ๊ฐ์ฒด์ ํน์ ํ๋๊ฐ ๊ณ ์ ๋ ๊ฐ์ ๊ฐ์ ธ์ผ ํ ๋ ์ ์ฉํด์.
1๏ธโฃ ํ์ ์์ ํ ์ด๋ฒคํธ ๋ฆฌ์ค๋ ์ ์
์ด๋ฒคํธ ์์คํ
์ ๊ตฌํํ ๋, ํน์ ์ด๋ฒคํธ ์ด๋ฆ์ ๋ํ ๋ฆฌ์ค๋๋ฅผ ๋ฑ๋กํ ๋ const Type Parameters๋ฅผ ํ์ฉํ์ฌ ์ด๋ฒคํธ ์ด๋ฆ์ ์คํ๋ฅผ ๋ฐฉ์งํ๊ณ ํ์
์์ ์ฑ์ ๋์ผ ์ ์์ด์.
type EventMap = { "userLoggedIn": { userId: string }; "itemAdded": { itemId: string; quantity: number }; "appError": { message: string; code: number }; }; class EventEmitter<const T extends EventMap> { private listeners: { [K in keyof T]?: ((payload: T[K]) => void)[] } = {}; on<K extends keyof T>(eventName: K, listener: (payload: T[K]) => void) { if (!this.listeners[eventName]) { this.listeners[eventName] = []; } this.listeners[eventName]?.push(listener); } emit<K extends keyof T>(eventName: K, payload: T[K]) { this.listeners[eventName]?.forEach(listener => listener(payload)); } } const myEmitter = new EventEmitter<EventMap>(); myEmitter.on("userLoggedIn", (data) => { console.log("User logged in:", data.userId); // data๋ { userId: string } ํ์ }); myEmitter.on("itemAdded", (data) => { console.log("Item added:", data.itemId, data.quantity); // data๋ { itemId: string; quantity: number } ํ์ }); // myEmitter.on("unknownEvent", () => {}); // Error: Argument of type '"unknownEvent"' is not assignable to parameter of type 'keyof EventMap'. myEmitter.emit("userLoggedIn", { userId: "user123" }); myEmitter.emit("itemAdded", { itemId: "productA", quantity: 5 }); // myEmitter.emit("appError", { msg: "Something went wrong" }); // Error: Argument of type '{ msg: string; }' is not assignable to parameter of type '{ message: string; code: number; }'.
EventEmitter ํด๋์ค์ const T extends EventMap๋ฅผ ์ ์ฉํจ์ผ๋ก์จ, on ๋ฐ emit ๋ฉ์๋์ eventName ์ธ์๊ฐ EventMap์ ์ ์๋ ๋ฆฌํฐ๋ด ํค("userLoggedIn", "itemAdded", "appError")๋ก๋ง ํ์ฉ๋๋๋ก ๊ฐ์ ํ ์ ์์ด์.
์ด๋ ์ด๋ฒคํธ ์ด๋ฆ์ ์๋ชป ์
๋ ฅํ๋ ํด๋จผ ์๋ฌ๋ฅผ ์ปดํ์ผ ์์ ์ ์ก์๋ด์ด ๋ฐํ์ ์ค๋ฅ๋ฅผ ๋ฐฉ์งํ๋ ๋ฐ ๋งค์ฐ ํจ๊ณผ์ ์ด์์.
2๏ธโฃ as const ์ด์ค์
๊ณผ์ ์ฐจ์ด์
const Type Parameters๋ฅผ ์ด์ผ๊ธฐํ ๋ as const ์ด์ค์
๊ณผ์ ์ฐจ์ด์ ์ ์ดํดํ๋ ๊ฒ์ด ์ค์ํด์.
as const๋ ๋ณ์๋ ๋ฆฌํฐ๋ด์ ์ง์ ์ ์ฉํ์ฌ ํด๋น ๊ฐ์ ํ์
์ ๊ฐ๋ฅํ ๊ฐ์ฅ ์ข์ ๋ฆฌํฐ๋ด ํ์
์ผ๋ก ๋ง๋๋ ์ญํ ์ ํด์.
const userStatus = "active"; // type: string const userStatusAsConst = "active" as const; // type: "active" const numbers = [1, 2, 3]; // type: number[] const numbersAsConst = [1, 2, 3] as const; // type: readonly [1, 2, 3]
as const๋ ํน์ ๊ฐ์ ๋ํ ํ์
์ถ๋ก ์ ๋ณ๊ฒฝํ๋ ๋ฐ๋ฉด, const Type Parameters๋ ์ ๋ค๋ฆญ ํ์
๋งค๊ฐ๋ณ์์ ๋ํ ํ์
์ถ๋ก ๋ฐฉ์์ ๋ณ๊ฒฝํด์.
์ฆ, ํจ์๋ฅผ ํธ์ถํ ๋ ์ ๋ฌ๋๋ ์ธ์์ ํ์
์ as const๋ฅผ ์ฌ์ฉํ ๊ฒ์ฒ๋ผ ์ถ๋ก ํ๋๋ก ์ง์ํ๋ ๊ฒ์ด์ฃ .
ํจ์ ์ธ์๋ก ๋ค์ด์ค๋ ๊ฐ์ ๋งค๋ฒ as const๋ฅผ ๋ถ์ฌ์ฃผ๋ ๋ฒ๊ฑฐ๋ก์ ์์ด, ์ ๋ค๋ฆญ ํจ์ ์์ฒด์์ ๋ ์ค๋งํธํ ์ถ๋ก ์ ํ ์ ์๊ฒ ํด์ค๋ค๋ ์ ์์ ํฐ ์ฐจ์ด๊ฐ ์์ด์.
์ ๋ณด
as const๋ ํน์ ํํ์์ ํ์ ์ ๋ฆฌํฐ๋ด๋ก ๊ณ ์ ํ๋ ๋ฐ๋ฉด,constType Parameters๋ ์ ๋ค๋ฆญ ํ์ ์ถ๋ก ๋ฉ์ปค๋์ฆ ์์ฒด๋ฅผ ๋ณ๊ฒฝํ์ฌ ๋ฆฌํฐ๋ด ์ธ์๋ฅผ ์๋์ผ๋กas const์ฒ๋ผ ์ฒ๋ฆฌํ๋๋ก ๋ง๋ค์ด์.
0๏ธโฃ ํต์ฌ ์์ฝ ๋ฐ ํ์ฉ ๊ฐ์ด๋๋ผ์ธ
TypeScript์ const Type Parameters๋ ์ ๋ค๋ฆญ์ ์ฌ์ฉํ๋ ํจ์๋ ํด๋์ค์์ ๋ฆฌํฐ๋ด ํ์
์ ์ธ์๋ฅผ ๋์ฑ ์ ๊ตํ๊ฒ ๋ค๋ฃจ๊ณ ์ถ์ ๋ ๋งค์ฐ ์ ์ฉํ ๊ธฐ๋ฅ์ด์์.
์ด๋ฅผ ํตํด ๋ค์๊ณผ ๊ฐ์ ์ด์ ์ ์ป์ ์ ์์ด์.
- ์ ํํ ๋ฆฌํฐ๋ด ํ์
์ถ๋ก :
"success",123,[1, 2, 3]์ ๊ฐ์ ๋ฆฌํฐ๋ด ๊ฐ์ด ์ ๋ค๋ฆญ ํจ์์ ์ ๋ฌ๋ ๋,string,number,(string | number)[]์ ๊ฐ์ด ๋๊ฒ ์ถ๋ก ๋๋ ๋์ ์ ํํ ๋ฆฌํฐ๋ด ํ์ ์ด๋readonlyํํ ํ์ ์ผ๋ก ์ถ๋ก ๋ผ์. - ํ์ ์์ ์ฑ ๊ฐํ: ์ค์ ๊ฐ์ฒด, ์ด๋ฒคํธ ์ด๋ฆ, ์ํ ๊ฐ ๋ฑ ํน์ ํ๋๊ฐ ๊ณ ์ ๋ ๋ฆฌํฐ๋ด ๊ฐ์ ๊ฐ์ ธ์ผ ํ๋ ์ํฉ์์ ์๋ชป๋ ๊ฐ์ ํ ๋นํ๋ ๊ฒ์ ์ปดํ์ผ ์์ ์ ๋ฐฉ์งํ ์ ์์ด์.
- ์ฝ๋์ ์๋ ๋ช ํํ: ํจ์๊ฐ ํน์ ๋ฆฌํฐ๋ด ํ์ ์ ์ธ์๋ฅผ ๊ธฐ๋ํ๋ค๋ ๊ฒ์ ์ ๋ค๋ฆญ ์ ์ธ ์์ฒด์์ ๋ช ํํ ํํํ ์ ์์ด์.
- ๋ถํ์ํ
as const๊ฐ์: ํจ์ ํธ์ถ ์ ์ธ์์ ์ผ์ผ์ดas const๋ฅผ ๋ถ์ด์ง ์์๋ ๋๋ฏ๋ก ์ฝ๋ ๊ฐ๋ ์ฑ์ด ํฅ์๋ผ์.
1๏ธโฃ ๋ค์ ์ก์ : ์ฌ๋ฌ๋ถ์ ์ฝ๋์ ์ ์ฉํด ๋ณด์ธ์!
const Type Parameters๋ TypeScript 5.0 ์ด์ ๋ฒ์ ์์ ์ฌ์ฉํ ์ ์์ผ๋, ์์ง ๊ตฌ๋ฒ์ ์ ์ฌ์ฉํ๊ณ ๊ณ์๋ค๋ฉด ์
๊ทธ๋ ์ด๋๋ฅผ ๊ณ ๋ คํด ๋ณด์ธ์.
์๋ก์ด ํ๋ก์ ํธ๋ฅผ ์์ํ๊ฑฐ๋ ๊ธฐ์กด ํ๋ก์ ํธ์ ํ์
์์ ์ฑ์ ๊ฐํํ๊ณ ์ถ์ ๋, ํนํ ์ ๋ค๋ฆญ ํจ์์์ ๋ฆฌํฐ๋ด ๊ฐ์ ์ ๋ฐํ๊ฒ ์ ์ดํด์ผ ํ๋ ์ํฉ์ด๋ผ๋ฉด const Type Parameters๋ฅผ ์ ๊ทน์ ์ผ๋ก ํ์ฉํด ๋ณด์๊ธธ ๊ถํด ๋๋ ค์.
์ฒ์์๋ ์กฐ๊ธ ์์ํ๊ฒ ๋๊ปด์ง ์ ์์ง๋ง, ๋ช ๋ฒ ์ฌ์ฉํด ๋ณด๋ฉด ๊ทธ ํธ๋ฆฌํจ๊ณผ ๊ฐ๋ ฅํจ์ ๋๋ผ์ค ๊ฑฐ์์.
์ค๋ ๋ค๋ฃฌ ๋ด์ฉ์ด ์ฌ๋ฌ๋ถ์ TypeScript ๊ฐ๋ฐ์ ์ค์ง์ ์ธ ๋์์ด ๋๊ธฐ๋ฅผ ๋ฐ๋ผ๋ฉฐ, ๋ค์์๋ ์ ์ตํ ์ ๋ณด๋ก ์ฐพ์์ฌ๊ฒ์! ๊ถ๊ธํ ์ ์ด ์๋ค๋ฉด ์ธ์ ๋ ์ง ๋๊ธ๋ก ๋จ๊ฒจ์ฃผ์ธ์!
๐ฎ ์ฐธ๊ณ
- TypeScript 5.0 Annoucement -
constType Parameters - TypeScript Handbook - Generics
- TypeScript Handbook -
as constassertions
์ฐ๊ด๋ ํฌ์คํธ
๋จ์ด: 2,122๊ฐ24๋ถ[๐ค] JavaScript Proxy์ Reflect ์ฌ์ธต ๋ถ์: ๋ฉํ ํ๋ก๊ทธ๋๋ฐ์ผ๋ก ์ฝ๋ ๊ฐํํ๊ธฐ
JavaScript Proxy์ Reflect API๋ฅผ ํ์ฉํ ๋ฉํ ํ๋ก๊ทธ๋๋ฐ ๊ธฐ๋ฒ์ ์ฌ์ธต ๋ถ์ํด์. ๊ฐ์ฒด ์ ๊ทผ ์ ์ด, ์ ํจ์ฑ ๊ฒ์ฌ, ๋ก๊น , ๋ฐ์ํ ์์คํ ๊ตฌํ ๋ฑ ์ค์ฉ์ ์ธ ํ์ฉ ์ฌ๋ก๋ฅผ ํตํด ์ฝ๋์ ์ ์ฐ์ฑ๊ณผ ์์ ์ฑ์ ๋์ด๋ ๋ฐฉ๋ฒ์ ๋ฐฐ์๋ณด์ธ์.
- ๋จ์ด: 2,019๊ฐ24๋ถ
[๐ค] React/Next.js ๋ฒ๋ค ์ต์ ํ: ์ฝ๋ ์คํ๋ฆฌํ ๊ณผ ๋ ์ด์ง ๋ก๋ฉ ์๋ฒฝ ๊ฐ์ด๋
React์ Next.js ์ ํ๋ฆฌ์ผ์ด์ ์ ๋ฒ๋ค ํฌ๊ธฐ๋ฅผ ์ค์ด๊ณ ๋ก๋ฉ ์๋๋ฅผ ๊ฐ์ ํ๋ ์ฝ๋ ์คํ๋ฆฌํ ๊ณผ ๋ ์ด์ง ๋ก๋ฉ ๊ธฐ๋ฒ์ ์ค์ฉ์ ์ธ ์์์ ํจ๊ป ์์ธํ ์์๋ด์. ์นํฉ ์ค์ ๋ถํฐ React.lazy, Next.js dynamic import๊น์ง ๋ค๋ค์.
- ๋จ์ด: 1,769๊ฐ20๋ถ
[๐ค] React์ `useOptimistic` ํ ์ผ๋ก ๋๊ด์ UI ์ ๋ฐ์ดํธ ๊ตฌํํ๊ธฐ: Server Actions์ ํจ๊ป
React 18/19์ `useOptimistic` ํ ์ ํ์ฉํ์ฌ Server Actions์ ์ฐ๋๋๋ ๋๊ด์ UI ์ ๋ฐ์ดํธ๋ฅผ ๊ตฌํํ๋ ๋ฐฉ๋ฒ์ ์ค์ฉ์ ์ธ ์์์ ํจ๊ป ์์ธํ ์์๋ด์. ์ฌ์ฉ์ ๊ฒฝํ์ ๊ฐ์ ํ๊ณ ์ ํ๋ฆฌ์ผ์ด์ ์ ๋ฐ์์ฑ์ ๋์ด๋ ๋ ธํ์ฐ๋ฅผ ๊ณต์ ํด์.
- ๋จ์ด: 2,015๊ฐ22๋ถ
[๐ค] Next.js/React ์ฑ CLS ์ต์ ํ: ์ํํธ ์๋ ์ฌ์ฉ์ ๊ฒฝํ ๋ง๋ค๊ธฐ
Next.js์ React ์ ํ๋ฆฌ์ผ์ด์ ์์ Cumulative Layout Shift(CLS) ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๊ณ ์ฌ์ฉ์ ๊ฒฝํ์ ๊ฐ์ ํ๋ ์ค์ง์ ์ธ ์ ๋ต๊ณผ ์ฝ๋ ์์๋ฅผ ์์ธํ ์์๋ณด์ธ์. ์น ์ฑ๋ฅ ์ต์ ํ์ ํต์ฌ ์์์ธ CLS๋ฅผ ํจ๊ณผ์ ์ผ๋ก ๊ด๋ฆฌํ๋ ๋ฐฉ๋ฒ์ ์๋ ค๋๋ ค์.
- ๋จ์ด: 1,735๊ฐ21๋ถ
[๐ค] Next.js SSR, SSG, ISR ๋ ๋๋ง ์ ๋ต: App Router์์ ์ต์ ์ ์ ํ์?
Next.js App Router์์ ์๋ฒ ์ฌ์ด๋ ๋ ๋๋ง(SSR), ์ ์ ์ฌ์ดํธ ์์ฑ(SSG), ์ฆ๋ถ ์ ์ ์ฌ์์ฑ(ISR) ๊ฐ ๋ ๋๋ง ์ ๋ต์ ๋์ ์๋ฆฌ, ์ฅ๋จ์ , ์ค์ ํ์ฉ ๋ฐ ์ต์ ํ ๋ฐฉ๋ฒ์ ๋น๊ต ๋ถ์ํด๋๋ ค์.
- ๋จ์ด: 1,460๊ฐ17๋ถ
[๐ค] React Context API์ Zustand: ์ ์ญ ์ํ ๊ด๋ฆฌ, ์ธ์ ๋ฌด์์ ์จ์ผ ํ ๊น์?
React ์ ํ๋ฆฌ์ผ์ด์ ์ ์ ์ญ ์ํ ๊ด๋ฆฌ๋ฅผ ๊ณ ๋ฏผํ๊ณ ๊ณ์ ๊ฐ์? Context API์ ๊ฐ๋ฒผ์ด ์ธ๋ถ ์ํ ๊ด๋ฆฌ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ธ Zustand๋ฅผ ๋น๊ต ๋ถ์ํ๊ณ , ์ค๋ฌด์์ ๊ฐ ๋๊ตฌ๋ฅผ ํจ๊ณผ์ ์ผ๋ก ํ์ฉํ๋ ์ ๋ต์ ์ค์ ์ฝ๋ ์์์ ํจ๊ป ์์ธํ ์๋ ค๋๋ ค์.
- ๋จ์ด: 2,004๊ฐ24๋ถ
[๐ค] Turborepo๋ก Next.js ๋ชจ๋ ธ๋ ํฌ ๊ตฌ์ถ: ํจ์จ์ ์ธ ๊ฐ๋ฐ ๋ฐ ์ต์ ํ ์ ๋ต
Turborepo๋ฅผ ํ์ฉํ์ฌ Next.js ํ๋ก์ ํธ๋ฅผ ๋ชจ๋ ธ๋ ํฌ๋ก ๊ตฌ์ฑํ๊ณ , ๊ณต์ ์ปดํฌ๋ํธ, ์ ํธ๋ฆฌํฐ, CI/CD ์ต์ ํ ๋ฐฉ์์ ์ค๋ฌด ์์์ ํจ๊ป ์์ธํ ์ค๋ช ํด ๋๋ ค์.
- ๋จ์ด: 2,318๊ฐ27๋ถ
[๐ค] React useEffect ํ , ์ด์ ํท๊ฐ๋ฆฌ์ง ๋ง์ธ์! (์์กด์ฑ ๋ฐฐ์ด, ํด๋ฆฐ์ ์๋ฒฝ ๊ฐ์ด๋)
React ๊ฐ๋ฐ์์ ํ์์ ์ธ useEffect ํ ์ ๋์ ์๋ฆฌ๋ถํฐ ์์กด์ฑ ๋ฐฐ์ด, ํด๋ฆฐ์ ํจ์ ํ์ฉ๋ฒ, ๊ทธ๋ฆฌ๊ณ ์ค๋ฌด์์ ์์ฃผ ๊ฒช๋ ์ค์์ ์ต์ ํ ์ ๋ต๊น์ง, ์ด์ค๊ธ ๊ฐ๋ฐ์๋ฅผ ์ํ ์๋ฒฝ ๊ฐ์ด๋๋ฅผ ์ ๊ณตํด์.
- ๋จ์ด: 3,270๊ฐ31๋ถ
[๐ค] Next.js Server Actions ์ค์ : ์๋ฌ ์ฒ๋ฆฌ, ์ ํจ์ฑ ๊ฒ์ฌ, ๋๊ด์ UI ์ ๋ฐ์ดํธ
Next.js Server Actions๋ฅผ ์ค๋ฌด์ ์ ์ฉํ ๋ ๋ง์ฃผํ๋ ์๋ฌ ์ฒ๋ฆฌ, ๋ฐ์ดํฐ ์ ํจ์ฑ ๊ฒ์ฌ, ๊ทธ๋ฆฌ๊ณ ์ฌ์ฉ์ ๊ฒฝํ์ ํฅ์์ํค๋ ๋๊ด์ UI ์ ๋ฐ์ดํธ ๊ธฐ๋ฒ์ ์์ธํ ์ฝ๋ ์์์ ํจ๊ป ์์๋ณด์ธ์.
๋จ์ด: 1,981๊ฐ21๋ถ[๐ค] TypeScript ์ ํธ๋ฆฌํฐ ํ์ ์๋ฒฝ ๊ฐ์ด๋: ์ค์ ํ์ฉ ํจํด
TypeScript ์ ํธ๋ฆฌํฐ ํ์ ์ ํต์ฌ ๊ฐ๋ ๊ณผ ์ค์ ํ์ฉ๋ฒ์ ๊น์ด ์๊ฒ ๋ค๋ค์. Pick, Omit, Partial, Required ๋ฑ ์์ฃผ ์ฐ๋ ์ ํธ๋ฆฌํฐ ํ์ ์ผ๋ก ๋ณต์กํ ํ์ ์ ํจ๊ณผ์ ์ผ๋ก ๋ค๋ฃจ๋ ๋ฐฉ๋ฒ์ ๋ฐฐ์๋ณด์ธ์. ํ์ ์คํฌ๋ฆฝํธ ์ฝ๋์ ์ฌ์ฌ์ฉ์ฑ๊ณผ ์์ ์ฑ์ ๋์ด๋ ๋ ธํ์ฐ๋ฅผ ๊ณต์ ํด์.
- ๋จ์ด: 1,707๊ฐ20๋ถ
[๐ค] Next.js App Router ๋ฏธ๋ค์จ์ด: ๊ฐ๋ ฅํ ์์ฒญ ์ฒ๋ฆฌ ์ ๋ต๊ณผ ์ค์ ์์
Next.js App Router ํ๊ฒฝ์์ ๋ฏธ๋ค์จ์ด๋ฅผ ํ์ฉํด ์ฌ์ฉ์ ์ธ์ฆ, ๋ฆฌ๋ค์ด๋ ์ , ๊ตญ์ ํ ๋ฑ์ ์์ฒญ ์ฒ๋ฆฌ ๋ก์ง์ ํจ์จ์ ์ผ๋ก ๊ตฌํํ๋ ๋ฐฉ๋ฒ์ ์ค์ ์์ ์ ํจ๊ป ์์ธํ ์์๋ณด์ธ์.
- ๋จ์ด: 1,625๊ฐ19๋ถ
[๐ค] ํ์ ์คํฌ๋ฆฝํธ ์ ๋ค๋ฆญ ์ฌํ: ์ค์ฉ์ ์ธ ํจํด๊ณผ ํํ ์คํด๋ค
ํ์ ์คํฌ๋ฆฝํธ ์ ๋ค๋ฆญ(Generics)์ ๊น์ด ์ดํดํ๊ณ , ์ค๋ฌด์์ ์์ฃผ ์ฌ์ฉ๋๋ ์ ๋ค๋ฆญ ํจํด๊ณผ ํํ ๊ฒช๋ ์คํด๋ค์ ์ค์ ์ฝ๋ ์์์ ํจ๊ป ์ฝ๊ณ ๋ช ํํ๊ฒ ์ค๋ช ํด ๋๋ ค์. ํ์ ์์ ์ฑ๊ณผ ์ฝ๋ ์ฌ์ฌ์ฉ์ฑ์ ๋์ด๋ ๋ฐฉ๋ฒ์ ๋ฐฐ์๋ณด์ธ์.
๋จ์ด: 1,846๊ฐ18๋ถ[๐ค] Next.js Route Handler: App Router์์ ์์ ํ๊ณ ํจ์จ์ ์ธ API ๊ตฌ์ถํ๊ธฐ (์ธ์ฆ, ์๋ฌ ์ฒ๋ฆฌ ํฌํจ)
Next.js App Router์ Route Handler๋ฅผ ์ฌ์ฉํ์ฌ API ์๋ํฌ์ธํธ๋ฅผ ๊ตฌ์ถํ๋ ๋ฐฉ๋ฒ์ ์์ธํ ์์๋ด์. ์ธ์ฆ, ์๋ฌ ์ฒ๋ฆฌ, ๊ทธ๋ฆฌ๊ณ ์บ์ฑ ์ ๋ต์ ํฌํจํ ์ค์ฉ์ ์ธ ํ์ผ๋ก ์์ ํ๊ณ ํจ์จ์ ์ธ ์๋ฒ๋ฆฌ์ค ํจ์๋ฅผ ๋ง๋๋ ๋ฐฉ๋ฒ์ ์ตํ๋ด์.
- ๋จ์ด: 1,932๊ฐ22๋ถ
[๐ค] Next.js Image ์ปดํฌ๋ํธ ์ต์ ํ: Core Web Vitals ๊ฐ์ ๋ถํฐ ์ค์ ํ์ฉ๊น์ง
Next.js์ Image ์ปดํฌ๋ํธ๋ฅผ ํ์ฉํ์ฌ ์น ์ฑ๋ฅ ํต์ฌ ์งํ์ธ Core Web Vitals๋ฅผ ๊ฐ์ ํ๊ณ , ๋ค์ํ ์ต์ ํ ์ต์ ์ ์ค์ ํ๋ก์ ํธ์ ์ ์ฉํ๋ ๋ฐฉ๋ฒ์ ๋ธ๋ฃจ๊ฐ ์์ธํ ์๋ ค๋๋ ค์.
- ๋จ์ด: 2,173๊ฐ25๋ถ
[๐ค] Next.js 14.1+์ ํ์ : Partial Prerendering (PPR) ์๋ฒฝ ๊ฐ์ด๋์ ์ค์ ์ต์ ํ ์ ๋ต
Next.js 14.1๋ถํฐ ๋์ ๋ Partial Prerendering (PPR)์ ํตํด ์ด๊ธฐ ๋ก๋ฉ ์๋๋ฅผ ๊ทน๋ํํ๊ณ ๋์ ์ฝํ ์ธ ๋ฅผ ํจ์จ์ ์ผ๋ก ์ฒ๋ฆฌํ๋ ๋ฐฉ๋ฒ์ ์ฌ๋ ์๊ฒ ๋ค๋ฃจ์ด์. PPR์ ๋์ ์๋ฆฌ๋ถํฐ ์ค์ ํ๋ก์ ํธ ์ ์ฉ ์ ๋ต๊น์ง, ๊ฐ๋ฐ์๋ค์ด ๊ถ๊ธํดํ๋ ๋ชจ๋ ๊ฒ์ ์๋ ค๋๋ ค์.
- ๋จ์ด: 1,786๊ฐ19๋ถ
[๐ค] TypeScript ์กฐ๊ฑด๋ถ ํ์ ๊ณผ infer ํค์๋: ๋ณต์กํ ํ์ ๋ ์์ฝ๊ฒ ๋ค๋ฃจ๋ ๋ฐฉ๋ฒ
TypeScript ๊ฐ๋ฐ์์ ๋ง์ฃผํ๋ ๋ณต์กํ ํ์ ์ถ๋ก ๋ฌธ์ , ์กฐ๊ฑด๋ถ ํ์ ๊ณผ infer ํค์๋๋ฅผ ํ์ฉํ๋ฉด ํจ์ฌ ์ฐ์ํ๊ณ ๊ฐ๋ ฅํ๊ฒ ํด๊ฒฐํ ์ ์์ด์. ์ค์ ์์ ์ ํจ๊ป ๊ทธ ํ์ฉ๋ฒ์ ์ฌ๋ ์๊ฒ ๋ค๋ค๋ด ๋๋ค.
- ๋จ์ด: 1,697๊ฐ21๋ถ
[๐ค] JavaScript ์ด๋ฒคํธ ๋ฃจํ(Event Loop) ์์ ์ ๋ณต: ๋น๋๊ธฐ ์ฒ๋ฆฌ์ ๋ฐํ์ ๋์ ์๋ฆฌ
JavaScript์ ํต์ฌ ๋น๋๊ธฐ ์ฒ๋ฆฌ ๋ฉ์ปค๋์ฆ์ธ ์ด๋ฒคํธ ๋ฃจํ์ ๋์ ์๋ฆฌ๋ฅผ ์ฌ๋ ์๊ฒ ํํค์ณ ๋ด์. ์ฝ ์คํ, ํ์คํฌ ํ, ๋ง์ดํฌ๋กํ์คํฌ ํ์์ ์ํธ์์ฉ์ ์ดํดํ๊ณ , ์ค๋ฌด์์ ๋ง์ฃผ์น๋ ๋น๋๊ธฐ ์ฝ๋์ ๋์์ ๋ช ํํ ์์ธกํ๋ ๋ฐฉ๋ฒ์ ์๋ ค๋๋ ค์.
- ๋จ์ด: 1,960๊ฐ23๋ถ
[๐ค] Next.js Server & Client Components, ์ค์ ์์ ํ๋ช ํ๊ฒ ์ ํํ๋ ๊ฐ์ด๋
Next.js App Router์์ Server Components์ Client Components ์ค ์ด๋ค ๊ฒ์ ์ฌ์ฉํด์ผ ํ ์ง ๊ณ ๋ฏผ์ด์ ๊ฐ์? ์ด ๊ธ์์ ๋ ์ปดํฌ๋ํธ์ ํต์ฌ ์ฐจ์ด์ , ์ฌ์ฉ ์์ , ๊ทธ๋ฆฌ๊ณ ์ฑ๋ฅ ์ต์ ํ๋ฅผ ์ํ ์ค์ ์ ๋ต์ ๋ธ๋ฃจ๊ฐ ์๋ ค๋๋ฆด๊ฒ์.
- ๋จ์ด: 1,878๊ฐ21๋ถ
[๐ค] TypeScript satisfies ์ฐ์ฐ์: ํ์ ์ถ๋ก ๊ณผ ์์ ์ฑ์ ๋์์ ์ก๋ ๋น๋ฒ
TypeScript์ `satisfies` ์ฐ์ฐ์๋ฅผ ํ์ฉํ์ฌ ํ์ ์ถ๋ก ์ ์ ์ฐ์ฑ์ ์ ์งํ๋ฉด์๋ ์๊ฒฉํ ํ์ ์์ ์ฑ์ ํ๋ณดํ๋ ๋ฐฉ๋ฒ์ ์์๋ณด์ธ์. ์ค์ฉ์ ์ธ ์์๋ฅผ ํตํด ์ค์ ํ๋ก์ ํธ์ ์ ์ฉํ๋ ๋ ธํ์ฐ๋ฅผ ๊ณต์ ํฉ๋๋ค.
- ๋จ์ด: 1,207๊ฐ15๋ถ
[๐ค] React 19 ์๋ก์ด ๊ธฐ๋ฅ: use ํ , Actions, ๊ทธ๋ฆฌ๊ณ ์ปดํ์ผ๋ฌ ๋ฏธ๋ฆฌ๋ณด๊ธฐ
React 19์ ํต์ฌ ๋ณ๊ฒฝ ์ฌํญ์ธ use ํ , ์๋ฒ ์ก์ , ๊ทธ๋ฆฌ๊ณ React ์ปดํ์ผ๋ฌ์ ๋์ ๋ฐฐ๊ฒฝ๊ณผ ์ค์ ํ์ฉ ์์๋ฅผ ์ด์ค๊ธ ๊ฐ๋ฐ์ ๋๋์ด์ ๋ง์ถฐ ์์ธํ ์ค๋ช ํฉ๋๋ค. ์ต์ React ์ ๋ฐ์ดํธ๋ฅผ ํตํด ์ ํ๋ฆฌ์ผ์ด์ ์ฑ๋ฅ๊ณผ ๊ฐ๋ฐ ๊ฒฝํ์ ํฅ์์ํค๋ ๋ฐฉ๋ฒ์ ์์๋ณด์ธ์.
- ๋จ์ด: 1,512๊ฐ16๋ถ
[๐ค] Next.js App Router ์บ์ฑ ์ ๋ต: ๋ฐ์ดํฐ ์ฌ๊ฒ์ฆ (revalidatePath, revalidateTag) ์๋ฒฝ ๊ฐ์ด๋
Next.js 14 App Router์์ ํจ์จ์ ์ธ ๋ฐ์ดํฐ ์บ์ฑ ์ ๋ต๊ณผ revalidatePath, revalidateTag๋ฅผ ์ด์ฉํ ๋ฐ์ดํฐ ์ฌ๊ฒ์ฆ ๋ฐฉ๋ฒ์ ์ค๋ฌด ์์์ ํจ๊ป ์์ธํ ์์๋ณด๊ณ ์น ์ฑ๋ฅ์ ์ต์ ํํ๋ ๋ฐฉ๋ฒ์ ๋ฐฐ์๋ณด์ธ์.