๐Ÿš€ ๊ณ ๊ธ‰ ํƒ€์ž…: Partial, Readonly, Record, Pick ํ™œ์šฉํ•˜๊ธฐ ๐Ÿš€

์ฝ˜ํ…์ธ  ๋Œ€ํ‘œ ์ด๋ฏธ์ง€ - ๐Ÿš€ ๊ณ ๊ธ‰ ํƒ€์ž…: Partial, Readonly, Record, Pick ํ™œ์šฉํ•˜๊ธฐ ๐Ÿš€

 

 

์•ˆ๋…•, ํƒ€์ž…์Šคํฌ๋ฆฝํŠธ ์นœ๊ตฌ๋“ค! ์˜ค๋Š˜์€ ์ •๋ง ์žฌ๋ฐŒ๊ณ  ์œ ์šฉํ•œ ์ฃผ์ œ๋ฅผ ๊ฐ€์ง€๊ณ  ์™”์–ด. ๋ฐ”๋กœ ํƒ€์ž…์Šคํฌ๋ฆฝํŠธ์˜ ๊ณ ๊ธ‰ ํƒ€์ž…๋“ค์ธ Partial, Readonly, Record, Pick์— ๋Œ€ํ•ด ๊นŠ์ด ํŒŒํ—ค์ณ๋ณผ ๊ฑฐ์•ผ. ์ด ๋…€์„๋“ค์„ ์ œ๋Œ€๋กœ ์•Œ๋ฉด ๋„ˆ์˜ ์ฝ”๋”ฉ ์‹ค๋ ฅ์ด ํ•˜๋Š˜์„ ์ฐŒ๋ฅผ ๊ฑฐ๋ผ๊ณ ! ๐Ÿ˜Ž

๊ทธ๋Ÿผ ์šฐ๋ฆฌ ํ•จ๊ป˜ ํƒ€์ž…์Šคํฌ๋ฆฝํŠธ์˜ ์„ธ๊ณ„๋กœ ๋น ์ ธ๋ณผ๊นŒ? ์ด ์—ฌ์ •์€ ๋งˆ์น˜ ์žฌ๋Šฅ๋„ท์—์„œ ์ƒˆ๋กœ์šด ์žฌ๋Šฅ์„ ๋ฐœ๊ฒฌํ•˜๋Š” ๊ฒƒ์ฒ˜๋Ÿผ ์‹ ์„ ํ•˜๊ณ  ํฅ๋ฏธ์ง„์ง„ํ•  ๊ฑฐ์•ผ. ์ž, ์•ˆ์ „๋ฒจํŠธ ๋งค๊ณ  ์ถœ๋ฐœ~! ๐Ÿš—๐Ÿ’จ

๐ŸŽ“ ์•Œ์ญ๋‹ฌ์ญ ํƒ€์ž…์Šคํฌ๋ฆฝํŠธ tip: ํƒ€์ž…์Šคํฌ๋ฆฝํŠธ์˜ ๊ณ ๊ธ‰ ํƒ€์ž…๋“ค์€ ๋งˆ์น˜ ์žฌ๋Šฅ๋„ท์—์„œ ๋‹ค์–‘ํ•œ ์žฌ๋Šฅ์„ ์ฐพ๋Š” ๊ฒƒ์ฒ˜๋Ÿผ, ์ฝ”๋“œ์— ๋‹ค์–‘ํ•œ "์žฌ๋Šฅ"์„ ๋ถ€์—ฌํ•ด์ฃผ๋Š” ๋„๊ตฌ๋“ค์ด์•ผ. ์ด๋“ค์„ ์ž˜ ํ™œ์šฉํ•˜๋ฉด ๋„ค ์ฝ”๋“œ๊ฐ€ ๋”์šฑ ์œ ์—ฐํ•˜๊ณ  ๊ฐ•๋ ฅํ•ด์งˆ ๊ฑฐ์•ผ!

๐Ÿงฉ Partial<T>: ๋ถ€๋ถ„์ ์œผ๋กœ ์ฑ„์›Œ๋„ฃ๋Š” ๋งˆ๋ฒ• ๐Ÿงฉ

์ž, ์ฒซ ๋ฒˆ์งธ๋กœ ๋งŒ๋‚˜๋ณผ ๋…€์„์€ ๋ฐ”๋กœ Partial์ด์•ผ. Partial์€ ๋ง ๊ทธ๋Œ€๋กœ "๋ถ€๋ถ„์ "์ด๋ผ๋Š” ๋œป์„ ๊ฐ€์ง€๊ณ  ์žˆ์–ด. ์ด ๋…€์„์ด ํ•˜๋Š” ์ผ์€ ์ •๋ง ๋Œ€๋‹จํ•ด. ์–ด๋–ค ํƒ€์ž…์˜ ๋ชจ๋“  ํ”„๋กœํผํ‹ฐ๋ฅผ ์„ ํƒ์ ์œผ๋กœ ๋งŒ๋“ค์–ด์ฃผ๋Š” ๊ฑฐ์ง€!

์˜ˆ๋ฅผ ๋“ค์–ด๋ณผ๊นŒ? ์šฐ๋ฆฌ๊ฐ€ ์‚ฌ์šฉ์ž ์ •๋ณด๋ฅผ ๋‹ค๋ฃจ๋Š” ์ธํ„ฐํŽ˜์ด์Šค๊ฐ€ ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ•ด๋ณด์ž.


interface User {
  name: string;
  age: number;
  email: string;
}

์ด๋ ‡๊ฒŒ ์žˆ์„ ๋•Œ, Partial์„ ์‚ฌ์šฉํ•˜๋ฉด ์–ด๋–ป๊ฒŒ ๋ ๊นŒ?


type PartialUser = Partial<User>;

์งœ์ž”! ์ด์ œ PartialUser๋Š” ์ด๋ ‡๊ฒŒ ๋ณ€ํ–ˆ์–ด:


{
  name?: string;
  age?: number;
  email?: string;
}

๋ชจ๋“  ํ”„๋กœํผํ‹ฐ๊ฐ€ ์„ ํƒ์ (optional)์ด ๋˜์—ˆ์ง€? ์ด๊ฒŒ ๋ฐ”๋กœ Partial์˜ ๋งˆ๋ฒ•์ด์•ผ! ๐ŸŽฉโœจ

๐Ÿ’ก ์™œ ์ด๊ฒŒ ์œ ์šฉํ• ๊นŒ? ๊ฐ์ฒด์˜ ์ผ๋ถ€๋ถ„๋งŒ ์—…๋ฐ์ดํŠธํ•˜๊ณ  ์‹ถ์„ ๋•Œ ์ •๋ง ํŽธ๋ฆฌํ•ด. ์˜ˆ๋ฅผ ๋“ค์–ด, ์‚ฌ์šฉ์ž ์ •๋ณด ์ค‘ ์ด๋ฉ”์ผ๋งŒ ๋ณ€๊ฒฝํ•˜๊ณ  ์‹ถ๋‹ค๋ฉด ์ด๋ ‡๊ฒŒ ํ•  ์ˆ˜ ์žˆ์ง€:


function updateUser(id: string, updates: Partial<User>) {
  // ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์—์„œ ์‚ฌ์šฉ์ž๋ฅผ ์ฐพ์•„ ์—…๋ฐ์ดํŠธํ•˜๋Š” ๋กœ์ง
}

updateUser('123', { email: 'new@email.com' });

์ด๋ ‡๊ฒŒ Partial์„ ์‚ฌ์šฉํ•˜๋ฉด, ๋ชจ๋“  ํ•„๋“œ๋ฅผ ๋‹ค ์ฑ„์šธ ํ•„์š” ์—†์ด ์›ํ•˜๋Š” ํ•„๋“œ๋งŒ ์—…๋ฐ์ดํŠธํ•  ์ˆ˜ ์žˆ์–ด. ๋งˆ์น˜ ์žฌ๋Šฅ๋„ท์—์„œ ์›ํ•˜๋Š” ์žฌ๋Šฅ๋งŒ ๊ณจ๋ผ์„œ ๋ฐฐ์šฐ๋Š” ๊ฒƒ์ฒ˜๋Ÿผ ๋ง์ด์•ผ! ๐Ÿ˜‰

๐ŸŽจ Partial ํ™œ์šฉ ์˜ˆ์‹œ: ๊ทธ๋ฆผ ๊ทธ๋ฆฌ๊ธฐ ์•ฑ

์ž, ์ด์ œ Partial์„ ์‹ค์ œ๋กœ ์–ด๋–ป๊ฒŒ ํ™œ์šฉํ•  ์ˆ˜ ์žˆ๋Š”์ง€ ์žฌ๋ฏธ์žˆ๋Š” ์˜ˆ์‹œ๋ฅผ ๋“ค์–ด๋ณผ๊ฒŒ. ์šฐ๋ฆฌ๊ฐ€ ๊ฐ„๋‹จํ•œ ๊ทธ๋ฆผ ๊ทธ๋ฆฌ๊ธฐ ์•ฑ์„ ๋งŒ๋“ ๋‹ค๊ณ  ์ƒ๊ฐํ•ด๋ณด์ž!


interface DrawingOptions {
  color: string;
  thickness: number;
  tool: 'pencil' | 'brush' | 'eraser';
  opacity: number;
}

function draw(options: DrawingOptions) {
  // ๊ทธ๋ฆผ ๊ทธ๋ฆฌ๋Š” ๋กœ์ง
}

์ด๋ ‡๊ฒŒ ์žˆ์„ ๋•Œ, ๋งค๋ฒˆ ๋ชจ๋“  ์˜ต์…˜์„ ์ง€์ •ํ•˜๋Š” ๊ฑด ๋„ˆ๋ฌด ๊ท€์ฐฎ๊ฒ ์ง€? ๊ทธ๋ž˜์„œ ์šฐ๋ฆฌ๋Š” Partial์„ ์‚ฌ์šฉํ•ด์„œ ๊ธฐ๋ณธ๊ฐ’์„ ์„ค์ •ํ•˜๊ณ , ์‚ฌ์šฉ์ž๊ฐ€ ์›ํ•˜๋Š” ์˜ต์…˜๋งŒ ๋ณ€๊ฒฝํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋งŒ๋“ค ์ˆ˜ ์žˆ์–ด.


const defaultOptions: DrawingOptions = {
  color: 'black',
  thickness: 1,
  tool: 'pencil',
  opacity: 1
};

function drawWithDefaults(options: Partial<DrawingOptions>) {
  const finalOptions = { ...defaultOptions, ...options };
  draw(finalOptions);
}

// ์ด์ œ ์ด๋ ‡๊ฒŒ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์–ด!
drawWithDefaults({ color: 'red' });
drawWithDefaults({ tool: 'brush', thickness: 3 });

์™€! ์ด์ œ ๊ทธ๋ฆผ ๊ทธ๋ฆฌ๊ธฐ๊ฐ€ ํ›จ์”ฌ ๋” ์œ ์—ฐํ•ด์กŒ์–ด. ๋งˆ์น˜ ์žฌ๋Šฅ๋„ท์—์„œ ์›ํ•˜๋Š” ์žฌ๋Šฅ๋งŒ ๊ณจ๋ผ ๋ฐฐ์šฐ๋Š” ๊ฒƒ์ฒ˜๋Ÿผ, ์›ํ•˜๋Š” ์˜ต์…˜๋งŒ ์„ ํƒํ•ด์„œ ๊ทธ๋ฆผ์„ ๊ทธ๋ฆด ์ˆ˜ ์žˆ๊ฒŒ ๋œ ๊ฑฐ์ง€. ๐Ÿ‘จโ€๐ŸŽจ๐ŸŽจ

๊ทธ๋ฆผ ๊ทธ๋ฆฌ๊ธฐ ๋„๊ตฌ ์•„์ด์ฝ˜ ์ƒ‰์ƒ ๋‘๊ป˜ ๋„๊ตฌ

์ด SVG๋Š” ์šฐ๋ฆฌ๊ฐ€ ๋ฐฉ๊ธˆ ๋งŒ๋“  ๊ทธ๋ฆผ ๊ทธ๋ฆฌ๊ธฐ ์•ฑ์˜ ์ฃผ์š” ์˜ต์…˜๋“ค์„ ์‹œ๊ฐํ™”ํ•œ ๊ฑฐ์•ผ. ์ƒ‰์ƒ, ๋‘๊ป˜, ๋„๊ตฌ๋ฅผ ๊ฐ๊ฐ ์›, ์‚ฌ๊ฐํ˜•, ์‚ผ๊ฐํ˜•์œผ๋กœ ํ‘œํ˜„ํ–ˆ์ง€. ์ด๋ ‡๊ฒŒ Partial์„ ์‚ฌ์šฉํ•˜๋ฉด ์ด ์˜ต์…˜๋“ค์„ ์ž์œ ๋กญ๊ฒŒ ์กฐํ•ฉํ•ด์„œ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ๊ฑฐ์•ผ!

