본문 바로가기

React

[React] 고차 컴포넌트(Higher-Order Components, HOCs)와 렌더 프롭스(Render Props)

반응형
React에서 고차 컴포넌트(Higher-Order Components, HOCs)와 렌더 프롭스(Render Props)는 컴포넌트 로직을 재사용하기 위한 두 가지 중요한 패턴입니다. 이들 각각은 React 애플리케이션의 구조와 유지보수성을 향상시키는 데 도움을 줄 수 있습니다. 이 글에서는 HOCs와 렌더 프롭스의 개념, 사용법, 그리고 각각의 장단점에 대해 자세히 알아보겠습니다.

1. 고차 컴포넌트(Higher-Order Components, HOCs)

고차 컴포넌트는 컴포넌트 로직을 재사용하기 위한 React의 고급 기술입니다. 함수로써, 하나의 컴포넌트를 받아 새로운 컴포넌트를 반환합니다. HOC는 React의 구성 가능한 특성을 활용하여, 컴포넌트 간에 공통적인 기능을 공유할 수 있게 해줍니다.

HOC의 예시

function withSubscription(WrappedComponent, selectData) {
  return class extends React.Component {
    constructor(props) {
      super(props);
      this.state = {
        data: selectData(DataSource, props),
      };
    }

    componentDidMount() {
      // 데이터 소스를 구독합니다.
    }

    componentWillUnmount() {
      // 구독을 해제합니다.
    }

    render() {
      // 추가 props와 함께 WrappedComponent를 렌더링합니다.
      return <WrappedComponent data={this.state.data} {...this.props} />;
    }
  };
}

HOC의 장단점

  • 장점: 로직을 재사용할 수 있으며, 기존 컴포넌트를 수정하지 않고도 새로운 기능을 추가할 수 있습니다.
  • 단점: React 개발자 도구에서 래퍼 컴포넌트가 많아져 디버깅이 어려워질 수 있으며, props의 충돌 가능성이 있습니다.

2. 렌더 프롭스(Render Props)

렌더 프롭스는 컴포넌트 간에 코드를 재사용하는 기술로, 컴포넌트가 어떤 것을 렌더링할지 결정하기 위해 함수 prop을 사용하는 패턴입니다. 이 패턴은 자식 컴포넌트가 렌더링될 때 자신이 받는 props 또는 state에 기반하여 어떤 것을 렌더링할지를 결정하게 해줍니다.

렌더 프롭스 예시

class MouseTracker extends React.Component {
  constructor(props) {
    super(props);
    this.state = { x: 0, y: 0 };
  }

  handleMouseMove = (event) => {
    this.setState({
      x: event.clientX,
      y: event.clientY,
    });
  };

  render() {
    return (
      <div onMouseMove={this.handleMouseMove}>
        {this.props.render(this.state)}
      </div>
    );
  }
}

렌더 프롭스의 장단점

  • 장점: 유연성이 높으며, 복잡한 컴포넌트 트리에 걸쳐 상태와 행위를 공유할 수 있습니다.
  • 단점: 렌더링 메서드 또는 컴포넌트가 복잡해질 수 있으며, 가상 DOM에서 추가적인 컴포넌트 계층을 생성할 수 있습니다.

결론

HOCs와 렌더 프롭스는 각각의 사용 사례와 요구 사항에 따라 선택할 수 있습니다. HOCs는 고급 구성을 가능하게 하며, 렌더 프롭스는 더 유연한 코드 재사용 패턴을 제공합니다. 두 방법 모두 React 애플리케이션의 구조를 개선하고 코드의 재사용성을 높이는 데 큰 도움이 될 수 있습니다. 프로젝트의 목적과 필요에 따라 가장 적합한 패턴을 선택하시기 바랍니다.

반응형

'React' 카테고리의 다른 글

[React] useRoutes 를 사용한 Routing  (0) 2024.03.28
[React] React Router 가이드  (0) 2024.03.28
[React] 무한 스크롤 구현하기  (0) 2024.03.27
[React] useRef란?  (1) 2024.03.27
[React] useMemo 란?  (0) 2024.03.27