React.FC란 무엇인가?
React.FC는 React Function Component의 약자로, TypeScript에서 함수형 컴포넌트의 타입을 정의할 때 사용됩니다.
주로 props의 타입을 지정하고, children prop을 자동으로 포함하는 역할을 합니다.
함수형 컴포넌트를 작성할 때 타입을 명시적으로 정의하고, 코드의 안정성을 확보하는 데 매우 유용합니다.
import React from 'react';
const MyComponent: React.FC<{ name: string }> = ({ name }) => {
return <div>Hello, {name}!</div>;
};
- 위 코드에서 MyComponent는 name이라는 props를 받고, 해당 props에 대한 타입은 React.FC<{ name: string }>로 정의됩니다.
- 여기서 React.FC는 props 타입을 받는 타입 별칭이자 제네릭 타입으로 동작합니다.
- children을 자동으로 포함하는 것도 큰 장점입니다.
타입 별칭(Type Alias) vs 제네릭 타입(Generic Type)
타입 별칭(Type Alias)
타입 별칭은 특정 타입에 이름을 붙여서 사용할 수 있도록 하는 방식입니다.
React.FC는 내부적으로 FunctionComponent라는 타입 별칭을 사용하고 있습니다.
이 타입 별칭을 사용하면, 컴포넌트의 props 타입을 보다 쉽게 정의할 수 있습니다.
예를 들어, 위 예시에서 React.FC 대신 FunctionComponent를 직접 사용할 수 있습니다
type MyComponentProps = {
name: string;
};
const MyComponent: React.FunctionComponent<MyComponentProps> = ({ name }) => {
return <div>Hello, {name}!</div>;
};
제네릭 타입(Generic Type)
제네릭 타입은 동적으로 타입을 전달하는 방식입니다.
React.FC는 제네릭 타입을 사용하여 props의 타입을 정의합니다.
제네릭 타입을 사용하면 타입을 더 세밀하게 정의할 수 있고, 다양한 상황에서 유연하게 사용할 수 있습니다.
const MyComponent = <P extends { name: string }>(props: P) => {
return <div>Hello, {props.name}!</div>;
};
- 위 예시에서, P는 name: string 타입을 가진 객체로 제약되어 있으며, props는 동적으로 전달된 P 타입을 따릅니다.
React.FC와 제네릭 사용 비교
React.FC는 내부적으로 제네릭 타입으로 정의되어 있습니다.
즉, props 타입을 제네릭 타입 매개변수로 전달할 수 있습니다.
하지만 React.FC를 사용할 때의 장점과 단점을 함께 살펴보겠습니다.
장점
- 자동으로 children 포함
- React.FC를 사용하면 children prop이 자동으로 포함됩니다.
- 이로 인해 children이 필요한 컴포넌트를 작성할 때 매우 편리합니다.
- 간결한 코드
- React.FC를 사용하면 컴포넌트의 타입을 간결하게 정의할 수 있습니다.
단점
- children이 필요 없는 경우에도 포함됨
- children이 필요 없는 컴포넌트에서 React.FC를 사용하면 불필요하게 children prop이 포함되어 코드가 불필요하게 복잡해질 수 있습니다.
제네릭 타입 사용 장점
제네릭을 사용하면 children을 자동으로 포함시키지 않거나, 필요한 경우 명시적으로 포함시킬 수 있어 더 유연하게 사용할 수 있습니다.
React.FC는 children을 자주 사용하는 컴포넌트에서 유용하게 사용할 수 있습니다.
그러나 children이 필요 없는 경우에는 제네릭을 사용하여 props를 더 명시적으로 정의하는 것이 좋습니다.
추천 사용법
- children이 필요한 경우: React.FC를 사용하여 children을 자동으로 포함시키는 것이 유리합니다.
- children이 필요 없는 경우: 제네릭을 사용하여 props 타입을 명시적으로 정의하는 것이 더 깔끔하고 효율적입니다.
React.FC를 사용한 카드 컴포넌트
React.FC를 사용하여, 다양한 내용을 받을 수 있는 카드 컴포넌트를 만들어 보겠습니다.
이 컴포넌트는 title과 children을 받아서, 동적으로 다양한 콘텐츠를 렌더링할 수 있습니다.
import React from 'react';
// 카드 컴포넌트 정의
const Card: React.FC<{ title: string }> = ({ title, children }) => {
return (
<div style={cardStyle}>
<h2>{title}</h2>
<div>{children}</div>
</div>
);
};
// 스타일을 적용한 카드 스타일
const cardStyle: React.CSSProperties = {
border: '1px solid #ccc',
padding: '16px',
borderRadius: '8px',
boxShadow: '0 2px 8px rgba(0,0,0,0.1)',
maxWidth: '300px',
margin: '10px auto',
};
// 사용 예시
const App: React.FC = () => {
return (
<div>
<Card title="카드 1">
<p>이 카드에는 간단한 텍스트가 포함되어 있습니다.</p>
</Card>
<Card title="카드 2">
<ul>
<li>리스트 아이템 1</li>
<li>리스트 아이템 2</li>
<li>리스트 아이템 3</li>
</ul>
</Card>
</div>
);
};
export default App;
- Card 컴포넌트가 title을 받고, children을 렌더링합니다.
- 이로 인해 카드 컴포넌트가 텍스트, 리스트, 이미지 등 다양한 콘텐츠를 유동적으로 받을 수 있습니다.
제네릭을 사용한 버튼 컴포넌트
React.FC 대신, 제네릭 타입을 사용하여 컴포넌트를 작성할 수 있습니다.
이 예시에서는 버튼 컴포넌트가 label과 onClick 이벤트를 받아서, 클릭 시 다른 동작을 하도록 만들어보겠습니다.
import React from 'react';
// 제네릭을 사용한 버튼 컴포넌트
const Button = <P extends { label: string; onClick: () => void }>(props: P) => {
return (
<button onClick={props.onClick} style={buttonStyle}>
{props.label}
</button>
);
};
// 버튼 스타일
const buttonStyle: React.CSSProperties = {
backgroundColor: '#007bff',
color: 'white',
border: 'none',
padding: '10px 20px',
borderRadius: '4px',
cursor: 'pointer',
fontSize: '16px',
};
// 사용 예시
const App: React.FC = () => {
const handleClick = () => {
alert('버튼 클릭됨!');
};
return (
<div>
<Button label="클릭하세요" onClick={handleClick} />
</div>
);
};
export default App;
- 이 예시에서는 버튼 컴포넌트를 제네릭으로 정의하고, label과 onClick을 prop으로 받아 사용합니다.
- 제네릭 타입을 사용하여 props를 명확히 정의하고, 버튼의 텍스트와 클릭 이벤트 핸들러를 동적으로 처리할 수 있게 했습니다.
'개발 공부 > React' 카테고리의 다른 글
| Static과 Dynamic Rendering (0) | 2025.02.23 |
|---|---|
| React.ReactNode, ReactElement, ComponentProps, Ref (0) | 2025.01.31 |
| React.memo (3) - useMemo (0) | 2025.01.27 |
| React.memo (2) (0) | 2025.01.24 |
| React.memo (1) (1) | 2025.01.22 |