๐ŸŒŸ Partial์˜ ์ง„๊ฐ€: Partial์€ ํŠนํžˆ ํฐ ๊ฐ์ฒด๋ฅผ ๋‹ค๋ฃฐ ๋•Œ ๊ทธ ์ง„๊ฐ€๋ฅผ ๋ฐœํœ˜ํ•ด. ์˜ˆ๋ฅผ ๋“ค์–ด, ์‚ฌ์šฉ์ž ์„ค์ •์ด๋‚˜ ์•ฑ์˜ ์ƒํƒœ๋ฅผ ๊ด€๋ฆฌํ•  ๋•Œ ์•„์ฃผ ์œ ์šฉํ•˜์ง€. ๋ชจ๋“  ์„ค์ •์„ ํ•œ ๋ฒˆ์— ๋‹ค ๋ฐ”๊พธ๋Š” ๊ฒฝ์šฐ๋Š” ๋“œ๋ฌผ์ž–์•„? Partial์„ ์‚ฌ์šฉํ•˜๋ฉด ํ•„์š”ํ•œ ๋ถ€๋ถ„๋งŒ ์™์™ ๊ณจ๋ผ์„œ ์—…๋ฐ์ดํŠธํ•  ์ˆ˜ ์žˆ์–ด!

๐Ÿง  Partial ์‹ฌํ™”: ์ค‘์ฒฉ๋œ ๊ฐ์ฒด ๋‹ค๋ฃจ๊ธฐ

์ž, ์ด์ œ ์ข€ ๋” ๋ณต์žกํ•œ ์ƒํ™ฉ์„ ์ƒ๊ฐํ•ด๋ณด์ž. ๊ฐ์ฒด ์•ˆ์— ๊ฐ์ฒด๊ฐ€ ์žˆ๋Š” ๊ฒฝ์šฐ๋Š” ์–ด๋–จ๊นŒ? ์ด๋Ÿฐ ๊ฒฝ์šฐ์— Partial์„ ์–ด๋–ป๊ฒŒ ํ™œ์šฉํ•  ์ˆ˜ ์žˆ์„์ง€ ์•Œ์•„๋ณด์ž!


interface AdvancedDrawingOptions {
  brush: {
    color: string;
    size: number;
  };
  canvas: {
    width: number;
    height: number;
  };
  effects: {
    blur: number;
    saturation: number;
  };
}

์ด๋Ÿฐ ๋ณต์žกํ•œ ๊ฐ์ฒด๊ฐ€ ์žˆ์„ ๋•Œ, ๋‹จ์ˆœํžˆ Partial<AdvancedDrawingOptions>๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ์ตœ์ƒ์œ„ ํ”„๋กœํผํ‹ฐ๋งŒ ์„ ํƒ์ ์ด ๋ผ. ํ•˜์œ„ ๊ฐ์ฒด์˜ ํ”„๋กœํผํ‹ฐ๋Š” ์—ฌ์ „ํžˆ ํ•„์ˆ˜์•ผ. ์ด๋Ÿด ๋•Œ ์šฐ๋ฆฌ๋Š” ์žฌ๊ท€์  Partial ํƒ€์ž…์„ ๋งŒ๋“ค์–ด ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์–ด!


type DeepPartial<T> = {
  [P in keyof T]?: T[P] extends object ? DeepPartial<T[P]> : T[P];
};

function updateAdvancedDrawingOptions(options: DeepPartial<AdvancedDrawingOptions>) {
  // ์—…๋ฐ์ดํŠธ ๋กœ์ง
}

// ์ด์ œ ์ด๋ ‡๊ฒŒ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์–ด!
updateAdvancedDrawingOptions({
  brush: { color: 'blue' },
  effects: { blur: 5 }
});

์™€์šฐ! ์ด์ œ ์ •๋ง ๊นŠ์ˆ™ํ•œ ๊ณณ์— ์žˆ๋Š” ์˜ต์…˜๊นŒ์ง€ ์ž์œ ์ž์žฌ๋กœ ์—…๋ฐ์ดํŠธํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋์–ด. ์ด๊ฑด ๋งˆ์น˜ ์žฌ๋Šฅ๋„ท์—์„œ "๊ทธ๋ฆผ ๊ทธ๋ฆฌ๊ธฐ" ๋ผ๋Š” ํฐ ์นดํ…Œ๊ณ ๋ฆฌ ์•ˆ์—์„œ "์ˆ˜์ฑ„ํ™” ๊ธฐ๋ฒ•" ๊ฐ™์€ ์„ธ๋ถ€ ๊ธฐ์ˆ ๋งŒ ์™ ๊ณจ๋ผ ๋ฐฐ์šฐ๋Š” ๊ฒƒ๊ณผ ๊ฐ™์•„! ๐Ÿ˜ƒ

์ค‘์ฒฉ๋œ ๊ทธ๋ฆผ ๊ทธ๋ฆฌ๊ธฐ ์˜ต์…˜ ๊ตฌ์กฐ AdvancedDrawingOptions brush canvas effects color width blur

์ด ๋‹ค์ด์–ด๊ทธ๋žจ์€ ์šฐ๋ฆฌ์˜ AdvancedDrawingOptions ๊ตฌ์กฐ๋ฅผ ์‹œ๊ฐํ™”ํ•œ ๊ฑฐ์•ผ. ์ตœ์ƒ์œ„ ๊ฐ์ฒด ์•„๋ž˜์— brush, canvas, effects๋ผ๋Š” ํ•˜์œ„ ๊ฐ์ฒด๋“ค์ด ์žˆ๊ณ , ๊ฐ๊ฐ์˜ ํ•˜์œ„ ๊ฐ์ฒด๋Š” ๋˜ ์ž์‹ ๋งŒ์˜ ํ”„๋กœํผํ‹ฐ๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ์ง€. DeepPartial์„ ์‚ฌ์šฉํ•˜๋ฉด ์ด ๊ตฌ์กฐ์˜ ์–ด๋–ค ๋ถ€๋ถ„์ด๋“  ์„ ํƒ์ ์œผ๋กœ ์—…๋ฐ์ดํŠธํ•  ์ˆ˜ ์žˆ์–ด!

๐Ÿš€ Partial์˜ ํž˜: Partial, ํŠนํžˆ DeepPartial์€ ์ •๋ง ๊ฐ•๋ ฅํ•œ ๋„๊ตฌ์•ผ. ๋ณต์žกํ•œ ์„ค์ • ๊ฐ์ฒด๋ฅผ ๋‹ค๋ฃฐ ๋•Œ, API ์‘๋‹ต์˜ ์ผ๋ถ€๋งŒ ์‚ฌ์šฉํ•ด์•ผ ํ•  ๋•Œ, ๋˜๋Š” ํฐ ์ƒํƒœ ๊ฐ์ฒด์˜ ์ผ๋ถ€๋งŒ ์—…๋ฐ์ดํŠธํ•ด์•ผ ํ•  ๋•Œ ์•„์ฃผ ์œ ์šฉํ•˜์ง€. ์ด๊ฑธ ์ž˜ ํ™œ์šฉํ•˜๋ฉด ์ฝ”๋“œ์˜ ์œ ์—ฐ์„ฑ์ด ์—„์ฒญ๋‚˜๊ฒŒ ๋†’์•„์งˆ ๊ฑฐ์•ผ!

๐ŸŽญ Partial๊ณผ ํ•จ๊ป˜ ์‚ฌ์šฉํ•˜๋ฉด ์ข‹์€ ์นœ๊ตฌ๋“ค

Partial์€ ํ˜ผ์ž์„œ๋„ ๊ฐ•๋ ฅํ•˜์ง€๋งŒ, ๋‹ค๋ฅธ ํƒ€์ž… ์œ ํ‹ธ๋ฆฌํ‹ฐ๋“ค๊ณผ ํ•จ๊ป˜ ์‚ฌ์šฉํ•˜๋ฉด ๋”์šฑ ๊ฐ•๋ ฅํ•ด์ ธ. ๋ช‡ ๊ฐ€์ง€ ์˜ˆ๋ฅผ ์‚ดํŽด๋ณผ๊นŒ?

  1. Required<T>: Partial์˜ ๋ฐ˜๋Œ€์•ผ. ๋ชจ๋“  ํ”„๋กœํผํ‹ฐ๋ฅผ ํ•„์ˆ˜๋กœ ๋งŒ๋“ค์–ด์ค˜.
  2. Pick<T, K>: ํŠน์ • ํ”„๋กœํผํ‹ฐ๋งŒ ์„ ํƒํ•ด์„œ ์ƒˆ๋กœ์šด ํƒ€์ž…์„ ๋งŒ๋“ค์–ด.
  3. Omit<T, K>: ํŠน์ • ํ”„๋กœํผํ‹ฐ๋ฅผ ์ œ์™ธํ•œ ์ƒˆ๋กœ์šด ํƒ€์ž…์„ ๋งŒ๋“ค์–ด.

์ด๋“ค์„ Partial๊ณผ ์กฐํ•ฉํ•ด์„œ ์‚ฌ์šฉํ•˜๋ฉด ์ •๋ง ๋‹ค์–‘ํ•œ ์ƒํ™ฉ์— ๋Œ€์‘ํ•  ์ˆ˜ ์žˆ์–ด. ์˜ˆ๋ฅผ ๋“ค์–ด๋ณผ๊นŒ?


interface User {
  id: number;
  name: string;
  email: string;
  age: number;
  address: string;
}

// id๋ฅผ ์ œ์™ธํ•œ ๋‚˜๋จธ์ง€ ํ•„๋“œ๋ฅผ ์„ ํƒ์ ์œผ๋กœ ๋งŒ๋“ค๊ธฐ
type UpdateUser = { id: number } & Partial<Omit<User, 'id'>>;

function updateUser(user: UpdateUser) {
  // ์—…๋ฐ์ดํŠธ ๋กœ์ง
}

// ์ด๋ ‡๊ฒŒ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์–ด!
updateUser({ id: 1, name: "New Name" });
updateUser({ id: 2, email: "new@email.com", age: 30 });

์ด๋ ‡๊ฒŒ ํ•˜๋ฉด id๋Š” ํ•ญ์ƒ ํ•„์š”ํ•˜์ง€๋งŒ, ๋‚˜๋จธ์ง€ ํ•„๋“œ๋Š” ์„ ํƒ์ ์œผ๋กœ ์—…๋ฐ์ดํŠธํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋ผ. ์™„์ „ ์œ ์—ฐํ•˜์ง€ ์•Š์•„? ๐Ÿ˜Ž

Partial๊ณผ ๋‹ค๋ฅธ ํƒ€์ž… ์œ ํ‹ธ๋ฆฌํ‹ฐ์˜ ์กฐํ•ฉ Partial Required Pick Omit

์ด ๋‹ค์ด์–ด๊ทธ๋žจ์€ Partial๊ณผ ๋‹ค๋ฅธ ํƒ€์ž… ์œ ํ‹ธ๋ฆฌํ‹ฐ๋“ค์˜ ๊ด€๊ณ„๋ฅผ ๋ณด์—ฌ์ค˜. Partial์ด ์ค‘์‹ฌ์— ์žˆ๊ณ , ๋‹ค๋ฅธ ์œ ํ‹ธ๋ฆฌํ‹ฐ๋“ค์ด ์ฃผ๋ณ€์„ ๋‘˜๋Ÿฌ์‹ธ๊ณ  ์žˆ์–ด. ์ด๋“ค์„ ์ ์ ˆํžˆ ์กฐํ•ฉํ•˜๋ฉด ์ •๋ง ๊ฐ•๋ ฅํ•œ ํƒ€์ž…์„ ๋งŒ๋“ค ์ˆ˜ ์žˆ์ง€!

๐Ÿ’ก ์‹ค์ „ ํŒ: ์‹ค์ œ ํ”„๋กœ์ ํŠธ์—์„œ๋Š” ์ด๋Ÿฐ ํƒ€์ž… ์กฐํ•ฉ์„ ์ž์ฃผ ์‚ฌ์šฉํ•˜๊ฒŒ ๋  ๊ฑฐ์•ผ. ํŠนํžˆ API์™€ ์ƒํ˜ธ์ž‘์šฉํ•  ๋•Œ, ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ๋ชจ๋ธ์„ ๋‹ค๋ฃฐ ๋•Œ, ๋˜๋Š” ๋ณต์žกํ•œ ์ƒํƒœ ๊ด€๋ฆฌ๋ฅผ ํ•  ๋•Œ ์ด๋Ÿฐ ๊ธฐ์ˆ ์ด ๋น›์„ ๋ฐœํ•˜์ง€. ๋งˆ์น˜ ์žฌ๋Šฅ๋„ท์—์„œ ์—ฌ๋Ÿฌ ์žฌ๋Šฅ์„ ์กฐํ•ฉํ•ด ์ƒˆ๋กœ์šด ๊ฐ€์น˜๋ฅผ ๋งŒ๋“ค์–ด๋‚ด๋Š” ๊ฒƒ์ฒ˜๋Ÿผ ๋ง์ด์•ผ!

