재사용 가능한 React 컴포넌트: 현실과 이론의 괴리
카테고리
프로그래밍/소프트웨어 개발
서브카테고리
웹 개발
대상자
React 및 TypeScript로 작업하는 개발자, 특히 컴포넌트 재사용성에 어려움을 겪는 중간 이상 수준 개발자
핵심 요약
- props로 구성 유연성 확보 (예:
closable
속성 추가 시 닫기 버튼 동작) - useState로 내부 상태 관리 (예:
useState
활용 시 렌더링 최적화) - 커스텀 이벤트로 부모-자식 통신 (예:
onClose
핸들러로 상태 동기화) - TypeScript 타입 체크 강제 (런타임 오류 방지 및 코드 가독성 향상)
섹션별 세부 요약
1. 문제 인식: "재사용 가능한" 컴포넌트의 한계
- 기존 컴포넌트는 단일 케이스에 최적화되어 있어,
alert
타입 추가 시prop
복잡성 증가 - 스타일링 오류, 예기치 않은 사이드 이펙트 발생 (예:
dismissible
기능 추가 시) - 대부분의 컴포넌트는 "기능 수행"에 집중, "확장성" 고려 부족
2. 개선된 접근 방식: React + TypeScript
- props 기반 구성
- variant
속성으로 welcome
, error
, success
등 다양한 스타일 지원
- children
속성으로 내부 컨텐츠 유연하게 조정
- useState 내부 상태 관리
- useReducer
대신 useState
활용 시 간단한 상태 변경 처리
- closable: boolean
속성으로 닫기 버튼 조건 판단
- 커스텀 이벤트 통신
- onClose
핸들러로 부모 컴포넌트에 상태 변경 알림
- EventEmitter
대신 props
기반 콜백 패턴 사용
3. TypeScript의 역할: 안정성 확보
TypeScript
로props
타입 정의 (예:interface AlertProps { variant: 'success' | 'error'; closable?: boolean; }
)strict
모드 활성화 시undefined
처리 강제 (예:closable ?? false
)React.FC
대신function AlertComponent(props: AlertProps)
사용으로 명확한 타입 선언
결론
- TypeScript + React의 조합을 통해
props
,state
,event
3가지 원칙을 기반으로 확장 가능한 컴포넌트 설계 variant
/closable
등 유연한 속성 정의와useState
활용으로 상태 관리 최적화onClose
핸들러를 통해 부모-자식 간 명시적 통신 구현 (예:handleClose = () => onClose(true)
호출)