본문 바로가기

개발

React 생명주기 메서드와 컴포넌트 최적화 기법

React는 컴포넌트 기반의 개발을 통해 재사용성과 유지 보수성을 높일 수 있습니다. 이번 글에서는 React 컴포넌트의 생명주기 메서드와 컴포넌트 최적화 기법에 대해 자세히 알아보겠습니다. 이를 통해 앱의 성능을 향상시키고 사용자 경험을 향상시킬 수 있습니다.

 

생명주기 메서드

React 컴포넌트는 생성, 업데이트, 소멸과 같은 생명주기를 가지고 있습니다. 이를 이해하고 활용하여 컴포넌트의 동작을 제어할 수 있습니다.

 - constructor: 컴포넌트가 생성될 때 호출되는 메서드로, 초기화 작업을 수행합니다. 예를 들어, 초기 상태값을 설정하거나 이벤트 핸들러를 바인딩할 수 있습니다.

class MyComponent extends React.Component {
  constructor(props) {
    super(props);
    this.state = {
      count: 0
    };
    this.handleClick = this.handleClick.bind(this);
  }

  handleClick() {
    this.setState(prevState => ({
      count: prevState.count + 1
    }));
  }

  render() {
    return (
      <div>
        <button onClick={this.handleClick}>Increase</button>
        <p>Count: {this.state.count}</p>
      </div>
    );
  }
}

 

componentDidMount: 컴포넌트가 DOM에 마운트된 직후에 호출되는 메서드입니다. 외부 데이터를 불러오거나 이벤트 리스너를 등록하는 등의 작업을 수행할 수 있습니다. 예를 들어, API 요청을 보내고 데이터를 가져오는 코드를 이곳에 작성할 수 있습니다.

class MyComponent extends React.Component {
  componentDidMount() {
    fetch('https://api.example.com/data')
      .then(response => response.json())
      .then(data => {
        // 데이터 처리 로직
      });
  }

  render() {
    // 컴포넌트 렌더링 로직
  }
}

 

componentDidUpdate: 컴포넌트가 업데이트된 직후에 호출되는 메서드입니다. 이전과 현재의 props나 state를 비교하여 필요한 업데이트 작업을 수행할 수 있습니다. 예를 들어, props의 변경에 따라 추가적인 데이터를 가져오는 등의 작업을 수행할 수 있습니다.

class MyComponent extends React.Component {
  componentDidUpdate(prevProps) {
    if (prevProps.id !== this.props.id) {
      fetch(`https://api.example.com/data/${this.props.id}`)
        .then(response => response.json())
        .then(data => {
          // 데이터 처리 로직
        });
    }
  }

  render() {
    // 컴포넌트 렌더링 로직
  }
}

 

componentWillUnmount: 컴포넌트가 언마운트되기 직전에 호출되는 메서드입니다. 정리 작업을 수행할 수 있습니다. 예를 들어, 이벤트 리스너를 해제하거나 타이머를 중지하는 등의 작업을 수행할 수 있습니다.

class MyComponent extends React.Component {
  componentWillUnmount() {
    clearInterval(this.timer);
  }

  componentDidMount() {
    this.timer = setInterval(() => {
      // 타이머 로직
    }, 1000);
  }

  render() {
    // 컴포넌트 렌더링 로직
  }
}

컴포넌트 최적화 기법

React에서는 컴포넌트 최적화를 통해 앱의 성능을 향상시킬 수 있습니다. 이는 불필요한 렌더링을 방지하고 컴포넌트의 업데이트 주기를 최적화함으로써 동작합니다.

 

shouldComponentUpdate: 컴포넌트가 업데이트되기 전에 호출되는 메서드입니다. 이전과 현재의 props와 state를 비교하여 불필요한 업데이트를 방지할 수 있습니다. 이를 통해 성능을 향상시킬 수 있습니다.

class MyComponent extends React.Component {
  shouldComponentUpdate(nextProps, nextState) {
    if (this.props.data !== nextProps.data) {
      return true;
    }
    return false;
  }

  render() {
    // 컴포넌트 렌더링 로직
  }
}

 

React.memo: 함수형 컴포넌트를 감싸는 고차 컴포넌트입니다. props가 변경되지 않으면 불필요한 렌더링을 방지합니다. 이를 통해 컴포넌트의 재렌더링을 최소화하여 성능을 개선할 수 있습니다.

const MyComponent = React.memo(({ data }) => {
  // 컴포넌트 렌더링 로직
});

// 예시에서는 data props를 기준으로 재렌더링을 방지합니다.

 

useCallbackuseMemo: Hook을 사용하여 함수와 값을 메모이제이션하고, 이전 값과 비교하여 불필요한 연산을 방지할 수 있습니다. 예를 들어, 이벤트 핸들러 함수를 useCallback으로 감싸면, 해당 함수는 변하지 않는 한 메모리에 저장되고, 재사용됩니다. 이를 통해 불필요한 함수 생성을 방지할 수 있습니다.

const MyComponent = () => {
  const handleClick = useCallback(() => {
    // 이벤트 핸들러 로직
  }, []);

  // handleClick은 변하지 않는 한 같은 함수를 재사용합니다.
  // 불필요한 함수 생성을 방지할 수 있습니다.
};

 

React 생명주기 메서드와 컴포넌트 최적화 기법은 React 앱의 성능을 향상시키고 사용자 경험을 향상시키는 데 중요한 역할을 합니다. 개발자는 컴포넌트의 생명주기를 이해하고, 최적화 기법을 적용하여 사용자에게 더 나은 경험을 제공할 수 있습니다.