์ž, ์ด์ œ Partial์— ๋Œ€ํ•ด ๊ฝค ๊นŠ์ด ์•Œ์•„๋ดค์–ด. ์ด ๋…€์„์„ ์ž˜ ํ™œ์šฉํ•˜๋ฉด ๋„ค ์ฝ”๋“œ๊ฐ€ ํ›จ์”ฌ ๋” ์œ ์—ฐํ•ด์งˆ ๊ฑฐ์•ผ. ๋‹ค์Œ์œผ๋กœ๋Š” Readonly์— ๋Œ€ํ•ด ์•Œ์•„๋ณผ ํ…๋ฐ, ์ด๊ฒƒ๋„ ์ •๋ง ์žฌ๋ฐŒ์„ ๊ฑฐ์•ผ! ๊ณ„์† ๋”ฐ๋ผ์™€์ค˜! ๐Ÿš€

๐Ÿ”’ Readonly<T>: ๋ถˆ๋ณ€์„ฑ์˜ ๋งˆ๋ฒ•์‚ฌ ๐Ÿ”’

์ž, ์ด์ œ ์šฐ๋ฆฌ์˜ ๋‘ ๋ฒˆ์งธ ์ฃผ์ธ๊ณต Readonly๋ฅผ ๋งŒ๋‚˜๋ณผ ์‹œ๊ฐ„์ด์•ผ! Readonly๋Š” ๋ง ๊ทธ๋Œ€๋กœ "์ฝ๊ธฐ ์ „์šฉ"์„ ๋งŒ๋“ค์–ด์ฃผ๋Š” ๋งˆ๋ฒ•์‚ฌ์•ผ. ์ด ๋…€์„์ด ํ•˜๋Š” ์ผ์€ ๊ฐ์ฒด์˜ ๋ชจ๋“  ํ”„๋กœํผํ‹ฐ๋ฅผ ์ฝ๊ธฐ ์ „์šฉ์œผ๋กœ ๋งŒ๋“ค์–ด์ฃผ๋Š” ๊ฑฐ์ง€. ํ•œ ๋ฒˆ ์„ค์ •ํ•˜๋ฉด ๋ณ€๊ฒฝํ•  ์ˆ˜ ์—†๊ฒŒ ๋˜๋Š” ๊ฑฐ์•ผ!

์˜ˆ๋ฅผ ๋“ค์–ด๋ณผ๊นŒ? ์šฐ๋ฆฌ๊ฐ€ ์ฑ… ์ •๋ณด๋ฅผ ๋‹ค๋ฃจ๋Š” ์ธํ„ฐํŽ˜์ด์Šค๊ฐ€ ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ•ด๋ณด์ž.


interface Book {
  title: string;
  author: string;
  publishYear: number;
}

์ด์ œ Readonly๋ฅผ ์‚ฌ์šฉํ•ด๋ณด๋ฉด:


type ReadonlyBook = Readonly<Book>;

์งœ์ž”! ReadonlyBook์€ ์ด๋ ‡๊ฒŒ ๋ณ€ํ–ˆ์–ด:


{
  readonly title: string;
  readonly author: string;
  readonly publishYear: number;
}

๋ชจ๋“  ํ”„๋กœํผํ‹ฐ ์•ž์— readonly๊ฐ€ ๋ถ™์—ˆ์ง€? ์ด์ œ ์ด ๊ฐ์ฒด์˜ ํ”„๋กœํผํ‹ฐ๋“ค์€ ํ•œ ๋ฒˆ ์„ค์ •๋˜๋ฉด ๋ณ€๊ฒฝํ•  ์ˆ˜ ์—†์–ด. ๋งˆ์น˜ ๋„์„œ๊ด€์˜ ์ฑ…์ฒ˜๋Ÿผ, ๋ณผ ์ˆ˜๋Š” ์žˆ์ง€๋งŒ ๋‚ด์šฉ์„ ๋ฐ”๊ฟ€ ์ˆœ ์—†์ง€! ๐Ÿ“š

๐Ÿ’ก ์™œ ์ด๊ฒŒ ์œ ์šฉํ• ๊นŒ? ๋ถˆ๋ณ€์„ฑ(Immutability)์€ ํ”„๋กœ๊ทธ๋ž˜๋ฐ์—์„œ ์ •๋ง ์ค‘์š”ํ•œ ๊ฐœ๋…์ด์•ผ. ๋ฐ์ดํ„ฐ๊ฐ€ ์˜ˆ์ƒ์น˜ ๋ชปํ•˜๊ฒŒ ๋ณ€๊ฒฝ๋˜๋Š” ๊ฑธ ๋ฐฉ์ง€ํ•˜๊ณ , ์ฝ”๋“œ์˜ ์˜ˆ์ธก ๊ฐ€๋Šฅ์„ฑ์„ ๋†’์—ฌ์ฃผ์ง€. ํŠนํžˆ ํ•จ์ˆ˜ํ˜• ํ”„๋กœ๊ทธ๋ž˜๋ฐ์—์„œ ๋งŽ์ด ์‚ฌ์šฉ๋˜๋Š” ๊ฐœ๋…์ด์•ผ.

Readonly๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด, ๊ฐ์ฒด๊ฐ€ ์ƒ์„ฑ๋œ ํ›„์— ์‹ค์ˆ˜๋กœ ๊ฐ’์ด ๋ณ€๊ฒฝ๋˜๋Š” ๊ฒƒ์„ ๋ฐฉ์ง€ํ•  ์ˆ˜ ์žˆ์–ด. ์ด๊ฑด ๋งˆ์น˜ ์žฌ๋Šฅ๋„ท์—์„œ ํ•œ ๋ฒˆ ๋“ฑ๋กํ•œ ์žฌ๋Šฅ์„ ํ•จ๋ถ€๋กœ ์ˆ˜์ •ํ•  ์ˆ˜ ์—†๊ฒŒ ํ•˜๋Š” ๊ฒƒ๊ณผ ๋น„์Šทํ•ด. ์‹ ๋ขฐ์„ฑ์ด ๋†’์•„์ง€๋Š” ๊ฑฐ์ง€! ๐Ÿ˜‰

๐Ÿ“š Readonly ํ™œ์šฉ ์˜ˆ์‹œ: ๋„์„œ๊ด€ ์‹œ์Šคํ…œ

์ž, ์ด์ œ Readonly๋ฅผ ์‹ค์ œ๋กœ ์–ด๋–ป๊ฒŒ ํ™œ์šฉํ•  ์ˆ˜ ์žˆ๋Š”์ง€ ์žฌ๋ฏธ์žˆ๋Š” ์˜ˆ์‹œ๋ฅผ ๋“ค์–ด๋ณผ๊ฒŒ. ์šฐ๋ฆฌ๊ฐ€ ์ž‘์€ ๋„์„œ๊ด€ ์‹œ์Šคํ…œ์„ ๋งŒ๋“ ๋‹ค๊ณ  ์ƒ๊ฐํ•ด๋ณด์ž!


interface LibraryBook {
  id: number;
  title: string;
  author: string;
  isbn: string;
  publishYear: number;
}

type CatalogBook = Readonly<LibraryBook>;

const book: CatalogBook = {
  id: 1,
  title: "TypeScript ๋งˆ์Šคํ„ฐํ•˜๊ธฐ",
  author: "๊ฐœ๋ฐœ์™•",
  isbn: "123-456-789",
  publishYear: 2023
};

// ์ด๋ ‡๊ฒŒ ํ•˜๋ฉด ์—๋Ÿฌ๊ฐ€ ๋ฐœ์ƒํ•ด!
// book.title = "JavaScript ๋งˆ์Šคํ„ฐํ•˜๊ธฐ"; // Error: Cannot assign to 'title' because it is a read-only property.

์™€! ์ด์ œ ์šฐ๋ฆฌ์˜ ๋„์„œ ์นดํƒˆ๋กœ๊ทธ๋Š” ์•ˆ์ „ํ•ด์กŒ์–ด. ํ•œ ๋ฒˆ ๋“ฑ๋ก๋œ ์ฑ… ์ •๋ณด๋Š” ๋ณ€๊ฒฝํ•  ์ˆ˜ ์—†์œผ๋‹ˆ๊นŒ ์‹ค์ˆ˜๋กœ ์ •๋ณด๊ฐ€ ๋ฐ”๋€Œ๋Š” ์ผ์€ ์—†์„ ๊ฑฐ์•ผ. ์ด๊ฑด ๋งˆ์น˜ ์žฌ๋Šฅ๋„ท์—์„œ ํ•œ ๋ฒˆ ๋“ฑ๋ก๋œ ์žฌ๋Šฅ์˜ ํ•ต์‹ฌ ์ •๋ณด๋ฅผ ๋ณดํ˜ธํ•˜๋Š” ๊ฒƒ๊ณผ ๊ฐ™์•„. ์‹ ๋ขฐํ•  ์ˆ˜ ์žˆ๋Š” ์ •๋ณด๋งŒ ์ œ๊ณตํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋˜๋Š” ๊ฑฐ์ง€! ๐Ÿ“š๐Ÿ”’

๋„์„œ๊ด€ ์ฑ… ์ •๋ณด ๋ณดํ˜ธ CatalogBook ๐Ÿ”’ id: 1 ๐Ÿ”’ title: "TypeScript ๋งˆ์Šคํ„ฐํ•˜๊ธฐ" ๐Ÿ”’ author: "๊ฐœ๋ฐœ์™•" ๐Ÿ”’

์ด SVG๋Š” ์šฐ๋ฆฌ์˜ CatalogBook์„ ์‹œ๊ฐํ™”ํ•œ ๊ฑฐ์•ผ. ๋ณด์ด์ง€? ๋ชจ๋“  ํ”„๋กœํผํ‹ฐ ์•ž์— ์ž‘์€ ์ž๋ฌผ์‡  ์ด๋ชจ์ง€๊ฐ€ ์žˆ์–ด. ์ด๊ฑด ๊ฐ ํ”„๋กœํผํ‹ฐ๊ฐ€ ์ฝ๊ธฐ ์ „์šฉ์ด๋ผ๋Š” ๊ฑธ ๋‚˜ํƒ€๋‚ด๋Š” ๊ฑฐ์•ผ. ํฐ ์ž๋ฌผ์‡ ๋Š” ์ „์ฒด ๊ฐ์ฒด๊ฐ€ ๋ณดํ˜ธ๋˜๊ณ  ์žˆ๋‹ค๋Š” ๊ฑธ ์˜๋ฏธํ•ด. ์ด๋ ‡๊ฒŒ Readonly๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ์šฐ๋ฆฌ์˜ ๋ฐ์ดํ„ฐ๋ฅผ ์•ˆ์ „ํ•˜๊ฒŒ ๋ณดํ˜ธํ•  ์ˆ˜ ์žˆ์–ด!

๐ŸŒŸ Readonly์˜ ์ง„๊ฐ€: Readonly๋Š” ํŠนํžˆ ์ƒํƒœ ๊ด€๋ฆฌ๋‚˜ ๋ถˆ๋ณ€ ๋ฐ์ดํ„ฐ ๊ตฌ์กฐ๋ฅผ ๋‹ค๋ฃฐ ๋•Œ ๋น›์„ ๋ฐœํ•ด. ์˜ˆ๋ฅผ ๋“ค์–ด, Redux๊ฐ™์€ ์ƒํƒœ ๊ด€๋ฆฌ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์—์„œ ์ƒํƒœ๋ฅผ ๋ณ€๊ฒฝํ•˜์ง€ ์•Š๊ณ  ์ƒˆ๋กœ์šด ์ƒํƒœ๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋Š” ํŒจํ„ด์„ ๊ฐ•์ œํ•˜๋Š” ๋ฐ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์ง€. ์ด๋ ‡๊ฒŒ ํ•˜๋ฉด ์˜ˆ์ธก ๊ฐ€๋Šฅํ•˜๊ณ  ๋””๋ฒ„๊น…ํ•˜๊ธฐ ์‰ฌ์šด ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•  ์ˆ˜ ์žˆ์–ด!

๐Ÿง  Readonly ์‹ฌํ™”: ์ค‘์ฒฉ๋œ ๊ฐ์ฒด ๋‹ค๋ฃจ๊ธฐ

