고차 함수와 고차 컴포넌트의 차이
고차 함수란 다른 함수를 인자로 받거나 결과를 반환하는 함수를 의미합니다. 자바스크립트 표준 라이브러리에 포함된 filter, map, reduce 메서드들이 대표적인 사례입니다. 이에 반해 리액트의 고차 컴포넌트는 다음과 같은 두 가지 핵심 조건을 만족해야 합니다.
- 본질적으로 컴포넌트가 아니라 컴포넌트를 인수로 받는 함수여야 합니다.
- 실행 시점에 새로운 컴포넌트를 생성하여 반환해야 합니다.
즉, 기존 컴포넌트에 부가적인 기능을 덧붙이고 그 결과물을 다시 새로운 컴포넌트 객체로 제공하는 팩토리 역할을 수행한다고 볼 수 있습니다.
개발 도구를 위한 이름 지정 (displayName)
고차 컴포넌트로 감싸진 경우 디버깅 과정에서 실제 컴포넌트 이름이 잘리지 않고 올바르게 표시되어야 합니다. ES6 클래스 표현식에서는 명시적인 이름을 붙이지 않을 수 있으므로, 반드시 displayName 속성을 통해 식별자를 부여해야 개발자 도구가 정확하게 렌더링됩니다.
function createWrapper(Component) {
class Enhanced extends React.PureComponent {
render() {
return <Component {...this.props} />;
}
}
// 디버그 친화적인 이름 설정
Enhanced.displayName = `WithFeature(${Component.displayName || Component.name})`;
return Enhanced;
}
주요 활용 시나리오
고차 컴포넌트는 단순히 코드를 줄이기 위함이 아닙니다. 비즈니스 로직의 분리나 보안 계층 구현 등 구체적인 목적을 위해 사용됩니다. 다음 두 가지 사례를 통해 실제 구조를 살펴봅니다.
1. 공통 속성 주입 (Prop Injection)
여러 하위 컴포넌트에서 공통적으로 사용되는 데이터 (예: 지역 정보, 테마 설정, 로케일 등) 를 반복해서 전달하는 대신, 고차 컴포넌트 내부에서 자동적으로 병합시킬 수 있습니다.
// 기본 기능 추가용 헬퍼 함수 정의
function injectCommonData(WrappedComponent) {
return (props) => {
return (
<WrappedComponent
{...props}
globalSetting={{ lang: "ko", region: "SEA" }}
/>
);
};
}
// 실제 뷰 컴포넌트들 (공통 데이터를 직접 받지 않음)
const Dashboard = (props) => <div>{props.user}
{props.globalSetting.lang}