[REACT] 함수형 컴포넌트와 클래스형 컴포넌트

SungWoo·2024년 12월 8일

React

목록 보기
11/16
post-thumbnail

리액트는 UI를 구성하는 기본 단위로 컴포넌트를 사용한다. 컴포넌트는 크게 함수형 컴포넌트와 클래스형 컴포넌트로 나뉜다. 이번 포스팅에서는 두 컴포넌트 유형에 대해 정리해보자.

1. 함수형 컴포넌트 (Function Component)

JavaScript 함수를 정의하여 컴포넌트를 만드는 방식

함수형 컴포넌트는 자바스크립트 함수로 정의되며, props 를 입력받아 JSX를 반환한다.

import React from 'react';

// function 키워드를 사용한 함수형 컴포넌트
function FunctionComponent(props) {
  return (
    <div>
      <h1>Hello, {props.name}!</h1>
      <p>This is a function component.</p>
    </div>
  );
}

// 화살표 함수를 사용한 함수형 컴포넌트
const FunctionComponent = (props) => {
  return (
    <div>
      <h1>Hello, {props.name}!</h1>
      <p>This is a function component.</p>
    </div>
  );
};

export default FunctionComponent;

React Hooks

리액트 훅의 도입으로 인해 함수형 컴포넌트에서도 상태 관리와 생명주기 로직을 처리할 수 있게 되었다.

useState와 useEffect를 활용한 상태 관리와 부수효과 처리 예시

import React, { useState, useEffect } from 'react';

function Counter() {
  const [count, setCount] = useState(0);

  useEffect(() => {
    console.log('Component did mount or update');
    return () => console.log('Component will unmount');
  }, [count]); // count 값이 변경될 때만 실행

  return (
    <div>
      <p>Count: {count}</p>
      <button onClick={() => setCount(count + 1)}>Increment</button>
    </div>
  );
}

export default Counter;

장점

  1. 간결하고 직관적인 코드
    • 함수형 컴포넌트는 클래스 문법이 필요 없으므로 코드가 간결하고 직관적이다.
  2. 리액트 훅
    • 클래스에서 볼 수 있는 복잡한 생명주기 메서드를 사용하지 않고도 useState , useEffect 등 훅을 통해 상태 관리와 생명주기 메서드의 기능을 간단히 구현할 수 있다.
    • 커스텀 훅을 통해 공통 상태 관리 로직을 모듈화하여, 이를 여러 컴포넌트에서 재사용할 수 있다.
  3. 테스트 용이성
    • 함수형 컴포넌트는 순수 함수 형태로 작성되므로 외부 상태에 의존하지 않고 독립적으로 테스트할 수 있다.

2. 클래스형 컴포넌트

ES6 클래스 문법을 사용하여 컴포넌트를 만드는 방식

클래스형 컴포넌트는 ES6 클래스로 정의되며, React.Component 또는 React.PureComponent 를 확장하여 만든다. 상태 관리와 생명주기 메서드를 활용하여 컴포넌트를 관리할 수 있다.

import React, { Component } from 'react';

class Counter extends Component {
  constructor(props) {
    super(props);
    this.state = { count: 0 };
  }

  componentDidMount() {
    console.log('Component did mount');
  }

  componentDidUpdate() {
    console.log('Component did update');
  }

  componentWillUnmount() {
    console.log('Component will unmount');
  }

  incrementCount = () => {
    this.setState({ count: this.state.count + 1 });
  };

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

export default Counter;

장점

  1. 생명주기 메서드
    • 클래스형 컴포넌트는 componentDidMount , componentDidUpdate ,componentWillUnmount 와 같은 생명주기 메서드를 통해 컴포넌트의 상태 변화 및 부수 효과를 세밀히 제어할 수있다.
  2. 명확한 상태 관리
    • this.state , this.setState 를 통해 컴포넌트 상태를 명확히 관리할 수 있으며, 클래스 내부 메서드를 통해 코드가 구조적으로 분리될 수 있다.
  3. 복잡한 어플리케이션에서 유용
    • 대규모 어플리케이션에서 다수의 상태를 세밀히 관리하거나, 초기 데이터 로딩과 같은 복잡한 작업에 적합하다.

3. 함수형 vs 클래스형 컴포넌트 선택

리액트 팀은 함수형 컴포넌트와 훅을 사용하는 것을 권장하고 있으며, 이는 리액트의 미래 방향성을 반영한다. 하지만, 프로젝트 요구 사항에 따라 두 컴포넌트를 선택하는 기준은 달라질 수 있다.

함수형 컴포넌트를 선택해야 할 때

  • 코드의 간결성과 가독성이 중요한 경우
  • 리액트 훅을 활용하여 상태와 생명주기 로직을 재사용하려는 경우
  • 테스트 용이성과 유지보수성이 중요한 경우

클래스형 컴포넌트를 선택해야 할 때

  • 생명주기 메서드를 통해 컴포넌트를 세밀히 제어해야 하는 경우
  • 기존 프로젝트가 클래스형 컴포넌트 기반으로 작성된 경우
  • 상태 관리가 매우 복잡하거나, 특정 데이터 흐름 제어가 필요한 경우

4. 마무리

함수형 컴포넌트와 클래스는 각기 다른 장단점을 제공하며, 프로젝트의 요구사항과 개발자의 선호도에 따라 선택할 수 있다. 하지만 리액트의 최신 트렌드와 미래 방향성을 고려할 때 함수형 컴포넌트와 훅의 사용이 더욱 권장된다.

※ 참조 : freecodecamp - function-component-vs-class-component-in-react

profile
어제보다 더 나은

0개의 댓글