์ž, ์ด์ œ ์ข€ ๋” ๋ณต์žกํ•œ ์ƒํ™ฉ์„ ์ƒ๊ฐํ•ด๋ณด์ž. ๊ฐ์ฒด ์•ˆ์— ๊ฐ์ฒด๊ฐ€ ์žˆ๋Š” ๊ฒฝ์šฐ๋Š” ์–ด๋–จ๊นŒ? ์ด๋Ÿฐ ๊ฒฝ์šฐ์— Readonly๋ฅผ ์–ด๋–ป๊ฒŒ ํ™œ์šฉํ•  ์ˆ˜ ์žˆ์„์ง€ ์•Œ์•„๋ณด์ž!


interface Author {
  name: string;
  birthYear: number;
}

interface DetailedBook {
  title: string;
  author: Author;
  genres: string[];
}

์ด๋Ÿฐ ๋ณต์žกํ•œ ๊ฐ์ฒด๊ฐ€ ์žˆ์„ ๋•Œ, ๋‹จ์ˆœํžˆ Readonly์„ ์‚ฌ์šฉํ•˜๋ฉด ์ตœ์ƒ์œ„ ํ”„๋กœํผํ‹ฐ๋งŒ ์ฝ๊ธฐ ์ „์šฉ์ด ๋ผ. ํ•˜์œ„ ๊ฐ์ฒด์˜ ํ”„๋กœํผํ‹ฐ๋Š” ์—ฌ์ „ํžˆ ๋ณ€๊ฒฝ ๊ฐ€๋Šฅํ•ด. ์ด๋Ÿด ๋•Œ ์šฐ๋ฆฌ๋Š” ์žฌ๊ท€์  Readonly ํƒ€์ž…์„ ๋งŒ๋“ค์–ด ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์–ด!


type DeepReadonly<t> = {
  readonly [P in keyof T]: T[P] extends object ? DeepReadonly<t> : T[P];
};

const book: DeepReadonly<detailedbook> = {
  title: "TypeScript ์‹ฌํ™”",
  author: {
    name: "๊ฐœ๋ฐœ์™•",
    birthYear: 1990
  },
  genres: ["Programming", "Technology"]
};

// ์ด์ œ ์ด๋ ‡๊ฒŒ ํ•˜๋ฉด ๋ชจ๋‘ ์—๋Ÿฌ๊ฐ€ ๋ฐœ์ƒํ•ด!
// book.title = "JavaScript ์‹ฌํ™”"; // Error
// book.author.name = "์ฝ”๋”ฉ์™•"; // Error
// book.genres.push("Education"); // Error
</detailedbook></t></t>

์™€์šฐ! ์ด์ œ ์ •๋ง ๊นŠ์ˆ™ํ•œ ๊ณณ์— ์žˆ๋Š” ํ”„๋กœํผํ‹ฐ๊นŒ์ง€ ๋ชจ๋‘ ์ฝ๊ธฐ ์ „์šฉ์ด ๋์–ด. ์ด๊ฑด ๋งˆ์น˜ ์žฌ๋Šฅ๋„ท์—์„œ "ํ”„๋กœ๊ทธ๋ž˜๋ฐ" ์ด๋ผ๋Š” ํฐ ์นดํ…Œ๊ณ ๋ฆฌ๋ถ€ํ„ฐ "TypeScript" ๊ฐ™์€ ์„ธ๋ถ€ ๊ธฐ์ˆ ๊นŒ์ง€ ๋ชจ๋“  ์ •๋ณด๋ฅผ ์•ˆ์ „ํ•˜๊ฒŒ ๋ณดํ˜ธํ•˜๋Š” ๊ฒƒ๊ณผ ๊ฐ™์•„! ๐Ÿ›ก๏ธ

์ค‘์ฒฉ๋œ ์ฝ๊ธฐ ์ „์šฉ ๊ฐ์ฒด ๊ตฌ์กฐ DeepReadonly ๐Ÿ”’ title ๐Ÿ”’ author ๐Ÿ”’ name ๐Ÿ”’ birthYear ๐Ÿ”’ genres[] ๐Ÿ”’

์ด ๋‹ค์ด์–ด๊ทธ๋žจ์€ ์šฐ๋ฆฌ์˜ DeepReadonly ๊ตฌ์กฐ๋ฅผ ์‹œ๊ฐํ™”ํ•œ ๊ฑฐ์•ผ. ๋ชจ๋“  ํ”„๋กœํผํ‹ฐ์™€ ์ค‘์ฒฉ๋œ ๊ฐ์ฒด์˜ ํ”„๋กœํผํ‹ฐ๊นŒ์ง€ ๋ชจ๋‘ ์ž๋ฌผ์‡ ๋กœ ๋ณดํ˜ธ๋˜์–ด ์žˆ๋Š” ๊ฑธ ๋ณผ ์ˆ˜ ์žˆ์–ด. ์ด๋ ‡๊ฒŒ DeepReadonly๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ๊ฐ์ฒด์˜ ๋ชจ๋“  ๋ ˆ๋ฒจ์—์„œ ๋ถˆ๋ณ€์„ฑ์„ ๋ณด์žฅํ•  ์ˆ˜ ์žˆ์ง€!

๐Ÿš€ Readonly์˜ ํž˜: Readonly, ํŠนํžˆ DeepReadonly๋Š” ์ •๋ง ๊ฐ•๋ ฅํ•œ ๋„๊ตฌ์•ผ. ๋ณต์žกํ•œ ๊ฐ์ฒด ๊ตฌ์กฐ์—์„œ ๋ฐ์ดํ„ฐ์˜ ๋ฌด๊ฒฐ์„ฑ์„ ์œ ์ง€ํ•˜๊ณ  ์‹ถ์„ ๋•Œ, ๋˜๋Š” ํ•จ์ˆ˜ํ˜• ํ”„๋กœ๊ทธ๋ž˜๋ฐ ํŒจ๋Ÿฌ๋‹ค์ž„์„ ๋”ฐ๋ฅด๊ณ  ์‹ถ์„ ๋•Œ ์•„์ฃผ ์œ ์šฉํ•˜์ง€. ์ด๊ฑธ ์ž˜ ํ™œ์šฉํ•˜๋ฉด ๋ฒ„๊ทธ๋ฅผ ์ค„์ด๊ณ  ์ฝ”๋“œ์˜ ์•ˆ์ •์„ฑ์„ ํฌ๊ฒŒ ๋†’์ผ ์ˆ˜ ์žˆ์–ด!

๐ŸŽญ Readonly์™€ ํ•จ๊ป˜ ์‚ฌ์šฉํ•˜๋ฉด ์ข‹์€ ์นœ๊ตฌ๋“ค

Readonly๋Š” ๋‹ค๋ฅธ ํƒ€์ž… ์œ ํ‹ธ๋ฆฌํ‹ฐ๋“ค๊ณผ ํ•จ๊ป˜ ์‚ฌ์šฉํ•˜๋ฉด ๋”์šฑ ๊ฐ•๋ ฅํ•ด์ ธ. ๋ช‡ ๊ฐ€์ง€ ์˜ˆ๋ฅผ ์‚ดํŽด๋ณผ๊นŒ?

  1. Partial: ๋ชจ๋“  ํ”„๋กœํผํ‹ฐ๋ฅผ ์„ ํƒ์ ์œผ๋กœ ๋งŒ๋“ค์–ด์ค˜.
  2. Pick: ํŠน์ • ํ”„๋กœํผํ‹ฐ๋งŒ ์„ ํƒํ•ด์„œ ์ƒˆ๋กœ์šด ํƒ€์ž…์„ ๋งŒ๋“ค์–ด.
  3. Record: ํ‚ค์˜ ์ง‘ํ•ฉ K๋กœ ํƒ€์ž… T์˜ ํ”„๋กœํผํ‹ฐ ๋งต์„ ๋งŒ๋“ค์–ด.

์ด๋“ค์„ Readonly์™€ ์กฐํ•ฉํ•ด์„œ ์‚ฌ์šฉํ•˜๋ฉด ์ •๋ง ๋‹ค์–‘ํ•œ ์ƒํ™ฉ์— ๋Œ€์‘ํ•  ์ˆ˜ ์žˆ์–ด. ์˜ˆ๋ฅผ ๋“ค์–ด๋ณผ๊นŒ?


interface User {
  id: number;
  name: string;
  email: string;
  preferences: {
    newsletter: boolean;
    darkMode: boolean;
  };
}

// id์™€ name๋งŒ ์„ ํƒํ•˜๊ณ  ์ฝ๊ธฐ ์ „์šฉ์œผ๋กœ ๋งŒ๋“ค๊ธฐ
type ReadonlyUserBasicInfo = Readonly<pick>>;

// ์„ ํƒ์ ์ด๋ฉด์„œ ์ฝ๊ธฐ ์ „์šฉ์ธ ์‚ฌ์šฉ์ž ์„ค์ •
type ReadonlyPartialPreferences = Readonly<partial>>;

function displayUserInfo(user: ReadonlyUserBasicInfo) {
  console.log(`User: ${user.id}, ${user.name}`);
  // user.name = "New Name"; // Error: Cannot assign to 'name' because it is a read-only property.
}

function updatePreferences(prefs: ReadonlyPartialPreferences) {
  console.log(prefs.newsletter); // OK
  // prefs.darkMode = true; // Error: Cannot assign to 'darkMode' because it is a read-only property.
}
</partial></pick>

์ด๋ ‡๊ฒŒ ํ•˜๋ฉด ํ•„์š”ํ•œ ์ •๋ณด๋งŒ ์ฝ๊ธฐ ์ „์šฉ์œผ๋กœ ๋งŒ๋“ค ์ˆ˜ ์žˆ๊ณ , ๋™์‹œ์— ์„ ํƒ์ ์ธ ์†์„ฑ๋„ ๊ฐ€์งˆ ์ˆ˜ ์žˆ์–ด. ์™„์ „ ์œ ์—ฐํ•˜๋ฉด์„œ๋„ ์•ˆ์ „ํ•˜์ง€ ์•Š์•„? ๐Ÿ˜Ž

Readonly์™€ ๋‹ค๋ฅธ ํƒ€์ž… ์œ ํ‹ธ๋ฆฌํ‹ฐ์˜ ์กฐํ•ฉ Readonly Partial Pick Record

์ด ๋‹ค์ด์–ด๊ทธ๋žจ์€ Readonly์™€ ๋‹ค๋ฅธ ํƒ€์ž… ์œ ํ‹ธ๋ฆฌํ‹ฐ๋“ค์˜ ๊ด€๊ณ„๋ฅผ ๋ณด์—ฌ์ค˜. Readonly๊ฐ€ ์ค‘์‹ฌ์— ์žˆ๊ณ , ๋‹ค๋ฅธ ์œ ํ‹ธ๋ฆฌํ‹ฐ๋“ค์ด ์ฃผ๋ณ€์„ ๋‘˜๋Ÿฌ์‹ธ๊ณ  ์žˆ์–ด. ์ด๋“ค์„ ์ ์ ˆํžˆ ์กฐํ•ฉํ•˜๋ฉด ์ •๋ง ๊ฐ•๋ ฅํ•˜๊ณ  ์•ˆ์ „ํ•œ ํƒ€์ž…์„ ๋งŒ๋“ค ์ˆ˜ ์žˆ์ง€!

๐Ÿ’ก ์‹ค์ „ ํŒ: ์‹ค์ œ ํ”„๋กœ์ ํŠธ์—์„œ๋Š” ์ด๋Ÿฐ ํƒ€์ž… ์กฐํ•ฉ์„ ์ž์ฃผ ์‚ฌ์šฉํ•˜๊ฒŒ ๋  ๊ฑฐ์•ผ. ํŠนํžˆ ์ƒํƒœ ๊ด€๋ฆฌ, ์„ค์ • ๊ฐ์ฒด ๋‹ค๋ฃจ๊ธฐ, API ์‘๋‹ต ์ฒ˜๋ฆฌ ๋“ฑ์—์„œ ์ด๋Ÿฐ ๊ธฐ์ˆ ์ด ๋น›์„ ๋ฐœํ•˜์ง€. ๋งˆ์น˜ ์žฌ๋Šฅ๋„ท์—์„œ ์—ฌ๋Ÿฌ ์žฌ๋Šฅ์„ ์กฐํ•ฉํ•ด ์ƒˆ๋กœ์šด ๊ฐ€์น˜๋ฅผ ๋งŒ๋“ค์–ด๋‚ด๋Š” ๊ฒƒ์ฒ˜๋Ÿผ ๋ง์ด์•ผ!

