리액트에서 컴포넌트를 만드는 데에는 두 가지 방법이 있습니다. 각각 함수형 컴포넌트와 클래스형 컴포넌트로 불리는데 오늘은 두가지 컴포넌트들의 특징과 장단점을 살펴보며, 어떤 상황에서 어떤 컴포넌트를 선택해야 하는지 알아보겠습니다.
React.Component
를 상속 받아 생성합니다. render()
메서드를 사용하여 JSX를 반환하는 방식으로 컴포넌트의 렌더링을 정의합니다.class ClassComponent extends React.Component {
constructor(props) {
super(props);
this.state = {
// 초기 상태
};
}
render() {
return (
<div>
{/* JSX */}
</div>
);
}
}
import React, { useState, useEffect } from 'react';
const FunctionalComponent = () => {
const [state, setState] = useState(initialState);
return (
<div>
{/* JSX */}
</div>
);
};
this.state
멤버변수와 this.setState
메서드로 상태관리를 합니다.import React, { Component } from 'react';
class Counter extends Component {
constructor(props) {
super(props);
// 초기 상태 설정
this.state = {
count: 0,
};
}
// 버튼 클릭 시 호출되는 메서드
handleClick = () => {
// 현재 상태를 가져와서 count를 1 증가시킨 후 업데이트
this.setState((prevState) => ({
count: prevState.count + 1,
}));
};
render() {
// 렌더링 시 현재 count 상태를 보여주는 버튼 생성
return (
<div>
<p>클릭 횟수: {this.state.count}</p>
<button onClick={this.handleClick}>클릭하기</button>
</div>
);
}
}
export default Counter;
useState
라는 훅을 가져와서 상태를 관리합니다.import React, { useState } from 'react';
const FunctionalCounter = () => {
// useState 훅을 사용하여 count 상태와 업데이트 함수를 가져옴
const [count, setCount] = useState(0);
// 버튼 클릭 시 count 상태를 업데이트하는 함수
const handleClick = () => {
setCount(count + 1);
};
// 렌더링 시 현재 count 상태를 보여주는 UI를 생성
return (
<div>
<p>클릭 횟수: {count}</p>
<button onClick={handleClick}>클릭하기</button>
</div>
);
};
export default FunctionalCounter;
componentDidMount
나 componentDidUpdate
와 같은 생명주기 메서드를 이용하여 제어할 수 있습니다.class ClassComponent extends React.Component {
constructor(props) {
super(props);
this.state = {
// 초기 상태
};
}
componentDidMount() {
// 컴포넌트가 마운트된 후 실행되는 로직
}
componentDidUpdate(prevProps, prevState) {
// 컴포넌트가 업데이트된 후 실행되는 로직
}
render() {
return (
<div>
{/* JSX */}
</div>
);
}
}
useEffect
훅을 이용하여 라이프 사이클을 제어할 수 있습니다.import React, { useState, useEffect } from 'react';
const FunctionalComponentWithHooks = () => {
const [state, setState] = useState(initialState);
useEffect(() => {
// 생명주기 메서드 역할
return () => {
// 컴포넌트가 업데이트된 후 실행되는 로직 주로 자원의 반환
};
}, [dependencies]);
return (
<div>
{/* JSX */}
</div>
);
};
함수형 컴포넌트와 클래스형 컴포넌트는 각각의 특징과 장단점을 가지고 있습니다. 최근에는 함수형 컴포넌트와 Hooks를 주로 사용하는 추세이며, 함수형 프로그래밍의 장점과 리액트의 진화에 따라 함수형 컴포넌트가 더 많이 활용되고 있습니다. 개발자는 상황에 따라 적절한 컴포넌트 형식을 선택하여 사용해야 합니다.