๐Ÿ“˜ React.FC๋ž€ ๋ฌด์—‡์ธ๊ฐ€? โ€“ TypeScript์—์„œ์˜ ์‚ฌ์šฉ๊ณผ ์žฅ๋‹จ์  ์ •๋ฆฌ

HMJยท2025๋…„ 5์›” 23์ผ

๊ฐœ๋…์ •๋ฆฌ

๋ชฉ๋ก ๋ณด๊ธฐ
6/8

React์™€ TypeScript๋ฅผ ํ•จ๊ป˜ ์‚ฌ์šฉํ•  ๋•Œ, ํ”ํžˆ ๋ณด๊ฒŒ ๋˜๋Š” ํƒ€์ž…์ด ํ•˜๋‚˜ ์žˆ๋‹ค. ๋ฐ”๋กœ React.FC ๋˜๋Š” React.FunctionComponent์ด๋‹ค.
์ด ๊ธ€์—์„œ๋Š” React.FC๊ฐ€ ๋ฌด์—‡์ธ์ง€, ์–ด๋–ค ์—ญํ• ์„ ํ•˜๋Š”์ง€, ์‹ค์ œ ํ˜„์—…์—์„œ๋Š” ์–ด๋–ค ๋ฐฉ์‹์„ ์„ ํ˜ธํ•˜๋Š”์ง€, ๊ทธ๋ฆฌ๊ณ  ๊ตฌ์ฒด์ ์ธ ์˜ˆ์‹œ๋ฅผ ํ†ตํ•ด ์ •๋ฆฌํ•ด๋ณด์ž.


โœ… 1. React.FC๋ž€?

React.FC๋Š” Function Component์˜ ํƒ€์ž… ์ •์˜๋ฅผ ๋„์™€์ฃผ๋Š” ์ œ๋„ค๋ฆญ(Generic) ํƒ€์ž…์ด๋‹ค.
์ฆ‰, ์ปดํฌ๋„ŒํŠธ๊ฐ€ ์–ด๋–ค props๋ฅผ ๋ฐ›์„์ง€ ๋ช…์‹œํ•  ์ˆ˜ ์žˆ๋„๋ก ๋„์™€์ฃผ๋Š” ํƒ€์ž… ๋„์šฐ๋ฏธ๋ผ๊ณ  ์ดํ•ดํ•˜๋ฉด ๋œ๋‹ค.

type Props = {
  name: string;
};

const Hello: React.FC<Props> = ({ name }) => {
  return <div>Hello, {name}</div>;
};

์œ„ ์ฝ”๋“œ์—์„œ Hello ์ปดํฌ๋„ŒํŠธ๋Š” name์ด๋ผ๋Š” ๋ฌธ์ž์—ด props๋ฅผ ๋ฐ›์œผ๋ฉฐ, React.FC<Props>๋ฅผ ํ†ตํ•ด ์ด ํƒ€์ž…์„ ๋ช…์‹œํ•˜๊ณ  ์žˆ๋‹ค.


๐Ÿง  2. TypeScript์—์„œ React.FC๊ฐ€ ํ•˜๋Š” ์ผ

  • Function Component๋กœ ์ •์˜
    - ์ปดํฌ๋„ŒํŠธ๊ฐ€ ํ•จ์ˆ˜ํ˜•์ด๋ผ๋Š” ๊ฒƒ์„ ํƒ€์ž…์œผ๋กœ ๋ช…ํ™•ํ•˜๊ฒŒ ์•Œ๋ ค์คŒ
  • children์„ ์ž๋™ ํฌํ•จ
    - props.children์ด ์ž๋™์œผ๋กœ ํƒ€์ž…์— ํฌํ•จ๋˜์–ด ๋”ฐ๋กœ ๋ช…์‹œํ•˜์ง€ ์•Š์•„๋„ ์‚ฌ์šฉ ๊ฐ€๋Šฅ
  • ๋ฐ˜ํ™˜๊ฐ’์„ ReactElement๋กœ ๊ณ ์ •
    - ์ปดํฌ๋„ŒํŠธ๊ฐ€ JSX ๋˜๋Š” ReactNode๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋Š” ๊ฒƒ์„ ํƒ€์ž…์œผ๋กœ ๋ณด์žฅํ•จ