์ž, ์ด์ œ Readonly์— ๋Œ€ํ•ด ๊ฝค ๊นŠ์ด ์•Œ์•„๋ดค์–ด. ์ด ๋…€์„์„ ์ž˜ ํ™œ์šฉํ•˜๋ฉด ๋„ค ์ฝ”๋“œ๊ฐ€ ํ›จ์”ฌ ๋” ์•ˆ์ „ํ•˜๊ณ  ์˜ˆ์ธก ๊ฐ€๋Šฅํ•ด์งˆ ๊ฑฐ์•ผ. ๋‹ค์Œ์œผ๋กœ๋Š” Record์— ๋Œ€ํ•ด ์•Œ์•„๋ณผ ํ…๋ฐ, ์ด๊ฒƒ๋„ ์ •๋ง ์žฌ๋ฐŒ์„ ๊ฑฐ์•ผ! ๊ณ„์† ๋”ฐ๋ผ์™€์ค˜! ๐Ÿš€

๐Ÿ—‚๏ธ Record: ํ‚ค-๊ฐ’ ์Œ์˜ ๋งˆ๋ฒ•์‚ฌ ๐Ÿ—‚๏ธ

์ž, ์ด์ œ ์šฐ๋ฆฌ์˜ ์„ธ ๋ฒˆ์งธ ์ฃผ์ธ๊ณต Record๋ฅผ ๋งŒ๋‚˜๋ณผ ์‹œ๊ฐ„์ด์•ผ! Record๋Š” ์ •๋ง ํŠน๋ณ„ํ•œ ๋…€์„์ด์•ผ. ์ด ํƒ€์ž…์€ ํ‚ค-๊ฐ’ ์Œ์˜ ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•˜๋Š” ๋ฐ ์‚ฌ์šฉ๋ผ. ํ‚ค์˜ ํƒ€์ž…๊ณผ ๊ฐ’์˜ ํƒ€์ž…์„ ์ง€์ •ํ•  ์ˆ˜ ์žˆ์–ด์„œ ์•„์ฃผ ์œ ์—ฐํ•˜์ง€!

Record์˜ ๊ธฐ๋ณธ ํ˜•ํƒœ๋Š” ์ด๋ ‡๊ฒŒ ์ƒ๊ฒผ์–ด:

Record<k t></k>

์—ฌ๊ธฐ์„œ K๋Š” ํ‚ค์˜ ํƒ€์ž…์ด๊ณ , T๋Š” ๊ฐ’์˜ ํƒ€์ž…์ด์•ผ. ์˜ˆ๋ฅผ ๋“ค์–ด๋ณผ๊นŒ?


type Fruit = "apple" | "banana" | "orange";
type FruitInfo = { color: string; taste: string };

type FruitCatalog = Record<fruit fruitinfo>;

const fruits: FruitCatalog = {
  apple: { color: "red", taste: "sweet" },
  banana: { color: "yellow", taste: "sweet" },
  orange: { color: "orange", taste: "citrusy" }
};
</fruit>

์งœ์ž”! ์ด๋ ‡๊ฒŒ ํ•˜๋ฉด FruitCatalog ํƒ€์ž…์€ Fruit ํƒ€์ž…์˜ ํ‚ค์™€ FruitInfo ํƒ€์ž…์˜ ๊ฐ’์„ ๊ฐ€์ง„ ๊ฐ์ฒด๊ฐ€ ๋ผ. ๋งˆ์น˜ ๊ณผ์ผ ๋ฐฑ๊ณผ์‚ฌ์ „ ๊ฐ™์ง€ ์•Š์•„? ๐ŸŽ๐ŸŒ๐ŸŠ

๐Ÿ’ก ์™œ ์ด๊ฒŒ ์œ ์šฉํ• ๊นŒ? Record๋Š” ๊ฐ์ฒด์˜ ๊ตฌ์กฐ๋ฅผ ๋ช…ํ™•ํ•˜๊ฒŒ ์ •์˜ํ•˜๊ณ  ์‹ถ์„ ๋•Œ ์•„์ฃผ ์œ ์šฉํ•ด. ํŠนํžˆ ํ‚ค์˜ ์ง‘ํ•ฉ์ด ๋ฏธ๋ฆฌ ์•Œ๋ ค์ ธ ์žˆ๊ณ , ๋ชจ๋“  ํ‚ค๊ฐ€ ๋™์ผํ•œ ํƒ€์ž…์˜ ๊ฐ’์„ ๊ฐ€์ ธ์•ผ ํ•  ๋•Œ ์™„๋ฒฝํ•ด. ์ด๊ฑด ๋งˆ์น˜ ์žฌ๋Šฅ๋„ท์—์„œ ๊ฐ ์žฌ๋Šฅ ์นดํ…Œ๊ณ ๋ฆฌ๋ณ„๋กœ ์ •๋ณด๋ฅผ ๊ตฌ์กฐํ™”ํ•˜๋Š” ๊ฒƒ๊ณผ ๋น„์Šทํ•ด!

Record๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด, ๊ฐ์ฒด์˜ ๊ตฌ์กฐ๋ฅผ ๋ช…ํ™•ํ•˜๊ฒŒ ์ •์˜ํ•  ์ˆ˜ ์žˆ๊ณ , ํƒ€์ž… ์•ˆ์ •์„ฑ๋„ ๋ณด์žฅ๋ฐ›์„ ์ˆ˜ ์žˆ์–ด. ์ด๊ฑด ๋งˆ์น˜ ์žฌ๋Šฅ๋„ท์—์„œ ๊ฐ ์žฌ๋Šฅ ์นดํ…Œ๊ณ ๋ฆฌ๋งˆ๋‹ค ์ผ๊ด€๋œ ์ •๋ณด ๊ตฌ์กฐ๋ฅผ ๊ฐ€์ง€๋„๋ก ํ•˜๋Š” ๊ฒƒ๊ณผ ๊ฐ™์•„. ์ฒด๊ณ„์ ์ด๊ณ  ์˜ˆ์ธก ๊ฐ€๋Šฅํ•˜์ง€! ๐Ÿ˜‰

๐ŸŽจ Record ํ™œ์šฉ ์˜ˆ์‹œ: ์ƒ‰์ƒ ํŒ”๋ ˆํŠธ ์‹œ์Šคํ…œ

์ž, ์ด์ œ Record๋ฅผ ์‹ค์ œ๋กœ ์–ด๋–ป๊ฒŒ ํ™œ์šฉํ•  ์ˆ˜ ์žˆ๋Š”์ง€ ์žฌ๋ฏธ์žˆ๋Š” ์˜ˆ์‹œ๋ฅผ ๋“ค์–ด๋ณผ๊ฒŒ. ์šฐ๋ฆฌ๊ฐ€ ๋””์ž์ธ ์‹œ์Šคํ…œ์„ ์œ„ํ•œ ์ƒ‰์ƒ ํŒ”๋ ˆํŠธ๋ฅผ ๋งŒ๋“ ๋‹ค๊ณ  ์ƒ๊ฐํ•ด๋ณด์ž!


type Color = "primary" | "secondary" | "success" | "error" | "warning" | "info";
type Shade = "light" | "main" | "dark";

type ColorShades = Record<shade string>;
type ColorPalette = Record<color colorshades>;

const palette: ColorPalette = {
  primary: { light: "#7986cb", main: "#3f51b5", dark: "#303f9f" },
  secondary: { light: "#ff4081", main: "#f50057", dark: "#c51162" },
  success: { light: "#81c784", main: "#4caf50", dark: "#388e3c" },
  error: { light: "#e57373", main: "#f44336", dark: "#d32f2f" },
  warning: { light: "#ffb74d", main: "#ff9800", dark: "#f57c00" },
  info: { light: "#64b5f6", main: "#2196f3", dark: "#1976d2" }
};

function getColor(color: Color, shade: Shade): string {
  return palette[color][shade];
}

console.log(getColor("primary", "main")); // "#3f51b5"
console.log(getColor("error", "light")); // "#e57373"
</color></shade>

์™€์šฐ! ์ด์ œ ์šฐ๋ฆฌ๋Š” ์ฒด๊ณ„์ ์ด๊ณ  ํƒ€์ž… ์•ˆ์ „ํ•œ ์ƒ‰์ƒ ํŒ”๋ ˆํŠธ ์‹œ์Šคํ…œ์„ ๊ฐ€์ง€๊ฒŒ ๋์–ด. ์ด๊ฑด ๋งˆ์น˜ ์žฌ๋Šฅ๋„ท์—์„œ ๊ฐ ์žฌ๋Šฅ ์นดํ…Œ๊ณ ๋ฆฌ๋งˆ๋‹ค ์„ธ๋ถ€ ๋ ˆ๋ฒจ์„ ๊ตฌ๋ถ„ํ•˜๊ณ , ๊ฐ ๋ ˆ๋ฒจ์— ๋งž๋Š” ์ •๋ณด๋ฅผ ์ œ๊ณตํ•˜๋Š” ๊ฒƒ๊ณผ ๊ฐ™์•„. ์ฒด๊ณ„์ ์ด๊ณ  ์‚ฌ์šฉํ•˜๊ธฐ ์‰ฝ์ง€! ๐ŸŽจ๐Ÿ–Œ๏ธ

์ƒ‰์ƒ ํŒ”๋ ˆํŠธ ์‹œ์Šคํ…œ ColorPalette Primary Secondary Success Error Warning

์ด SVG๋Š” ์šฐ๋ฆฌ์˜ ColorPalette๋ฅผ ์‹œ๊ฐํ™”ํ•œ ๊ฑฐ์•ผ. ๊ฐ ์ƒ‰์ƒ ์นดํ…Œ๊ณ ๋ฆฌ๊ฐ€ ํ•˜๋‚˜์˜ ์—ด์„ ์ฐจ์ง€ํ•˜๊ณ  ์žˆ๊ณ , ๊ทธ ์•ˆ์— light, main, dark ์„ธ ๊ฐ€์ง€ shade๊ฐ€ ํฌํ•จ๋˜์–ด ์žˆ์–ด. ์ด๋ ‡๊ฒŒ Record๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ๋ณต์žกํ•œ ๊ตฌ์กฐ๋„ ๋ช…ํ™•ํ•˜๊ณ  ์ผ๊ด€๋˜๊ฒŒ ํ‘œํ˜„ํ•  ์ˆ˜ ์žˆ์ง€!

๐ŸŒŸ Record์˜ ์ง„๊ฐ€: Record๋Š” ํŠนํžˆ ์„ค์ • ๊ฐ์ฒด, ๋งคํ•‘ ํ…Œ์ด๋ธ”, ๋˜๋Š” lookup ๊ฐ์ฒด๋ฅผ ๋งŒ๋“ค ๋•Œ ๋น›์„ ๋ฐœํ•ด. API ์‘๋‹ต์„ ๋ชจ๋ธ๋งํ•˜๊ฑฐ๋‚˜, ์ƒํƒœ ๊ด€๋ฆฌ ์‹œ์Šคํ…œ์„ ์„ค๊ณ„ํ•  ๋•Œ๋„ ์•„์ฃผ ์œ ์šฉํ•˜์ง€. ์ด๊ฑธ ์ž˜ ํ™œ์šฉํ•˜๋ฉด ์ฝ”๋“œ์˜ ๊ตฌ์กฐ๋ฅผ ๋ช…ํ™•ํžˆ ํ•˜๊ณ , ํƒ€์ž… ์•ˆ์ •์„ฑ์„ ๋†’์ผ ์ˆ˜ ์žˆ์–ด!

๐Ÿง  Record ์‹ฌํ™”: ๋™์  ํ‚ค ๋‹ค๋ฃจ๊ธฐ

์ž, ์ด์ œ ์ข€ ๋” ๋ณต์žกํ•œ ์ƒํ™ฉ์„ ์ƒ๊ฐํ•ด๋ณด์ž. ํ‚ค๊ฐ€ ๋ฏธ๋ฆฌ ์ •ํ•ด์ ธ ์žˆ์ง€ ์•Š๊ณ  ๋™์ ์œผ๋กœ ์ƒ์„ฑ๋˜๋Š” ๊ฒฝ์šฐ๋Š” ์–ด๋–จ๊นŒ? Record๋Š” ์ด๋Ÿฐ ์ƒํ™ฉ์—์„œ๋„ ์•„์ฃผ ์œ ์šฉํ•ด!


type DynamicKey = string;
type UserData = { name: string; age: number };

type UserDatabase = Record<dynamickey userdata>;

const users: UserDatabase = {
  "user_001": { name: "Alice", age: 28 },
  "user_002": { name: "Bob", age: 32 },
  // ์šฐ๋ฆฌ๋Š” ๊ณ„์†ํ•ด์„œ ์ƒˆ๋กœ์šด ์‚ฌ์šฉ์ž๋ฅผ ์ถ”๊ฐ€ํ•  ์ˆ˜ ์žˆ์–ด!
};

