[React] ν¨μ(Function) μ»΄ν¬λνΈ vs ν΄λμ€(Class) μ»΄ν¬λνΈ μ°¨μ΄κ° λκΉμ?
π λ€μ΄κ°λ©°
ν¨μ μ»΄ν¬λνΈ λμ
리μ‘νΈμμ ν¨μ μ»΄ν¬λνΈλ 리μ‘νΈκ° μ²μ μκ²Όμ λλΆν° μμμ§λ§, μ²μμλ μνκ΄λ¦¬λ μλͺ μ£ΌκΈ° λ©μλλ₯Ό μ¬μ©ν μ μμ΄μ μ£Όλ‘ λ¨μν ννμ μν μ©λλ‘ μ¬μ©λμμ΅λλ€.
νμ§λ§, 리μ‘νΈ 16.8 λ²μ μμ Hooksκ° λμ λλ©΄μ ν¨μ μ»΄ν¬λνΈμμλ μνκ΄λ¦¬μ μλͺ μ£ΌκΈ° λ©μλμ μ μ¬ν κΈ°λ₯μ νμ©ν μ μκ² λμμ΅λλ€.
Hooksμ λμ μ ν¨μ μ»΄ν¬λνΈμ νμ© λ²μλ₯Ό ν¬κ² νμ₯μν€κ³ , νμ¬λ ν¨μ μ»΄ν¬λνΈλ§μΌλ‘λ λλΆλΆμ κΈ°λ₯μ ꡬνν μ μκ² λμκ³ , κ·Έ κ²°κ³Ό ν¨μ μ»΄ν¬λνΈμ μ¬μ©μ΄ ν¬κ² λμμ΅λλ€.
μ€μ λ‘ λ¦¬μ‘νΈ κ³΅μλ¬Έμμμλ ν΄λμ€ μ»΄ν¬λνΈλ³΄λ€ ν¨μ μ»΄ν¬λνΈλ‘ μμ±νλ κ²μ κΆμ₯νκ³ μμ΅λλ€.
ν¨μν(Functional)μ΄ μλλΌ ν¨μ(Function) μ»΄ν¬λνΈλΌκ³ λΆλ₯΄λ μ΄μ
ν¨μν νλ‘κ·Έλλ°(Functional Programming)μμ 'ν¨μν'μ΄λΌλ μ©μ΄λ μμ ν¨μ(pure function), λΆλ³μ±(immutability), μ¬μ΄λ μ΄ννΈ μμ(side-effect free) λ±κ³Ό κ°μ νΉμ±μ κ°μ‘°νλλ°, 리μ‘νΈ ν¨μ μ»΄ν¬λνΈλ μμ ν¨μκ° μλκ³ μ¬μ΄λ μ΄ννΈκ° μΌμ΄λλ λ±κ³Ό κ°μ μ΄μ λ‘ λ¦¬μ‘νΈλ 'ν¨μ μ»΄ν¬λνΈ'λΌλ λ§μ΄ μ©μ΄κ° λ μ νν©λλ€.
ν΄λμ€ μ»΄ν¬λνΈμ μ¬μ© κ°μ
- ν¨μ μ»΄ν¬λνΈμ λΉν΄ μλμ μΌλ‘ 볡μ‘ν©λλ€.
- ν΄λμ€ λ¬Έλ², this λ°μΈλ©, μλͺ μ£ΌκΈ° λ©μλ λ±μ μ΄ν΄ν΄μΌ νλ©° μ½λκ° λ κΈΈμ΄μ§λ©΄μ ν¨μ μ»΄ν¬λνΈμ κ°λ μ±μ΄ λΉν΄ λ¨μ΄μ§λλ€.
- ν¨μ μ»΄ν¬λνΈμ λμ λ Hooksλ‘ μΈν΄ ν΄λμ€ μ»΄ν¬λνΈμμλ§ κ°λ₯νλ μνκ΄λ¦¬μ λΌμ΄νμ¬μ΄ν΄κ³Ό μ μ¬ν λμμ μνν μ μμ΅λλ€.
- ν΄λμ€ μ»΄ν¬λνΈλ μΈμ€ν΄μ€λ₯Ό μμ±νκΈ° λλ¬Έμ κ° μΈμ€ν΄μ€λ§λ€ λ©λͺ¨λ¦¬λ₯Ό μ¬μ©ν©λλ€. λ°λ©΄, ν¨μ μ»΄ν¬λνΈλ μΈμ€ν΄μ€λ₯Ό μμ±νμ§ μκΈ° λλ¬Έμ λ©λͺ¨λ¦¬ μ¬μ©λμ΄ μ μ΅λλ€.
- ν΄λμ€ μ»΄ν¬λνΈλ ν΄λμ€μ κ΄λ ¨λ λ€μν λ©μλμ νλ‘ν νμ μ κ°μ§κ³ μμ΄μ, λ²λ€λ§λ κ²°κ³Όλ¬Όμ ν¬κΈ°κ° μ»€μ§ μ μμ΅λλ€. λ°λ©΄, ν¨μ μ»΄ν¬λνΈλ νμν κΈ°λ₯λ§μ Hooksλ‘ κ°μ Έμ μ¬μ©νλ―λ‘ λ²λ€λ§λ κ²°κ³Όλ¬Όμ ν¬κΈ°λ₯Ό μ€μΌ μ μμ΅λλ€.
μ΄λ¬ν μ΄μ λ‘ μ΅κ·Όμλ ν¨μ μ»΄ν¬λνΈλ₯Ό λ μ νΈνλ μΆμΈκ° λμμ΅λλ€.
νμ§λ§, μμ§λ ν΄λμ€ μ»΄ν¬λνΈλ₯Ό μ¬μ©νλ κ²½μ°λ λ§κΈ° λλ¬Έμ ν΄λμ€ μ»΄ν¬λνΈμ λν μ΄ν΄λ μ€μν©λλ€.
ν΄λμ€(Class) μ»΄ν¬λνΈ
ν΄λμ€ μ»΄ν¬λνΈλ ES6μ ν΄λμ€λ₯Ό μ¬μ©νμ¬ μ μλλ©°, μλͺ μ£ΌκΈ° λ©μλλ₯Ό μ¬μ©ν μ μμ΅λλ€.
λν λ΄λΆ μν(state)λ₯Ό κ°μ§ μ μμ΄ λ°μ΄ν° λ³κ²½μ λ°λ₯Έ λ λλ§μ κ΄λ¦¬ν μ μμ΅λλ€.
μλͺ μ£ΌκΈ°(Lfie Cycle)
μλͺ μ£ΌκΈ° λ©μλλ μ»΄ν¬λνΈκ° μμ±, μ λ°μ΄νΈ, μμ λλ κ³Όμ μμ νΉμ μμ μ νΈμΆλλ λ©μλμ λλ€.
- constructor(): μ»΄ν¬λνΈμ μμ±μ λ©μλλ‘, μ»΄ν¬λνΈκ° μμ±λ λ κ°μ₯ λ¨Όμ μ€νλ©λλ€. μ΄κΈ° μνλ₯Ό μ€μ νλ λ± μ»΄ν¬λνΈμ μ΄κΈ°ν μμ μ μνν©λλ€.
- componentDidMount(): μ»΄ν¬λνΈκ° λ λλ§ νμ μ€νλλ λ©μλμ λλ€.
- shouldComponentUpdate(): μ»΄ν¬λνΈκ° μ λ°μ΄νΈλκΈ° μ μ μ€νλλ λ©μλμ λλ€. μ΄ λ©μλκ° falseλ₯Ό λ°ννλ©΄ ν΄λΉ μ λ°μ΄νΈλ μ·¨μλ©λλ€.
- componnetDidUpdate(): μ»΄ν¬λνΈκ° μ λ°μ΄νΈλ νμ μ€νλλ λ©μλμ λλ€.
- componentWillUnmount(): μ»΄ν¬λνΈκ° μ κ±°λκΈ° μ μ μ€νλλ λ©μλμ λλ€.
ν΄λμ€ μ»΄ν¬λνΈμ μ¬μ© μμ
ν΄λμ€ μ»΄ν¬λνΈμ κΈ°λ³Έ ꡬ쑰
import React from "react";
class MyClassComponent extends React.Component {
render() {
return <h1>Hello, World!</h1>;
}
}
export default MyClassComponent;
κ°μ₯ κΈ°λ³Έμ μΈ ν΄λμ€ μ»΄ν¬λνΈμ ꡬ쑰μ λλ€.
React.Componnetλ₯Ό μμλ°μ ν΄λμ€λ₯Ό μ μνκ³ render() λ©μλ μμμ JSXλ₯Ό λ°νν©λλ€.
μν(state)λ₯Ό κ°μ§λ ν΄λμ€ μ»΄ν¬λνΈ
import React from "react";
class MyClassComponent extends React.Component {
constructor(props) {
super(props);
this.state = {
count: 0,
};
}
incrementCount = () => {
this.setState({ count: this.state.count + 1 });
};
render() {
return (
<div>
<p>You clicked {this.state.count} times</p>
<button onClick={this.incrementCount}>Click me</button>
</div>
);
}
}
export default MyClassComponent;
constructor()μμ μ΄κΈ° μνλ₯Ό μ€μ νκ³ , incrementCount λ©μλλ₯Ό ν΅ν΄ μνλ₯Ό λ³κ²½ν©λλ€.
render() λ©μλμμλ μνλ₯Ό νλ©΄μ νμνκ³ , λ²νΌ ν΄λ¦ μ incrementCount λ©μλλ₯Ό νΈμΆνμ¬ μνλ₯Ό λ³κ²½ν©λλ€.
μλͺ μ£ΌκΈ°(Lfie Cycle)λ©μλλ₯Ό μ¬μ©νλ ν΄λμ€ μ»΄ν¬λνΈ
import React from "react";
class MyClassComponent extends React.Component {
constructor(props) {
super(props);
this.state = {
date: new Date(),
};
}
componentDidMount() {
this.timerID = setInterval(() => this.tick(), 1000);
}
componentWillUnmount() {
clearInterval(this.timerID);
}
tick() {
this.setState({
date: new Date(),
});
}
render() {
return <div>νμ¬ μκ°: {this.state.date.toLocaleTimeString()}</div>;
}
}
export default MyClassComponent;
coumpononetDidMount()μμ νμ΄λ¨Έλ₯Ό μ€μ νμ¬ tick() λ©μλλ₯Ό μ£ΌκΈ°μ μΌλ‘ νΈμΆνκ² ν©λλ€.
componentWillMount()μμ νμ΄λ¨Έλ₯Ό μ κ±°ν©λλ€.
ν¨μ(Function) μ»΄ν¬λνΈ
ν¨μ μ»΄ν¬λνΈλ ν¨μλ‘ μ μλλ©°, λ³Έλ μνμ μλͺ μ£ΌκΈ° λ©μλλ₯Ό κ°μ§μ§ μλλ€λ νΉμ§μ κ°μ§κ³ μμμ§λ§ Hooksμ λμ μΌλ‘ μν κ΄λ¦¬μ μλͺ μ£ΌκΈ°μ μ μ¬ν κΈ°λ₯μ κ°μ§ μ μκ² λμμ΅λλ€.
Hooksλ ν¨μ μ»΄ν¬λνΈμμλ μν κ΄λ¦¬μ μλͺ μ£ΌκΈ° κΈ°λ₯μ μ¬μ©ν μ μκ² ν΄μ£Όλ κΈ°λ₯μ λλ€.
λνμ μΌλ‘ useState(), useEffect() λ±μ΄ μμ΅λλ€.
ν¨μ μ»΄ν¬λνΈμ κΈ°λ³Έ ꡬ쑰
import React from 'react';
function MyFunctionComponent() {
return <h1>Hello, World!</h1>;
}
export default MyFunctionComponent;
κ°μ₯ κΈ°λ³Έμ μΈ ν¨μ μ»΄ν¬λνΈμ ꡬ쑰μ λλ€. ν¨μλ₯Ό μ μνκ³ κ·Έ μμμ JSXλ₯Ό λ°νν©λλ€.
ν¨μ μ»΄ν¬λνΈμμ μλͺ μ£ΌκΈ°
ν΄λμ€ μ»΄ν¬λνΈμμ μ¬μ©λ μλͺ μ£ΌκΈ° λ©μλλ€μ΄ ν¨μ μ»΄ν¬λνΈμμλ μ΄λ»κ² λμν κΉμ?
- useState(): μνλ₯Ό μμ±νκ³ κ΄λ¦¬νλ HookμΌλ‘, ν΄λμ€ μ»΄ν¬λνΈμ this.stateμ this.setState()μ ν΄λΉν©λλ€.
- useEffect(): μλͺ μ£ΌκΈ°(Life Cycle)λ₯Ό κ΄λ¦¬νλ HookμΌλ‘, componentDidMount, componentDidUpdate, componentWillUnmountμ μν μ νλλ‘ ν©μΉ κ²μ λλ€.
μ»΄ν¬λνΈ λ§μ΄νΈ / μΈλ§μ΄νΈ μμ μ μ€νλλ useEffect
import React, { useEffect } from 'react';
function MyComponent() {
useEffect(() => {
console.log('Component Did Mount');
return () => {
console.log('Component Will Unmount');
};
}, []); // λΉ λ°°μ΄μ λ£μ΄ λ§μ΄νΈ μμ μλ§ μ€ν
return <div>My Component</div>;
}
export default MyComponent;
νΉμ μνμ λ³κ²½μ κ°μ§νλ useEffect
import React, { useState, useEffect } from 'react';
function MyComponent() {
const [count, setCount] = useState(0);
useEffect(() => {
console.log(`Count has changed to ${count}`);
}, [count]); // countμ λ³κ²½μ κ°μ§
return (
<div>
<p>You clicked {count} times</p>
<button onClick={() => setCount(count + 1)}>Click me</button>
</div>
);
}
export default MyComponent;
π λ§λ¬΄λ¦¬
ν΄λμ€ μ»΄ν¬λνΈμ ν¨μ μ»΄ν¬λνΈλ μ μΈ λ°©μ, μν κ΄λ¦¬ λ°©μ, μλͺ μ£ΌκΈ° λ©μλ μ¬μ© λ°©μ λ±μμ μ°¨μ΄κ° μμ΅λλ€.
ν¨μ μ»΄ν¬λνΈμ Hooksλ ν΄λμ€ μ»΄ν¬λνΈμ λΌμ΄νμ¬μ΄ν΄κ³Ό μν κ΄λ¦¬ λ°©μμ λ¨μννκ³ , κ°λ μ±μ λμ΄κ³ , ν μ€νΈμ μ μ§λ³΄μμμ μ©μ΄ν¨ λ± μ¬λ¬ κ°μ§ μ₯μ μ μ 곡ν©λλ€.
νμ§λ§ μ΄λ° μ₯μ μ μ΅λν νμ©νκΈ° μν΄μλ κΈ°λ³Έμ μΌλ‘ ν΄λμ€ μ»΄ν¬λνΈμ ν΄λΉ μλͺ μ£ΌκΈ°(Life Cycle)κ° μ΄λ»κ² λμνλμ§ μ΄ν΄νλ κ²μ΄ μ€μν©λλ€.
λ°λΌμ, ν΄λμ€ μ»΄ν¬λνΈμ μ΄ν΄λ ν¨μ μ»΄ν¬λνΈμ Hooks μ¬μ©μ μμ΄μ μ€μν κΈ°λ° μ§μμ΄ λ©λλ€.