โš–๏ธ 3. React.FC์˜ ์žฅ๋‹จ์ 

โœ… ์žฅ์ 

์žฅ์ ์„ค๋ช…
๐Ÿ”น children ์ž๋™ ํฌํ•จ์ปดํฌ๋„ŒํŠธ ๋‚ด๋ถ€์—์„œ props.children์„ ๋ฐ”๋กœ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Œ
๐Ÿ”น ๋ช…์‹œ์ ์ธ ๋ฐ˜ํ™˜ ํƒ€์ž…ReactElement๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋Š” ๊ฑธ ๋ณด์žฅํ•ด์คŒ
๐Ÿ”น ์ดˆ๊ธฐ ํ•™์Šต์ž์—๊ฒŒ ์ง๊ด€์ ํ•œ๋ˆˆ์— "์ด๊ฑด ํ•จ์ˆ˜ํ˜• ์ปดํฌ๋„ŒํŠธ์•ผ"๋ผ๋Š” ๊ฑธ ์•Œ ์ˆ˜ ์žˆ์Œ

โŒ ๋‹จ์ 

๋‹จ์ ์„ค๋ช…
๐Ÿ”ธ children ์ž๋™ ํฌํ•จ์œผ๋กœ ์ธํ•œ ์˜ค๋ฅ˜์‚ฌ์šฉํ•˜์ง€ ์•Š๋Š” ์ปดํฌ๋„ŒํŠธ์—๋„ children์ด ํ—ˆ์šฉ๋จ (์‹ค์ˆ˜ ๊ฐ€๋Šฅ)
๐Ÿ”ธ ์ œ๋„ˆ๋ฆญ ์‚ฌ์šฉ ์ œ์•ฝ<T> ๋“ฑ์˜ ์ œ๋„ˆ๋ฆญ์„ ์ ์šฉํ•˜๊ธฐ๊ฐ€ ๋ฒˆ๊ฑฐ๋กœ์›€
๐Ÿ”ธ ํ•จ์ˆ˜์˜ ๋ฐ˜ํ™˜๊ฐ’ ํƒ€์ž…์„ ์ค‘๋ณต ๋ช…์‹œTypeScript๊ฐ€ ์ถ”๋ก  ๊ฐ€๋Šฅํ•œ ๊ฐ’์„ ๊ตณ์ด ๋ช…์‹œํ•  ํ•„์š” ์—†์Œ

๐Ÿ†š 4. React.FC vs ๋ช…์‹œ์  Props ํƒ€์ž…

โœ… React.FC ๋ฐฉ์‹

type Props = {
  name: string;
};

const MyComponent: React.FC<Props> = (props) => {
  return <div>{props.name}</div>;
};

โœ… ๋ช…์‹œ์  ํƒ€์ž… ๋ฐฉ์‹ (๊ถŒ์žฅ๋˜๋Š” ์ถ”์„ธ)

type Props = {
  name: string;
};

const MyComponent = ({ name }: Props) => {
  return <div>{name}</div>;
};

๐Ÿ” 5. ์–ด๋А ๋ฐฉ์‹์ด ๋” ์ข‹์€๊ฐ€?

๊ธฐ์ค€React.FC์ง์ ‘ ํƒ€์ž… ๋ช…์‹œ
children ์ž๋™ ํฌํ•จโœ… OโŒ ๋ช…์‹œ ํ•„์š”
ํƒ€์ž… ์ถ”๋ก  ์œ ์—ฐ์„ฑโŒ ์ œํ•œ ์žˆ์Œโœ… ์ž์œ ๋กœ์›€
์ฝ”๋“œ ๊ธธ์ดโŒ ๊ธธ์–ด์งโœ… ๊ฐ„๊ฒฐํ•จ
์ตœ์‹  ์ถ”์„ธโŒ ์ง€์–‘โœ… ์„ ํ˜ธ๋จ