function addUser(id: string, data: UserData) {
  users[id] = data;
}

addUser("user_003", { name: "Charlie", age: 45 });
</dynamickey>

์™€์šฐ! ์ด์ œ ์šฐ๋ฆฌ๋Š” ๋™์ ์œผ๋กœ ํ‚ค๋ฅผ ์ƒ์„ฑํ•˜๊ณ  ๊ด€๋ฆฌํ•  ์ˆ˜ ์žˆ๋Š” ์œ ์—ฐํ•œ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ๊ตฌ์กฐ๋ฅผ ๊ฐ€์ง€๊ฒŒ ๋์–ด. ์ด๊ฑด ๋งˆ์น˜ ์žฌ๋Šฅ๋„ท์—์„œ ์ƒˆ๋กœ์šด ์‚ฌ์šฉ์ž๊ฐ€ ๊ฐ€์ž…ํ•  ๋•Œ๋งˆ๋‹ค ๊ทธ๋“ค์˜ ์ •๋ณด๋ฅผ ์ผ๊ด€๋œ ๊ตฌ์กฐ๋กœ ์ €์žฅํ•˜๋Š” ๊ฒƒ๊ณผ ๊ฐ™์•„! ๐Ÿ—„๏ธ๐Ÿ‘ฅ

๋™์  ์‚ฌ์šฉ์ž ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค UserDatabase user_001 Alice, 28 user_002 Bob, 32 user_003 Charlie, 45

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

๐Ÿ’ก ์‹ค์ „ ํŒ: ์‹ค์ œ ํ”„๋กœ์ ํŠธ์—์„œ๋Š” ์ด๋Ÿฐ ๋™์  ํ‚ค ๊ตฌ์กฐ๋ฅผ ์ž์ฃผ ์‚ฌ์šฉํ•˜๊ฒŒ ๋  ๊ฑฐ์•ผ. ํŠนํžˆ ๋ฐ์ดํ„ฐ ์บ์‹ฑ, ์ƒํƒœ ๊ด€๋ฆฌ, ๋˜๋Š” ๋Œ€๊ทœ๋ชจ ๋ฐ์ดํ„ฐ ์ง‘ํ•ฉ์„ ๋‹ค๋ฃฐ ๋•Œ ์ด๋Ÿฐ ๊ธฐ์ˆ ์ด ๋น›์„ ๋ฐœํ•˜์ง€. ๋งˆ์น˜ ์žฌ๋Šฅ๋„ท์—์„œ ์ƒˆ๋กœ์šด ์žฌ๋Šฅ ์นดํ…Œ๊ณ ๋ฆฌ๊ฐ€ ์ถ”๊ฐ€๋  ๋•Œ๋งˆ๋‹ค ์œ ์—ฐํ•˜๊ฒŒ ๋Œ€์‘ํ•  ์ˆ˜ ์žˆ๋Š” ๊ฒƒ์ฒ˜๋Ÿผ ๋ง์ด์•ผ!

๐ŸŽญ Record์™€ ํ•จ๊ป˜ ์‚ฌ์šฉํ•˜๋ฉด ์ข‹์€ ์นœ๊ตฌ๋“ค

Record๋Š” ๋‹ค๋ฅธ ํƒ€์ž… ์œ ํ‹ธ๋ฆฌํ‹ฐ๋“ค๊ณผ ํ•จ๊ป˜ ์‚ฌ์šฉํ•˜๋ฉด ๋”์šฑ ๊ฐ•๋ ฅํ•ด์ ธ. ๋ช‡ ๊ฐ€์ง€ ์˜ˆ๋ฅผ ์‚ดํŽด๋ณผ๊นŒ?

  1. Partial: Record์˜ ๊ฐ’ ํƒ€์ž…์„ ์„ ํƒ์ ์œผ๋กœ ๋งŒ๋“ค ์ˆ˜ ์žˆ์–ด.
  2. Readonly: Record์˜ ํ‚ค-๊ฐ’ ์Œ์„ ์ฝ๊ธฐ ์ „์šฉ์œผ๋กœ ๋งŒ๋“ค ์ˆ˜ ์žˆ์–ด.
  3. Pick: Record์˜ ํŠน์ • ํ‚ค๋งŒ ์„ ํƒํ•ด์„œ ์ƒˆ๋กœ์šด ํƒ€์ž…์„ ๋งŒ๋“ค ์ˆ˜ ์žˆ์–ด.

์ด๋“ค์„ Record์™€ ์กฐํ•ฉํ•ด์„œ ์‚ฌ์šฉํ•˜๋ฉด ์ •๋ง ๋‹ค์–‘ํ•œ ์ƒํ™ฉ์— ๋Œ€์‘ํ•  ์ˆ˜ ์žˆ์–ด. ์˜ˆ๋ฅผ ๋“ค์–ด๋ณผ๊นŒ?


type UserRole = "admin" | "moderator" | "user";
type Permission = "read" | "write" | "delete";

type RolePermissions = Record<userrole readonly boolean>>>>;

const permissions: RolePermissions = {
  admin: { read: true, write: true, delete: true },
  moderator: { read: true, write: true },
  user: { read: true }
};

// permissions.admin.read = false; // Error: Cannot assign to 'read' because it is a read-only property.
// permissions.user.delete = true; // OK: We can add missing permissions
</userrole>

์ด๋ ‡๊ฒŒ ํ•˜๋ฉด ๊ฐ ์—ญํ• ์— ๋Œ€ํ•œ ๊ถŒํ•œ์„ ์œ ์—ฐํ•˜๊ฒŒ ์ •์˜ํ•  ์ˆ˜ ์žˆ์œผ๋ฉด์„œ๋„, ํ•œ๋ฒˆ ์„ค์ •๋œ ๊ถŒํ•œ์€ ๋ณ€๊ฒฝํ•  ์ˆ˜ ์—†๊ฒŒ ๋งŒ๋“ค ์ˆ˜ ์žˆ์–ด. ์™„์ „ ์•ˆ์ „ํ•˜๋ฉด์„œ๋„ ์œ ์—ฐํ•˜์ง€ ์•Š์•„? ๐Ÿ˜Ž

Record์™€ ๋‹ค๋ฅธ ํƒ€์ž… ์œ ํ‹ธ๋ฆฌํ‹ฐ์˜ ์กฐํ•ฉ Record Partial Readonly Pick

์ด ๋‹ค์ด์–ด๊ทธ๋žจ์€ Record์™€ ๋‹ค๋ฅธ ํƒ€์ž… ์œ ํ‹ธ๋ฆฌํ‹ฐ๋“ค์˜ ๊ด€๊ณ„๋ฅผ ๋ณด์—ฌ์ค˜. Record๊ฐ€ ์ค‘์‹ฌ์— ์žˆ๊ณ , ๋‹ค๋ฅธ ์œ ํ‹ธ๋ฆฌํ‹ฐ๋“ค์ด ์ฃผ๋ณ€์„ ๋‘˜๋Ÿฌ์‹ธ๊ณ  ์žˆ์–ด. ์ด๋“ค์„ ์ ์ ˆํžˆ ์กฐํ•ฉํ•˜๋ฉด ์ •๋ง ๊ฐ•๋ ฅํ•˜๊ณ  ์œ ์—ฐํ•œ ํƒ€์ž…์„ ๋งŒ๋“ค ์ˆ˜ ์žˆ์ง€!

๐Ÿš€ Record์˜ ํž˜: Record๋Š” ํŠนํžˆ ๋ณต์žกํ•œ ๊ฐ์ฒด ๊ตฌ์กฐ๋ฅผ ๋‹ค๋ฃฐ ๋•Œ ๋น›์„ ๋ฐœํ•ด. API ์‘๋‹ต ๋ชจ๋ธ๋ง, ์ƒํƒœ ๊ด€๋ฆฌ ์‹œ์Šคํ…œ ์„ค๊ณ„, ์„ค์ • ๊ฐ์ฒด ์ƒ์„ฑ ๋“ฑ์—์„œ ์•„์ฃผ ์œ ์šฉํ•˜์ง€. ์ด๊ฑธ ์ž˜ ํ™œ์šฉํ•˜๋ฉด ์ฝ”๋“œ์˜ ๊ตฌ์กฐ๋ฅผ ๋ช…ํ™•ํžˆ ํ•˜๊ณ , ํƒ€์ž… ์•ˆ์ •์„ฑ์„ ํฌ๊ฒŒ ๋†’์ผ ์ˆ˜ ์žˆ์–ด!

์ž, ์ด์ œ Record์— ๋Œ€ํ•ด ๊ฝค ๊นŠ์ด ์•Œ์•„๋ดค์–ด. ์ด ๋…€์„์„ ์ž˜ ํ™œ์šฉํ•˜๋ฉด ๋„ค ์ฝ”๋“œ๊ฐ€ ํ›จ์”ฌ ๋” ๊ตฌ์กฐ์ ์ด๊ณ  ํƒ€์ž… ์•ˆ์ „ํ•ด์งˆ ๊ฑฐ์•ผ. ๋‹ค์Œ์œผ๋กœ๋Š” Pick์— ๋Œ€ํ•ด ์•Œ์•„๋ณผ ํ…๋ฐ, ์ด๊ฒƒ๋„ ์ •๋ง ์žฌ๋ฐŒ์„ ๊ฑฐ์•ผ! ๊ณ„์† ๋”ฐ๋ผ์™€์ค˜! ๐Ÿš€

๐Ÿ’ Pick: ํ”„๋กœํผํ‹ฐ ์„ ๋ณ„์˜ ๋‹ฌ์ธ ๐Ÿ’

์ž, ์ด์ œ ์šฐ๋ฆฌ์˜ ๋งˆ์ง€๋ง‰ ์ฃผ์ธ๊ณต Pick์„ ๋งŒ๋‚˜๋ณผ ์‹œ๊ฐ„์ด์•ผ! Pick์€ ์ •๋ง ์žฌ๋ฏธ์žˆ๋Š” ๋…€์„์ด์•ผ. ์ด ํƒ€์ž…์€ ๊ฐ์ฒด์—์„œ ํŠน์ • ํ”„๋กœํผํ‹ฐ๋งŒ์„ ์„ ํƒํ•ด์„œ ์ƒˆ๋กœ์šด ํƒ€์ž…์„ ๋งŒ๋“ค์–ด๋‚ด๋Š” ๋ฐ ์‚ฌ์šฉ๋ผ. ๋งˆ์น˜ ๊ณผ์ผ ๋ฐ”๊ตฌ๋‹ˆ์—์„œ ์›ํ•˜๋Š” ๊ณผ์ผ๋งŒ ๊ณจ๋ผ๋‚ด๋Š” ๊ฒƒ์ฒ˜๋Ÿผ ๋ง์ด์•ผ!

Pick์˜ ๊ธฐ๋ณธ ํ˜•ํƒœ๋Š” ์ด๋ ‡๊ฒŒ ์ƒ๊ฒผ์–ด:

Pick<t k></t>

์—ฌ๊ธฐ์„œ T๋Š” ์›๋ณธ ํƒ€์ž…์ด๊ณ , K๋Š” ์„ ํƒํ•˜๊ณ  ์‹ถ์€ ํ”„๋กœํผํ‹ฐ์˜ ์œ ๋‹ˆ์˜จ ํƒ€์ž…์ด์•ผ. ์˜ˆ๋ฅผ ๋“ค์–ด๋ณผ๊นŒ?


interface Person {
  name: string;
  age: number;
  address: string;
  email: string;
  phone: string;
}

type ContactInfo = Pick<person>;

// ContactInfo๋Š” ์ด๋ ‡๊ฒŒ ๋ฉ๋‹ˆ๋‹ค:
// {
//   email: string;
//   phone: string;
// }
</person>

์งœ์ž”! ์ด๋ ‡๊ฒŒ ํ•˜๋ฉด ContactInfo ํƒ€์ž…์€ Person ํƒ€์ž…์—์„œ email๊ณผ phone ํ”„๋กœํผํ‹ฐ๋งŒ์„ ๊ฐ€์ ธ์˜จ ์ƒˆ๋กœ์šด ํƒ€์ž…์ด ๋ผ. ๋งˆ์น˜ ์—ฐ๋ฝ์ฒ˜ ์ •๋ณด๋งŒ ํ•„์š”ํ•  ๋•Œ ์‚ฌ์šฉํ•˜๊ธฐ ๋”ฑ ์ข‹๊ฒ ์ง€? ๐Ÿ“žโœ‰๏ธ

