TypeScript + React — 컴포넌트 타입, Generic 컴포넌트
TypeScript + React — 컴포넌트 타입, Generic 컴포넌트
💡 왜 배워야 할까요?
개념
TypeScript와 React를 함께 사용할 때 컴포넌트의 Props 타입 정의와 재사용 가능한 Generic 컴포넌트 구현은 2025년 현재 프론트엔드 개발의 필수 스킬입니다. 런타임 에러를 컴파일 타임에 잡아내고, IDE의 자동완성과 리팩토링을 안전하게 활용할 수 있어 대규모 프로젝트에서 생산성과 유지보수성을 크게 향상시킵니다.
왜 중요한가?
실무에서 컴포넌트 Props에 잘못된 타입의 데이터를 전달하거나, API 응답 구조가 바뀌었는데 관련 컴포넌트들을 놓치고 수정하지 않아 런타임 에러가 발생하는 경우가 빈번합니다. 또한 Table, Modal, Form 같은 공통 컴포넌트를 여러 도메인에서 재사용할 때, Generic을 활용하지 않으면 각 도메인마다 중복 코드를 작성하게 되어 유지보수 비용이 기하급수적으로 증가합니다.
핵심 개념
TypeScript + React 컴포넌트 타입핑은 마치 '레고 블록에 사용 설명서를 붙이는 것'과 같습니다. 각 컴포넌트가 어떤 Props를 받고, 어떤 형태의 데이터를 다루는지 명시하여 다른 개발자(또는 미래의 나)가 안전하게 조립할 수 있도록 합니다. Generic 컴포넌트는 '범용 틀'로, 하나의 컴포넌트로 다양한 데이터 타입을 다룰 수 있게 해주는 고급 패턴입니다.
핵심 포인트
- ▸Props 인터페이스로 컴포넌트 계약 명시
- ▸Generic을 활용한 타입 안전한 재사용 컴포넌트
- ▸React 19의 새로운 타입 기능과 함께 사용하는 패턴
💡 ⚠️ 흔한 실수
- ▸Props 인터페이스에서 optional과 required를 구분하지 않고 모든 필드를 필수로 만들어 컴포넌트 재사용성을 해치는 경우
- ▸Generic 컴포넌트에서 extends 제약 조건을 제대로 설정하지 않아 런타임에 undefined 에러가 발생하는 경우
- ▸event handler나 callback 함수의 매개변수 타입을 any로 정의해서 호출하는 쪽에서 타입 안전성을 잃는 경우
💡 🎯 면접 준비
Q: React 컴포넌트에서 Props 타입을 정의하는 방법과 interface vs type의 차이점을 설명해주세요
Q: Generic 컴포넌트를 만들 때 어떤 상황에서 유용하고, 실제 프로젝트에서 어떻게 활용했나요?
힌트: Props 타입 정의 → interface 사용 이유(확장성) → optional vs required 구분 → Generic 활용 사례(Table, Modal, Form) → 타입 안전성과 코드 재사용성 향상 효과 → 실제 프로젝트 적용 경험
⚛️ React 패턴 — TypeScript + React — 컴포넌트 타입, Generic 컴포넌트
function Greeting({ name }) {
return <h1>안녕, {name}!</h1>;
}
<Greeting name="홍길동" />
<Greeting name="Alice" />
<Greeting name="Bob" />