๐Ÿ’ก ๋Œ€๋ถ€๋ถ„์˜ ๊ธฐ์—…, ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ, ๊ณต์‹ ๋ฌธ์„œ์—์„œ๋Š” React.FC ์‚ฌ์šฉ์„ ์ง€์–‘ํ•˜๋Š” ์ถ”์„ธ๋‹ค.
ํŠนํžˆ children ์ž๋™ ํฌํ•จ์œผ๋กœ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ๋Š” ๋ถˆํ•„์š”ํ•œ ์˜ค๋ฅ˜ ๋ฐฉ์ง€์™€ ํƒ€์ž… ์ถ”๋ก  ์œ ์—ฐ์„ฑ ํ™•๋ณด๊ฐ€ ํฐ ์ด์œ ๋‹ค.


โฐ ์–ธ์ œ React.FC๋ฅผ ์จ๋„ ๊ดœ์ฐฎ์„๊นŒ?

์ƒํ™ฉReact.FC ์‚ฌ์šฉ ์—ฌ๋ถ€
๊ฐ„๋‹จํ•œ ํ”„๋กœํ† ํƒ€์ž… ๊ฐœ๋ฐœโœ… ๊ดœ์ฐฎ์Œ
children ํฌํ•จํ•œ ์ปดํฌ๋„ŒํŠธ ์ž‘์„ฑ ์‹œโœ… ๋ช…์‹œ ์—†์ด ์‚ฌ์šฉ ๊ฐ€๋Šฅ
์ œ๋„ˆ๋ฆญ ์‚ฌ์šฉ์ด ํ•„์š”ํ•œ ์ƒํ™ฉโŒ ์ง€์–‘
๊ทœ๋ชจ ์žˆ๋Š” ํŒ€ ํ”„๋กœ์ ํŠธโŒ ๊ฐ€๊ธ‰์  ๋ช…์‹œ์  ๋ฐฉ์‹ ์‚ฌ์šฉ ๊ถŒ์žฅ

โœ… ๊ฒฐ๋ก 

  • React.FC๋Š” ํƒ€์ž…์Šคํฌ๋ฆฝํŠธ์—์„œ ํ•จ์ˆ˜ํ˜• ์ปดํฌ๋„ŒํŠธ๋ฅผ ์‰ฝ๊ฒŒ ์„ ์–ธํ•  ์ˆ˜ ์žˆ๋„๋ก ๋„์™€์ฃผ๋Š” ์ œ๋„ค๋ฆญ ํƒ€์ž…์ด๋‹ค.

  • ํ•˜์ง€๋งŒ children ์ž๋™ ํฌํ•จ๊ณผ ์ œ๋„ค๋ฆญ ์ œ์•ฝ ๋•Œ๋ฌธ์— ์š”์ฆ˜์€ ์ง์ ‘ Props๋ฅผ ๋ช…์‹œํ•˜๋Š” ๋ฐฉ์‹์„ ์„ ํ˜ธํ•œ๋‹ค.

  • ์ƒํ™ฉ์— ๋”ฐ๋ผ ์ ์ ˆํžˆ ์„ ํƒํ•˜๋˜, ํŒ€ ๋‚ด ์ฝ”๋“œ ์Šคํƒ€์ผ ๊ฐ€์ด๋“œ์— ๋งž์ถฐ ํ†ต์ผํ•˜๋Š” ๊ฒƒ์ด ์ค‘์š”ํ•˜๋‹ค.


๐Ÿ“ ํ•œ ์ค„ ์š”์•ฝ

React.FC๋Š” ํŽธ๋ฆฌํ•˜์ง€๋งŒ, ๋” ๋ช…์‹œ์ ์ด๊ณ  ์œ ์—ฐํ•œ ์ง์ ‘ Props ํƒ€์ž… ์„ ์–ธ ๋ฐฉ์‹์ด ํ˜„์žฌ TypeScript + React ๊ฐœ๋ฐœ์—์„œ ๋” ๋งŽ์ด ์‚ฌ์šฉ๋œ๋‹ค.

0๊ฐœ์˜ ๋Œ“๊ธ€