๐Ÿ’ก ์™œ ์ด๊ฒŒ ์œ ์šฉํ• ๊นŒ? Pick์€ ํฐ ๊ฐ์ฒด์—์„œ ํ•„์š”ํ•œ ๋ถ€๋ถ„๋งŒ ์ถ”์ถœํ•ด์•ผ ํ•  ๋•Œ ์•„์ฃผ ์œ ์šฉํ•ด. API ์‘๋‹ต์—์„œ ํŠน์ • ํ•„๋“œ๋งŒ ์‚ฌ์šฉํ•˜๊ณ  ์‹ถ์„ ๋•Œ, ๋˜๋Š” ํฐ ๊ฐ์ฒด์˜ ์ผ๋ถ€๋ถ„๋งŒ ํ•จ์ˆ˜์— ์ „๋‹ฌํ•˜๊ณ  ์‹ถ์„ ๋•Œ ์™„๋ฒฝํ•˜์ง€. ์ด๊ฑด ๋งˆ์น˜ ์žฌ๋Šฅ๋„ท์—์„œ ์‚ฌ์šฉ์ž์˜ ๋ชจ๋“  ์ •๋ณด ์ค‘์—์„œ ํ”„๋กœํ•„์— ํ‘œ์‹œํ•  ์ •๋ณด๋งŒ ๊ณจ๋ผ๋‚ด๋Š” ๊ฒƒ๊ณผ ๋น„์Šทํ•ด!

Pick์„ ์‚ฌ์šฉํ•˜๋ฉด, ํ•„์š”ํ•œ ํ”„๋กœํผํ‹ฐ๋งŒ ์ •ํ™•ํ•˜๊ฒŒ ์„ ํƒํ•  ์ˆ˜ ์žˆ์–ด. ์ด๋Š” ์ฝ”๋“œ์˜ ๋ช…ํ™•์„ฑ์„ ๋†’์ด๊ณ , ๋ถˆํ•„์š”ํ•œ ๋ฐ์ดํ„ฐ ์ฒ˜๋ฆฌ๋ฅผ ์ค„์—ฌ์ค˜. ๋งˆ์น˜ ์žฌ๋Šฅ๋„ท์—์„œ ๊ฐ ์ƒํ™ฉ์— ๊ผญ ํ•„์š”ํ•œ ์‚ฌ์šฉ์ž ์ •๋ณด๋งŒ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ฒ˜๋Ÿผ ํšจ์œจ์ ์ด์ง€! ๐Ÿ˜‰

๐ŸŽจ Pick ํ™œ์šฉ ์˜ˆ์‹œ: ์‚ฌ์šฉ์ž ํ”„๋กœํ•„ ์‹œ์Šคํ…œ

์ž, ์ด์ œ Pick์„ ์‹ค์ œ๋กœ ์–ด๋–ป๊ฒŒ ํ™œ์šฉํ•  ์ˆ˜ ์žˆ๋Š”์ง€ ์žฌ๋ฏธ์žˆ๋Š” ์˜ˆ์‹œ๋ฅผ ๋“ค์–ด๋ณผ๊ฒŒ. ์šฐ๋ฆฌ๊ฐ€ ์†Œ์…œ ๋ฏธ๋””์–ด ํ”Œ๋žซํผ์˜ ์‚ฌ์šฉ์ž ํ”„๋กœํ•„ ์‹œ์Šคํ…œ์„ ๋งŒ๋“ ๋‹ค๊ณ  ์ƒ๊ฐํ•ด๋ณด์ž!


interface User {
  id: number;
  username: string;
  email: string;
  password: string;
  firstName: string;
  lastName: string;
  bio: string;
  birthDate: Date;
  registrationDate: Date;
  lastLoginDate: Date;
}

type PublicProfile = Pick<user>;
type LoginCredentials = Pick<user>;

function displayProfile(profile: PublicProfile) {
  console.log(`${profile.firstName} ${profile.lastName} (@${profile.username})`);
  console.log(`Bio: ${profile.bio}`);
}

function login(credentials: LoginCredentials) {
  // ๋กœ๊ทธ์ธ ๋กœ์ง
  console.log(`Logging in ${credentials.email}...`);
}

const user: User = {
  id: 1,
  username: "codingguru",
  email: "guru@code.com",
  password: "supersecret",
  firstName: "Coding",
  lastName: "Guru",
  bio: "I love TypeScript!",
  birthDate: new Date(1990, 1, 1),
  registrationDate: new Date(2020, 1, 1),
  lastLoginDate: new Date()
};

displayProfile(user);
login(user);
</user></user>

์™€์šฐ! ์ด์ œ ์šฐ๋ฆฌ๋Š” ์ƒํ™ฉ์— ๋”ฐ๋ผ ํ•„์š”ํ•œ ์‚ฌ์šฉ์ž ์ •๋ณด๋งŒ ์ •ํ™•ํ•˜๊ฒŒ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋์–ด. ๊ณต๊ฐœ ํ”„๋กœํ•„์—๋Š” ๋ฏผ๊ฐํ•œ ์ •๋ณด๊ฐ€ ํฌํ•จ๋˜์ง€ ์•Š๊ณ , ๋กœ๊ทธ์ธ ์‹œ์—๋Š” ํ•„์š”ํ•œ ์ •๋ณด๋งŒ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ์ง€. ์ด๊ฑด ๋งˆ์น˜ ์žฌ๋Šฅ๋„ท์—์„œ ๊ฐ ํŽ˜์ด์ง€๋‚˜ ๊ธฐ๋Šฅ์— ๋งž๋Š” ์‚ฌ์šฉ์ž ์ •๋ณด๋งŒ ๊ณจ๋ผ์„œ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ๊ณผ ๊ฐ™์•„. ์•ˆ์ „ํ•˜๊ณ  ํšจ์œจ์ ์ด์•ผ! ๐Ÿ›ก๏ธ๐Ÿš€

์‚ฌ์šฉ์ž ํ”„๋กœํ•„ ์‹œ์Šคํ…œ User Profile System Public Profile username firstName lastName bio Login Credentials email password Pick

์ด SVG๋Š” ์šฐ๋ฆฌ์˜ ์‚ฌ์šฉ์ž ํ”„๋กœํ•„ ์‹œ์Šคํ…œ์„ ์‹œ๊ฐํ™”ํ•œ ๊ฑฐ์•ผ. ์™ผ์ชฝ์€ ๊ณต๊ฐœ ํ”„๋กœํ•„์— ์‚ฌ์šฉ๋˜๋Š” ์ •๋ณด๋ฅผ, ์˜ค๋ฅธ์ชฝ์€ ๋กœ๊ทธ์ธ์— ์‚ฌ์šฉ๋˜๋Š” ์ •๋ณด๋ฅผ ๋‚˜ํƒ€๋‚ด๊ณ  ์žˆ์–ด. Pick์„ ์‚ฌ์šฉํ•˜๋ฉด ์ด๋ ‡๊ฒŒ ํฐ User ๊ฐ์ฒด์—์„œ ํ•„์š”ํ•œ ๋ถ€๋ถ„๋งŒ ์ •ํ™•ํ•˜๊ฒŒ ์ถ”์ถœํ•ด์„œ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์ง€!

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

๐Ÿง  Pick ์‹ฌํ™”: ์กฐ๊ฑด๋ถ€ ํƒ€์ž…๊ณผ ํ•จ๊ป˜ ์‚ฌ์šฉํ•˜๊ธฐ

์ž, ์ด์ œ ์ข€ ๋” ๋ณต์žกํ•œ ์ƒํ™ฉ์„ ์ƒ๊ฐํ•ด๋ณด์ž. Pick์„ ์กฐ๊ฑด๋ถ€ ํƒ€์ž…๊ณผ ํ•จ๊ป˜ ์‚ฌ์šฉํ•˜๋ฉด ๋”์šฑ ๊ฐ•๋ ฅํ•œ ํƒ€์ž…์„ ๋งŒ๋“ค ์ˆ˜ ์žˆ์–ด. ์˜ˆ๋ฅผ ๋“ค์–ด, ํŠน์ • ์กฐ๊ฑด์— ๋”ฐ๋ผ ๋‹ค๋ฅธ ํ”„๋กœํผํ‹ฐ๋ฅผ ์„ ํƒํ•˜๊ณ  ์‹ถ๋‹ค๋ฉด ์–ด๋–ป๊ฒŒ ํ• ๊นŒ?


type UserRoles = 'admin' | 'moderator' | 'user';

interface UserData {
  id: number;
  username: string;
  email: string;
  role: UserRoles;
  adminToken?: string;
  moderatorCode?: string;
}

type RoleSpecificInfo<t extends userroles> = Pick<userdata extends : t never>;

function getUserInfo<t extends userroles>(user: UserData, role: T): RoleSpecificInfo<t> {
  return user as RoleSpecificInfo<t>;
}

const adminUser: UserData = {
  id: 1,
  username: "superadmin",
  email: "admin@example.com",
  role: "admin",
  adminToken: "secret-token"
};

const userInfo = getUserInfo(adminUser, "admin");
console.log(userInfo.adminToken); // OK
// console.log(userInfo.moderatorCode); // Error: Property 'moderatorCode' does not exist on type 'RoleSpecificInfo<"admin">'
</t></t></t></userdata></t>

์™€์šฐ! ์ด์ œ ์šฐ๋ฆฌ๋Š” ์‚ฌ์šฉ์ž์˜ ์—ญํ• ์— ๋”ฐ๋ผ ๋‹ค๋ฅธ ์ •๋ณด๋ฅผ ํฌํ•จํ•˜๋Š” ํƒ€์ž…์„ ๋™์ ์œผ๋กœ ์ƒ์„ฑํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋์–ด. ์ด๊ฑด ๋งˆ์น˜ ์žฌ๋Šฅ๋„ท์—์„œ ์‚ฌ์šฉ์ž์˜ ์—ญํ• ์— ๋”ฐ๋ผ ๋‹ค๋ฅธ ๋Œ€์‹œ๋ณด๋“œ๋ฅผ ์ œ๊ณตํ•˜๋Š” ๊ฒƒ๊ณผ ๊ฐ™์•„! ๐Ÿ˜ƒ

์—ญํ• ๋ณ„ ์‚ฌ์šฉ์ž ์ •๋ณด Role-Specific User Info Admin id username email adminToken Moderator id username email moderatorCode User id username email

์ด ๋‹ค์ด์–ด๊ทธ๋žจ์€ ์šฐ๋ฆฌ์˜ ์—ญํ• ๋ณ„ ์‚ฌ์šฉ์ž ์ •๋ณด ์‹œ์Šคํ…œ์„ ์‹œ๊ฐํ™”ํ•œ ๊ฑฐ์•ผ. ๊ฐ ์—ญํ• ๋งˆ๋‹ค ๊ณตํ†ต ์ •๋ณด์™€ ํ•จ๊ป˜ ์—ญํ•  ํŠน์ • ์ •๋ณด๊ฐ€ ํฌํ•จ๋˜์–ด ์žˆ์–ด. Pick๊ณผ ์กฐ๊ฑด๋ถ€ ํƒ€์ž…์„ ์‚ฌ์šฉํ•˜๋ฉด ์ด๋ ‡๊ฒŒ ๋ณต์žกํ•œ ํƒ€์ž… ๊ตฌ์กฐ๋„ ์œ ์—ฐํ•˜๊ฒŒ ๋งŒ๋“ค ์ˆ˜ ์žˆ์ง€!

๐Ÿ’ก ์‹ค์ „ ํŒ: ์‹ค์ œ ํ”„๋กœ์ ํŠธ์—์„œ๋Š” ์ด๋Ÿฐ ๋™์  ํƒ€์ž… ์ƒ์„ฑ์„ ์ž์ฃผ ์‚ฌ์šฉํ•˜๊ฒŒ ๋  ๊ฑฐ์•ผ. ํŠนํžˆ ๊ถŒํ•œ ๊ด€๋ฆฌ, ์กฐ๊ฑด๋ถ€ UI ๋ Œ๋”๋ง, ๋˜๋Š” ๋‹ค์–‘ํ•œ API ์—”๋“œํฌ์ธํŠธ ์ฒ˜๋ฆฌ ๋“ฑ์—์„œ ์ด๋Ÿฐ ๊ธฐ์ˆ ์ด ๋น›์„ ๋ฐœํ•˜์ง€. ๋งˆ์น˜ ์žฌ๋Šฅ๋„ท์—์„œ ์‚ฌ์šฉ์ž์˜ ์—ญํ• ์ด๋‚˜ ๊ตฌ๋… ์ƒํƒœ์— ๋”ฐ๋ผ ๋‹ค๋ฅธ ๊ธฐ๋Šฅ์„ ์ œ๊ณตํ•˜๋Š” ๊ฒƒ์ฒ˜๋Ÿผ ๋ง์ด์•ผ!

๐ŸŽญ Pick๊ณผ ํ•จ๊ป˜ ์‚ฌ์šฉํ•˜๋ฉด ์ข‹์€ ์นœ๊ตฌ๋“ค

Pick์€ ๋‹ค๋ฅธ ํƒ€์ž… ์œ ํ‹ธ๋ฆฌํ‹ฐ๋“ค๊ณผ ํ•จ๊ป˜ ์‚ฌ์šฉํ•˜๋ฉด ๋”์šฑ ๊ฐ•๋ ฅํ•ด์ ธ. ๋ช‡ ๊ฐ€์ง€ ์˜ˆ๋ฅผ ์‚ดํŽด๋ณผ๊นŒ?

  1. Omit: Pick์˜ ๋ฐ˜๋Œ€๋กœ, ํŠน์ • ํ”„๋กœํผํ‹ฐ๋ฅผ ์ œ์™ธํ•œ ํƒ€์ž…์„ ๋งŒ๋“ค์–ด.
  2. Partial: ์„ ํƒํ•œ ํ”„๋กœํผํ‹ฐ๋ฅผ ๋ชจ๋‘ ์„ ํƒ์ ์œผ๋กœ ๋งŒ๋“ค ์ˆ˜ ์žˆ์–ด.
  3. Readonly: ์„ ํƒํ•œ ํ”„๋กœํผํ‹ฐ๋ฅผ ์ฝ๊ธฐ ์ „์šฉ์œผ๋กœ ๋งŒ๋“ค ์ˆ˜ ์žˆ์–ด.

์ด๋“ค์„ Pick๊ณผ ์กฐํ•ฉํ•ด์„œ ์‚ฌ์šฉํ•˜๋ฉด ์ •๋ง ๋‹ค์–‘ํ•œ ์ƒํ™ฉ์— ๋Œ€์‘ํ•  ์ˆ˜ ์žˆ์–ด. ์˜ˆ๋ฅผ ๋“ค์–ด๋ณผ๊นŒ?


interface Article {
  id: number;
  title: string;
  content: string;
  author: string;
  createdAt: Date;
  updatedAt: Date;
  tags: string[];
  likes: number;
}

type ArticlePreview = Readonly<pick>>;
type EditableArticleFields = Partial<pick>>;

function displayArticlePreview(preview: ArticlePreview) {
  console.log(`${preview.title} by ${preview.author}`);
}

function updateArticle(id: number, fields: EditableArticleFields) {
  // ์—…๋ฐ์ดํŠธ ๋กœ์ง
  console.log(`Updating article ${id} with:`, fields);
}

const articlePreview: ArticlePreview = {
  id: 1,
  title: "TypeScript is Awesome",
  author: "Coding Guru"
};

displayArticlePreview(articlePreview);
updateArticle(1, { title: "TypeScript is Super Awesome", tags: ["typescript", "programming"] });
</pick></pick>

์ด๋ ‡๊ฒŒ ํ•˜๋ฉด ์•„ํ‹ฐํด ๋ฏธ๋ฆฌ๋ณด๊ธฐ์—๋Š” ํ•„์š”ํ•œ ์ •๋ณด๋งŒ ํฌํ•จ๋˜๊ณ , ์ˆ˜์ • ๊ฐ€๋Šฅํ•œ ํ•„๋“œ๋Š” ๋ณ„๋„๋กœ ์ •์˜ํ•  ์ˆ˜ ์žˆ์–ด. ์™„์ „ ์œ ์—ฐํ•˜๋ฉด์„œ๋„ ํƒ€์ž… ์•ˆ์ „ํ•˜์ง€ ์•Š์•„? ๐Ÿ˜Ž

Pick๊ณผ ๋‹ค๋ฅธ ํƒ€์ž… ์œ ํ‹ธ๋ฆฌํ‹ฐ์˜ ์กฐํ•ฉ Pick Omit Partial Readonly

์ด ๋‹ค์ด์–ด๊ทธ๋žจ์€ Pick๊ณผ ๋‹ค๋ฅธ ํƒ€์ž… ์œ ํ‹ธ๋ฆฌํ‹ฐ๋“ค์˜ ๊ด€๊ณ„๋ฅผ ๋ณด์—ฌ์ค˜. Pick์ด ์ค‘์‹ฌ์— ์žˆ๊ณ , ๋‹ค๋ฅธ ์œ ํ‹ธ๋ฆฌํ‹ฐ๋“ค์ด ์ฃผ๋ณ€์„ ๋‘˜๋Ÿฌ์‹ธ๊ณ  ์žˆ์–ด. ์ด๋“ค์„ ์ ์ ˆํžˆ ์กฐํ•ฉํ•˜๋ฉด ์ •๋ง ๊ฐ•๋ ฅํ•˜๊ณ  ์œ ์—ฐํ•œ ํƒ€์ž…์„ ๋งŒ๋“ค ์ˆ˜ ์žˆ์ง€!

๐Ÿš€ Pick์˜ ํž˜: Pick์€ ํŠนํžˆ ํฐ ์ธํ„ฐํŽ˜์ด์Šค๋‚˜ ํƒ€์ž…์—์„œ ํ•„์š”ํ•œ ๋ถ€๋ถ„๋งŒ ์ถ”์ถœํ•ด์•ผ ํ•  ๋•Œ ๋น›์„ ๋ฐœํ•ด. API ์‘๋‹ต ์ฒ˜๋ฆฌ, ํผ ๋ฐ์ดํ„ฐ ๊ด€๋ฆฌ, ์ƒํƒœ ์—…๋ฐ์ดํŠธ ๋“ฑ์—์„œ ์•„์ฃผ ์œ ์šฉํ•˜์ง€. ์ด๊ฑธ ์ž˜ ํ™œ์šฉํ•˜๋ฉด ์ฝ”๋“œ์˜ ํƒ€์ž… ์•ˆ์ •์„ฑ์„ ๋†’์ด๊ณ , ์˜๋„๋ฅผ ๋ช…ํ™•ํžˆ ํ‘œํ˜„ํ•  ์ˆ˜ ์žˆ์–ด!

์ž, ์ด์ œ Pick์— ๋Œ€ํ•ด ๊ฝค ๊นŠ์ด ์•Œ์•„๋ดค์–ด. ์ด ๋…€์„์„ ์ž˜ ํ™œ์šฉํ•˜๋ฉด ๋„ค ์ฝ”๋“œ๊ฐ€ ํ›จ์”ฌ ๋” ๋ช…ํ™•ํ•˜๊ณ  ํƒ€์ž… ์•ˆ์ „ํ•ด์งˆ ๊ฑฐ์•ผ. ์šฐ๋ฆฌ๊ฐ€ ์ง€๊ธˆ๊นŒ์ง€ ๋ฐฐ์šด Partial, Readonly, Record, Pick ์ด ๋„ค ๊ฐ€์ง€ ํƒ€์ž… ์œ ํ‹ธ๋ฆฌํ‹ฐ๋ฅผ ์ž˜ ์กฐํ•ฉํ•˜๋ฉด ์ •๋ง ๊ฐ•๋ ฅํ•œ ํƒ€์ž… ์‹œ์Šคํ…œ์„ ๊ตฌ์ถ•ํ•  ์ˆ˜ ์žˆ์–ด. ๊ณ„์† ์—ฐ์Šตํ•˜๊ณ  ์‹คํ—˜ํ•ด๋ด! ๐Ÿš€

๐ŸŽ“ ๊ฒฐ๋ก : ํƒ€์ž…์Šคํฌ๋ฆฝํŠธ ๋งˆ์Šคํ„ฐ์˜ ๊ธธ ๐ŸŽ“

์šฐ์™€, ์ •๋ง ๊ธด ์—ฌ์ •์ด์—ˆ์–ด! ์šฐ๋ฆฌ๋Š” ํƒ€์ž…์Šคํฌ๋ฆฝํŠธ์˜ ๊ฐ•๋ ฅํ•œ ํƒ€์ž… ์œ ํ‹ธ๋ฆฌํ‹ฐ ๋„ค ๊ฐ€์ง€๋ฅผ ๊นŠ์ด ์žˆ๊ฒŒ ์‚ดํŽด๋ดค์ง€. ์ด์ œ ๋„ˆ๋Š” Partial, Readonly, Record, Pick์„ ์ž์œ ์ž์žฌ๋กœ ๋‹ค๋ฃฐ ์ˆ˜ ์žˆ๋Š” ์‹ค๋ ฅ์ž๊ฐ€ ๋์–ด! ๐Ÿ‘

์ด ๋„ค ๊ฐ€์ง€ ์œ ํ‹ธ๋ฆฌํ‹ฐ๋Š” ๊ฐ๊ฐ ๋‹ค์Œ๊ณผ ๊ฐ™์€ ํŠน์ง•์„ ๊ฐ€์ง€๊ณ  ์žˆ์–ด:

  • Partial: ๋ชจ๋“  ํ”„๋กœํผํ‹ฐ๋ฅผ ์„ ํƒ์ ์œผ๋กœ ๋งŒ๋“ค์–ด ์œ ์—ฐ์„ฑ์„ ๋†’์—ฌ์ค˜.
  • Readonly: ๋ชจ๋“  ํ”„๋กœํผํ‹ฐ๋ฅผ ์ฝ๊ธฐ ์ „์šฉ์œผ๋กœ ๋งŒ๋“ค์–ด ๋ถˆ๋ณ€์„ฑ์„ ๋ณด์žฅํ•ด์ค˜.
  • Record: ํ‚ค-๊ฐ’ ์Œ์˜ ๊ฐ์ฒด๋ฅผ ์‰ฝ๊ฒŒ ์ •์˜ํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•ด์ค˜.
  • Pick: ์›ํ•˜๋Š” ํ”„๋กœํผํ‹ฐ๋งŒ ์„ ํƒํ•ด์„œ ์ƒˆ๋กœ์šด ํƒ€์ž…์„ ๋งŒ๋“ค ์ˆ˜ ์žˆ๊ฒŒ ํ•ด์ค˜.

์ด ๋„๊ตฌ๋“ค์„ ์ž˜ ํ™œ์šฉํ•˜๋ฉด, ๋„ˆ์˜ ์ฝ”๋“œ๋Š” ๋”์šฑ ์•ˆ์ „ํ•˜๊ณ , ๋ช…ํ™•ํ•˜๋ฉฐ, ์œ ์—ฐํ•ด์งˆ ๊ฑฐ์•ผ. ๋งˆ์น˜ ์žฌ๋Šฅ๋„ท์—์„œ ๋‹ค์–‘ํ•œ ์žฌ๋Šฅ์„ ์กฐํ•ฉํ•ด ์ƒˆ๋กœ์šด ๊ฐ€์น˜๋ฅผ ์ฐฝ์ถœํ•˜๋Š” ๊ฒƒ์ฒ˜๋Ÿผ ๋ง์ด์•ผ! ๐ŸŒŸ

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

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

๊ณ„์†ํ•ด์„œ ๊ณต๋ถ€ํ•˜๊ณ , ์‹คํ—˜ํ•˜๊ณ , ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•ด๋ด. ๊ทธ๋ฆฌ๊ณ  ๊ฐ€์žฅ ์ค‘์š”ํ•œ ๊ฑด, ์ฆ๊ธฐ๋Š” ๊ฑฐ์•ผ! ์ฝ”๋”ฉ์€ ๊ฒฐ๊ตญ ์ฐฝ์กฐ์˜ ๊ณผ์ •์ด๋‹ˆ๊นŒ. ๋งˆ์น˜ ์žฌ๋Šฅ๋„ท์—์„œ ์ƒˆ๋กœ์šด ์žฌ๋Šฅ์„ ๋ฐœ๊ฒฌํ•˜๊ณ  ๋ฐœ์ „์‹œํ‚ค๋Š” ๊ฒƒ์ฒ˜๋Ÿผ, ๋„ˆ์˜ ํƒ€์ž…์Šคํฌ๋ฆฝํŠธ ์‹ค๋ ฅ๋„ ๊ณ„์†ํ•ด์„œ ์„ฑ์žฅํ•  ๊ฑฐ์•ผ. ๐ŸŒฑ

์ž, ์ด์ œ ๋„ˆ์˜ ์ฐจ๋ก€์•ผ. ๊ฐ€์„œ ๋ฉ‹์ง„ ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•ด๋ด! ํƒ€์ž…์Šคํฌ๋ฆฝํŠธ ๋งˆ์Šคํ„ฐ์˜ ๊ธธ์„ ํ–ฅํ•ด ๊ณ„์† ์ „์ง„ํ•˜์ž! ํ™”์ดํŒ…! ๐Ÿš€๐ŸŒŸ