Using the Effect Hook
These docs are old and wonโt be updated. Go to react.dev for the new React docs.
These new documentation pages teach modern React and include live examples:
Hooks๋ React 16.8๋ฒ์ ์ ์๋ก ์ถ๊ฐ๋์์ต๋๋ค. Hook์ ํด๋์ค ์ปดํฌ๋ํธ๋ฅผ ์์ฑํ์ง ์์๋ state์ ๊ฐ์ ํน์ง๋ค์ ์ฌ์ฉํ ์ ์์ต๋๋ค.
Effect Hook์ ์ฌ์ฉํ๋ฉด ํจ์ ์ปดํฌ๋ํธ์์ side effect๋ฅผ ์ํํ ์ ์์ต๋๋ค.
import React, { useState, useEffect } from 'react';
function Example() {
const [count, setCount] = useState(0);
// componentDidMount, componentDidUpdate์ ๊ฐ์ ๋ฐฉ์์ผ๋ก useEffect(() => { // ๋ธ๋ผ์ฐ์ API๋ฅผ ์ด์ฉํ์ฌ ๋ฌธ์ ํ์ดํ์ ์
๋ฐ์ดํธํฉ๋๋ค. document.title = `You clicked ${count} times`; });
return (
<div>
<p>You clicked {count} times</p>
<button onClick={() => setCount(count + 1)}>
Click me
</button>
</div>
);
}
์์ ์ฝ๋๋ ์ด์ ํ์ด์ง์ ์นด์ดํฐ ์์๋ฅผ ๋ฐํ์ผ๋ก ํ์ง๋ง, ๋ฌธ์์ ํ์ดํ์ ํด๋ฆญ ํ์๊ฐ ํฌํจ๋ ๋ฌธ์ฅ์ผ๋ก ํํํ ์ ์๋๋ก ์๋ก์ด ๊ธฐ๋ฅ์ ๋ํ์ต๋๋ค.
๋ฐ์ดํฐ ๊ฐ์ ธ์ค๊ธฐ, ๊ตฌ๋ (subscription) ์ค์ ํ๊ธฐ, ์๋์ผ๋ก React ์ปดํฌ๋ํธ์ DOM์ ์์ ํ๋ ๊ฒ๊น์ง ์ด ๋ชจ๋ ๊ฒ์ด side effects์ ๋๋ค. ์ด๋ฐ ๊ธฐ๋ฅ๋ค(operations)์ side effect(ํน์ effect)๋ผ ๋ถ๋ฅด๋ ๊ฒ์ด ์ต์ํ์ง ์์ ์๋ ์์ง๋ง, ์๋ง๋ ์ด์ ์ ๋ง๋ค์๋ ์ปดํฌ๋ํธ์์ ์์ ๊ธฐ๋ฅ๋ค์ ๊ตฌํํด๋ณด์์ ๊ฒ์ ๋๋ค.
ํ
React์ class ์๋ช ์ฃผ๊ธฐ ๋ฉ์๋์ ์น์ํ๋ค๋ฉด,
useEffect
Hook์componentDidMount
์componentDidUpdate
,componentWillUnmount
๊ฐ ํฉ์ณ์ง ๊ฒ์ผ๋ก ์๊ฐํด๋ ์ข์ต๋๋ค.
React ์ปดํฌ๋ํธ์๋ ์ผ๋ฐ์ ์ผ๋ก ๋ ์ข ๋ฅ์ side effects๊ฐ ์์ต๋๋ค. ์ ๋ฆฌ(clean-up)๊ฐ ํ์ํ ๊ฒ๊ณผ ๊ทธ๋ ์ง ์์ ๊ฒ. ์ด ๋์ ์ด๋ป๊ฒ ๊ตฌ๋ถํด์ผ ํ ์ง ์์ธํ๊ฒ ์์๋ด ์๋ค.
์ ๋ฆฌ(Clean-up)๋ฅผ ์ด์ฉํ์ง ์๋ Effects
React๊ฐ DOM์ ์ ๋ฐ์ดํธํ ๋ค ์ถ๊ฐ๋ก ์ฝ๋๋ฅผ ์คํํด์ผ ํ๋ ๊ฒฝ์ฐ๊ฐ ์์ต๋๋ค. ๋คํธ์ํฌ ๋ฆฌํ์คํธ, DOM ์๋ ์กฐ์, ๋ก๊น ๋ฑ์ ์ ๋ฆฌ(clean-up)๊ฐ ํ์ ์๋ ๊ฒฝ์ฐ๋ค์ ๋๋ค. ์ด๋ฌํ ์๋ค์ ์คํ ์ดํ ์ ๊ฒฝ ์ธ ๊ฒ์ด ์๊ธฐ ๋๋ฌธ์ ๋๋ค. class์ hook์ด ์ด๋ฌํ side effects๋ฅผ ์ด๋ป๊ฒ ๋ค๋ฅด๊ฒ ๊ตฌํํ๋์ง ๋น๊ตํด๋ด ์๋ค.
Class๋ฅผ ์ฌ์ฉํ๋ ์์
React์ class ์ปดํฌ๋ํธ์์ render
๋ฉ์๋ ๊ทธ ์์ฒด๋ side effect๋ฅผ ๋ฐ์์ํค์ง ์์ต๋๋ค. ์ด๋๋ ์์ง ์ด๋ฅธ ์๊ธฐ๋ก์ ์ด๋ฌํ effect๋ฅผ ์ํํ๋ ๊ฒ์ React๊ฐ DOM์ ์
๋ฐ์ดํธํ๊ณ ๋ ์ดํ์
๋๋ค.
React class์์ side effect๋ฅผ componentDidMount
์ componentDidUpdate
์ ๋๋ ๊ฒ์ด ๋ฐ๋ก ์ด ๋๋ฌธ์
๋๋ค. ์์๋ก ๋์์์ React๊ฐ DOM์ ๋ฐ๊พธ๊ณ ๋ ๋ค ๋ฌธ์ ํ์ดํ์ ์
๋ฐ์ดํธํ๋ React counter ํด๋์ค ์ปดํฌ๋ํธ๋ฅผ ๋ด
์๋ค.
class Example extends React.Component {
constructor(props) {
super(props);
this.state = {
count: 0
};
}
componentDidMount() { document.title = `You clicked ${this.state.count} times`; } componentDidUpdate() { document.title = `You clicked ${this.state.count} times`; }
render() {
return (
<div>
<p>You clicked {this.state.count} times</p>
<button onClick={() => this.setState({ count: this.state.count + 1 })}>
Click me
</button>
</div>
);
}
}
์ ์ฝ๋์์ class ์์ ๋ ๊ฐ์ ์๋ช ์ฃผ๊ธฐ ๋ฉ์๋์ ๊ฐ์ ์ฝ๋๊ฐ ์ค๋ณต๋๋ ๊ฒ์ ์ฃผ์ํฉ์๋ค
์ด๋ ์ปดํฌ๋ํธ๊ฐ ์ด์ ๋ง ๋ง์ดํธ๋ ๋จ๊ณ์ธ์ง ์๋๋ฉด ์ ๋ฐ์ดํธ๋๋ ๊ฒ์ธ์ง์ ์๊ด์์ด ๊ฐ์ side effect๋ฅผ ์ํํด์ผ ํ๊ธฐ ๋๋ฌธ์ ๋๋ค. ๊ฐ๋ ์ ์ผ๋ก ๋ ๋๋ง ์ดํ์๋ ํญ์ ๊ฐ์ ์ฝ๋๊ฐ ์ํ๋๊ธฐ๋ฅผ ๋ฐ๋ผ๋ ๊ฒ์ด์ฃ . ํ์ง๋ง React ํด๋์ค ์ปดํฌ๋ํธ๋ ๊ทธ๋ฌํ ๋ฉ์๋๋ฅผ ๊ฐ์ง๊ณ ์์ง ์์ต๋๋ค. ํจ์๋ฅผ ๋ณ๊ฐ์ ๋ฉ์๋๋ก ๋ฝ์๋ธ๋ค๊ณ ํด๋ ์ฌ์ ํ ๋ ์ฅ์์์ ํจ์๋ฅผ ๋ถ๋ฌ๋ด์ผ ํฉ๋๋ค.
์ด์ useEffect
Hook์์ ๊ฐ์ ๊ธฐ๋ฅ์ ์ด๋ป๊ฒ ๊ตฌํํ๋์ง ๋ณด๊ฒ ์ต๋๋ค.
Hook์ ์ด์ฉํ๋ ์์
์๋์ ์ฝ๋๋ ์์์ ์ด๋ฏธ ๋ณด์๋ ๊ฒ์ด์ง๋ง ์ด๋ฒ์๋ ์ข ๋ ์์ธํ ์ดํด๋ณด๊ฒ ์ต๋๋ค.
import React, { useState, useEffect } from 'react';
function Example() {
const [count, setCount] = useState(0);
useEffect(() => { document.title = `You clicked ${count} times`; });
return (
<div>
<p>You clicked {count} times</p>
<button onClick={() => setCount(count + 1)}>
Click me
</button>
</div>
);
}
useEffect
๊ฐ ํ๋ ์ผ์ ๋ฌด์์ผ๊น์? useEffect Hook์ ์ด์ฉํ์ฌ ์ฐ๋ฆฌ๋ React์๊ฒ ์ปดํฌ๋ํธ๊ฐ ๋ ๋๋ง ์ดํ์ ์ด๋ค ์ผ์ ์ํํด์ผํ๋ ์ง๋ฅผ ๋งํฉ๋๋ค. React๋ ์ฐ๋ฆฌ๊ฐ ๋๊ธด ํจ์๋ฅผ ๊ธฐ์ตํ๋ค๊ฐ(์ด ํจ์๋ฅผ โeffectโ๋ผ๊ณ ๋ถ๋ฆ
๋๋ค) DOM ์
๋ฐ์ดํธ๋ฅผ ์ํํ ์ดํ์ ๋ถ๋ฌ๋ผ ๊ฒ์
๋๋ค. ์์ ๊ฒฝ์ฐ์๋ effect๋ฅผ ํตํด ๋ฌธ์ ํ์ดํ์ ์ง์ ํ์ง๋ง, ์ด ์ธ์๋ ๋ฐ์ดํฐ๋ฅผ ๊ฐ์ ธ์ค๊ฑฐ๋ ๋ค๋ฅธ ๋ช
๋ นํ(imperative) API๋ฅผ ๋ถ๋ฌ๋ด๋ ์ผ๋ ํ ์ ์์ต๋๋ค.
useEffect
๋ฅผ ์ปดํฌ๋ํธ ์์์ ๋ถ๋ฌ๋ด๋ ์ด์ ๋ ๋ฌด์์ผ๊น์? useEffect
๋ฅผ ์ปดํฌ๋ํธ ๋ด๋ถ์ ๋ ์ผ๋ก์จ effect๋ฅผ ํตํด count
state ๋ณ์(๋๋ ๊ทธ ์ด๋ค prop์๋)์ ์ ๊ทผํ ์ ์๊ฒ ๋ฉ๋๋ค. ํจ์ ๋ฒ์ ์์ ์กด์ฌํ๊ธฐ ๋๋ฌธ์ ํน๋ณํ API ์์ด๋ ๊ฐ์ ์ป์ ์ ์๋ ๊ฒ์
๋๋ค. Hook์ ์๋ฐ์คํฌ๋ฆฝํธ์ ํด๋ก์ ๋ฅผ ์ด์ฉํ์ฌ React์ ํ์ ๋ API๋ฅผ ๊ณ ์ํ๋ ๊ฒ๋ณด๋ค ์๋ฐ์คํฌ๋ฆฝํธ๊ฐ ์ด๋ฏธ ๊ฐ์ง๊ณ ์๋ ๋ฐฉ๋ฒ์ ์ด์ฉํ์ฌ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํฉ๋๋ค.
useEffect
๋ ๋ ๋๋ง ์ดํ์ ๋งค๋ฒ ์ํ๋๋ ๊ฑธ๊น์? ๋ค, ๊ธฐ๋ณธ์ ์ผ๋ก ์ฒซ๋ฒ์งธ ๋ ๋๋ง๊ณผ ์ดํ์ ๋ชจ๋ ์
๋ฐ์ดํธ์์ ์ํ๋ฉ๋๋ค.(๋์ค์ effect๋ฅผ ํ์์ ๋ง๊ฒ ์์ ํ๋ ๋ฐฉ๋ฒ์ ๋ํด ๋ค๋ฃฐ ๊ฒ์
๋๋ค.) ๋ง์ดํ
๊ณผ ์
๋ฐ์ดํธ๋ผ๋ ๋ฐฉ์์ผ๋ก ์๊ฐํ๋ ๋์ effect๋ฅผ ๋ ๋๋ง ์ดํ์ ๋ฐ์ํ๋ ๊ฒ์ผ๋ก ์๊ฐํ๋ ๊ฒ์ด ๋ ์ฌ์ธ ๊ฒ์
๋๋ค. React๋ effect๊ฐ ์ํ๋๋ ์์ ์ ์ด๋ฏธ DOM์ด ์
๋ฐ์ดํธ๋์์์ ๋ณด์ฅํฉ๋๋ค.
์์ธํ ์ค๋ช
effect์ ๋ํด ์ข ๋ ์์๋ณด์์ผ๋ ์๋์ ์ฝ๋๋ค์ ๋ ์ฝ๊ฒ ์ดํดํ ์ ์์ ๊ฒ์ ๋๋ค.
function Example() {
const [count, setCount] = useState(0);
useEffect(() => {
document.title = `You clicked ${count} times`;
});
}
count
state ๋ณ์๋ฅผ ์ ์ธํ ๋ค React์๊ฒ effect๋ฅผ ์ฌ์ฉํจ์ ๋งํ๊ณ ์์ต๋๋ค. useEffect
Hook์ ํจ์๋ฅผ ์ ๋ฌํ๊ณ ์๋๋ฐ ์ด ํจ์๊ฐ ๋ฐ๋ก effect์
๋๋ค. ์ด effect ๋ด๋ถ์์ document.title
์ด๋ผ๋ ๋ธ๋ผ์ฐ์ API๋ฅผ ์ด์ฉํ์ฌ ๋ฌธ์ ํ์ดํ์ ์ง์ ํฉ๋๋ค. ๊ฐ์ ํจ์ ๋ด๋ถ์ ์๊ธฐ ๋๋ฌธ์ ์ต์ ์ count
๋ฅผ ๋ฐ๋ก ์ป์ ์ ์์ต๋๋ค. ์ปดํฌ๋ํธ๋ฅผ ๋ ๋๋งํ ๋ React๋ ์ฐ๋ฆฌ๊ฐ ์ด์ฉํ effect๋ฅผ ๊ธฐ์ตํ์๋ค๊ฐ DOM์ ์
๋ฐ์ดํธํ ์ดํ์ ์คํํฉ๋๋ค. ์ด๋ ๋งจ ์ฒซ ๋ฒ์งธ ๋ ๋๋ง์ ๋ฌผ๋ก ๊ทธ ์ดํ์ ๋ชจ๋ ๋ ๋๋ง์ ๋๊ฐ์ด ์ ์ฉ๋ฉ๋๋ค.
์๋ จ๋ ์๋ฐ์คํฌ๋ฆฝํธ ๊ฐ๋ฐ์๋ผ๋ฉด useEffect
์ ์ ๋ฌ๋ ํจ์๊ฐ ๋ชจ๋ ๋ ๋๋ง์์ ๋ค๋ฅด๋ค๋ ๊ฒ์ ์์์ฑ์์ง๋ ๋ชจ๋ฆ
๋๋ค. ์ด๋ ์๋๋ ๊ฒ์ผ๋ก์, count
๊ฐ์ด ์ ๋๋ก ์
๋ฐ์ดํธ ๋๋์ง์ ๋ํ ๊ฑฑ์ ์์ด effect ๋ด๋ถ์์ ๊ทธ ๊ฐ์ ์ฝ์ ์ ์๊ฒ ํ๋ ๋ถ๋ถ์ด๊ธฐ๋ ํฉ๋๋ค. ๋ฆฌ๋ ๋๋งํ๋ ๋๋ง๋ค ๋ชจ๋ ์ด์ ๊ณผ ๋ค๋ฅธ effect๋ก ๊ต์ฒดํ์ฌ ์ ๋ฌํฉ๋๋ค. ์ด ์ ์ด ๋ ๋๋ง์ ๊ฒฐ๊ณผ์ ํ ๋ถ๋ถ์ด ๋๊ฒ ๋ง๋๋ ์ ์ธ๋ฐ, ๊ฐ๊ฐ์ effect๋ ํน์ ํ ๋ ๋๋ง์ ์ํฉ๋๋ค. ์ด ํ์ด์ง์ ๋ท๋ถ๋ถ์์ ์ด๊ฒ์ด ์ ์ ์ฉํ์ง์ ๋ํด์ ๋ ์์ธํ ๋ค๋ฃฐ ๊ฒ์
๋๋ค.
ํ
componentDidMount
ํน์componentDidUpdate
์๋ ๋ฌ๋ฆฌuseEffect
์์ ์ฌ์ฉ๋๋ effect๋ ๋ธ๋ผ์ฐ์ ๊ฐ ํ๋ฉด์ ์ ๋ฐ์ดํธํ๋ ๊ฒ์ ์ฐจ๋จํ์ง ์์ต๋๋ค. ์ด๋ฅผ ํตํด ์ ํ๋ฆฌ์ผ์ด์ ์ ๋ฐ์์ฑ์ ํฅ์ํด์ค๋๋ค. ๋๋ถ๋ถ์ effect๋ ๋๊ธฐ์ ์ผ๋ก ์คํ๋ ํ์๊ฐ ์์ต๋๋ค. ํํ์ง๋ ์์ง๋ง (๋ ์ด์์์ ์ธก์ ๊ณผ ๊ฐ์) ๋๊ธฐ์ ์คํ์ด ํ์ํ ๊ฒฝ์ฐ์๋useEffect
์ ๋์ผํ API๋ฅผ ์ฌ์ฉํ๋useLayoutEffect
๋ผ๋ ๋ณ๋์ Hook์ด ์กด์ฌํฉ๋๋ค.
์ ๋ฆฌ(clean-up)๋ฅผ ์ด์ฉํ๋ Effects
์์์ ์ ๋ฆฌ(clean-up)๊ฐ ํ์ํ์ง ์์ side effect๋ฅผ ๋ณด์์ง๋ง, ์ ๋ฆฌ(clean-up)๊ฐ ํ์ํ effect๋ ์์ต๋๋ค. ์ธ๋ถ ๋ฐ์ดํฐ์ ๊ตฌ๋ (subscription)์ ์ค์ ํด์ผ ํ๋ ๊ฒฝ์ฐ๋ฅผ ์๊ฐํด๋ณด๊ฒ ์ต๋๋ค. ์ด๋ฐ ๊ฒฝ์ฐ์ ๋ฉ๋ชจ๋ฆฌ ๋์๊ฐ ๋ฐ์ํ์ง ์๋๋ก ์ ๋ฆฌ(clean-up)ํ๋ ๊ฒ์ ๋งค์ฐ ์ค์ํฉ๋๋ค. class์ Hook์ ์ฌ์ฉํ๋ ๋ ๊ฒฝ์ฐ๋ฅผ ๋น๊ตํด๋ณด๊ฒ ์ต๋๋ค.
Class๋ฅผ ์ฌ์ฉํ๋ ์์
React class์์๋ ํํ componentDidMount
์ ๊ตฌ๋
(subscription)์ ์ค์ ํ ๋ค componentWillUnmount
์์ ์ด๋ฅผ ์ ๋ฆฌ(clean-up)ํฉ๋๋ค. ์น๊ตฌ์ ์จ๋ผ์ธ ์ํ๋ฅผ ๊ตฌ๋
ํ ์ ์๋ ChatAPI ๋ชจ๋์ ์๋ฅผ ๋ค์ด๋ณด๊ฒ ์ต๋๋ค. ๋ค์์ class๋ฅผ ์ด์ฉํ์ฌ ์ํ๋ฅผ ๊ตฌ๋
(subscribe)ํ๊ณ ๋ณด์ฌ์ฃผ๋ ์ฝ๋์
๋๋ค.
class FriendStatus extends React.Component {
constructor(props) {
super(props);
this.state = { isOnline: null };
this.handleStatusChange = this.handleStatusChange.bind(this);
}
componentDidMount() { ChatAPI.subscribeToFriendStatus( this.props.friend.id, this.handleStatusChange ); } componentWillUnmount() { ChatAPI.unsubscribeFromFriendStatus( this.props.friend.id, this.handleStatusChange ); } handleStatusChange(status) { this.setState({ isOnline: status.isOnline }); }
render() {
if (this.state.isOnline === null) {
return 'Loading...';
}
return this.state.isOnline ? 'Online' : 'Offline';
}
}
componentDidMount
์ componentWillUnmount
๊ฐ ์ด๋ป๊ฒ ๋์นญ์ ์ด๋ฃจ๊ณ ์๋์ง๋ฅผ ๋ด
์๋ค. ๋ ๊ฐ์ ๋ฉ์๋ ๋ด์ ๊ฐ๋
์ ๋๊ฐ์ effect์ ๋ํ ์ฝ๋๊ฐ ์์์๋ ๋ถ๊ตฌํ๊ณ ์๋ช
์ฃผ๊ธฐ ๋ฉ์๋๋ ์ด๋ฅผ ๋ถ๋ฆฌํ๊ฒ ๋ง๋ญ๋๋ค.
์ฃผ์
๋์ฐ๋ฏธ๊ฐ ์ข์ ๋ ์๋ค์ ์ด ์์๊ฐ ์์ ํ๊ธฐ ์ํด์๋
componentDidUpdate
๊ฐ ํ์ํ๋ค๋ ๊ฒ์ ๋์น์ฑ์ ๊ฒ์ ๋๋ค. ์ด์ ๋ํด์๋ ๋ค์ ์น์ ์์ ๋ค๋ฃฐ ๊ฒ์ ๋๋ค.
Hook์ ์ด์ฉํ๋ ์์
์ด์ ์ด ์ปดํฌ๋ํธ๋ฅผ Hook์ ์ด์ฉํ์ฌ ๊ตฌํํด๋ด ์๋ค.
์ ๋ฆฌ(clean-up)์ ์คํ์ ์ํด ๋ณ๊ฐ์ effect๊ฐ ํ์ํ๋ค๊ณ ์๊ฐํ ์๋ ์์ต๋๋ค. ํ์ง๋ง ๊ตฌ๋ (subscription)์ ์ถ๊ฐ์ ์ ๊ฑฐ๋ฅผ ์ํ ์ฝ๋๋ ๊ฒฐํฉ๋๊ฐ ๋๊ธฐ ๋๋ฌธ์ useEffect๋ ์ด๋ฅผ ํจ๊ป ๋ค๋ฃจ๋๋ก ๊ณ ์๋์์ต๋๋ค. effect๊ฐ ํจ์๋ฅผ ๋ฐํํ๋ฉด React๋ ๊ทธ ํจ์๋ฅผ ์ ๋ฆฌ๊ฐ ํ์ํ ๋์ ์คํ์ํฌ ๊ฒ์ ๋๋ค.
import React, { useState, useEffect } from 'react';
function FriendStatus(props) {
const [isOnline, setIsOnline] = useState(null);
useEffect(() => { function handleStatusChange(status) { setIsOnline(status.isOnline); } ChatAPI.subscribeToFriendStatus(props.friend.id, handleStatusChange); // effect ์ดํ์ ์ด๋ป๊ฒ ์ ๋ฆฌ(clean-up)ํ ๊ฒ์ธ์ง ํ์ํฉ๋๋ค. return function cleanup() { ChatAPI.unsubscribeFromFriendStatus(props.friend.id, handleStatusChange); }; });
if (isOnline === null) {
return 'Loading...';
}
return isOnline ? 'Online' : 'Offline';
}
effect์์ ํจ์๋ฅผ ๋ฐํํ๋ ์ด์ ๋ ๋ฌด์์ผ๊น์? ์ด๋ effect๋ฅผ ์ํ ์ถ๊ฐ์ ์ธ ์ ๋ฆฌ(clean-up) ๋ฉ์ปค๋์ฆ์ ๋๋ค. ๋ชจ๋ effect๋ ์ ๋ฆฌ๋ฅผ ์ํ ํจ์๋ฅผ ๋ฐํํ ์ ์์ต๋๋ค. ์ด ์ ์ด ๊ตฌ๋ (subscription)์ ์ถ๊ฐ์ ์ ๊ฑฐ๋ฅผ ์ํ ๋ก์ง์ ๊ฐ๊น์ด ๋ฌถ์ด๋ ์ ์๊ฒ ํฉ๋๋ค. ๊ตฌ๋ (subscription)์ ์ถ๊ฐ์ ์ ๊ฑฐ๊ฐ ๋ชจ๋ ํ๋์ effect๋ฅผ ๊ตฌ์ฑํ๋ ๊ฒ์ ๋๋ค.
React๊ฐ effect๋ฅผ ์ ๋ฆฌ(clean-up)ํ๋ ์์ ์ ์ ํํ ์ธ์ ์ผ๊น์? React๋ ์ปดํฌ๋ํธ๊ฐ ๋ง์ดํธ ํด์ ๋๋ ๋์ ์ ๋ฆฌ(clean-up)๋ฅผ ์คํํฉ๋๋ค. ํ์ง๋ง ์์ ์์์์ ๋ณด์๋ฏ์ด effect๋ ํ๋ฒ์ด ์๋๋ผ ๋ ๋๋ง์ด ์คํ๋๋ ๋๋ง๋ค ์คํ๋ฉ๋๋ค. React๊ฐ ๋ค์ ์ฐจ๋ก์ effect๋ฅผ ์คํํ๊ธฐ ์ ์ ์ด์ ์ ๋ ๋๋ง์์ ํ์๋ effect ๋ํ ์ ๋ฆฌํ๋ ์ด์ ๊ฐ ๋ฐ๋ก ์ด ๋๋ฌธ์ ๋๋ค. ์ด๊ฒ์ด ๋ฒ๊ทธ๋ฅผ ๋ฐฉ์งํ๋ ๋ฐ์ ์ด๋ป๊ฒ ๋์์ด ๋๋์ง ๊ทธ๋ฆฌ๊ณ ์ฑ๋ฅ ์ ํ ๋ฌธ์ ๊ฐ ๋ฐ์ํ ๊ฒฝ์ฐ effect๋ฅผ ๊ฑด๋๋ฐ๋ ๋ฐฉ๋ฒ์ ๋ํด์ ์ด๋ค์์ผ๋ก ๋ ผ์ํด๋ด ์๋ค.
์ฃผ์
effect์์ ๋ฐ๋์ ์ ๋ช ํจ์(named function)๋ฅผ ๋ฐํํด์ผ ํ๋ ๊ฒ์ ์๋๋๋ค. ๋ชฉ์ ์ ๋ถ๋ช ํ ํ๊ธฐ ์ํด
์ ๋ฆฌ(clean-up)
๋ผ๊ณ ๋ถ๋ฅด๊ณ ์์ง๋ง ํ์ดํ ํจ์๋ฅผ ๋ฐํํ๊ฑฐ๋ ๋ค๋ฅธ ์ด๋ฆ์ผ๋ก ๋ถ๋ฌ๋ ๋ฌด๋ฐฉํฉ๋๋ค.
์์ฝ
useEffect
๊ฐ ์ปดํฌ๋ํธ์ ๋ ๋๋ง ์ดํ์ ๋ค์ํ side effects๋ฅผ ํํํ ์ ์์์ ์์์ ๋ฐฐ์ ์ต๋๋ค. effect์ ์ ๋ฆฌ(clean-up)๊ฐ ํ์ํ ๊ฒฝ์ฐ์๋ ํจ์๋ฅผ ๋ฐํํฉ๋๋ค.
useEffect(() => {
function handleStatusChange(status) {
setIsOnline(status.isOnline);
}
ChatAPI.subscribeToFriendStatus(props.friend.id, handleStatusChange);
return () => {
ChatAPI.unsubscribeFromFriendStatus(props.friend.id, handleStatusChange);
};
});
์ ๋ฆฌ(clean-up)๊ฐ ํ์์๋ ๊ฒฝ์ฐ์๋ ์ด๋ค ๊ฒ๋ ๋ฐํํ์ง ์์ต๋๋ค.
useEffect(() => {
document.title = `You clicked ${count} times`;
});
์ด์ฒ๋ผ effect Hook์ ๋ ๊ฐ์ง ๊ฒฝ์ฐ๋ฅผ ํ ๊ฐ์ API๋ก ํตํฉํฉ๋๋ค.
effect hook์ด ์ด๋ป๊ฒ ์๋ํ๋์ง์ ๋ํด ์ถฉ๋ถํ ์ดํดํ๊ฑฐ๋, ๋ด์ฉ์ด ์ดํดํ๊ธฐ ์ด๋ ต๋ค๊ณ ์๊ฐ๋๋ค๋ฉด ๋ค์ ํ์ด์ง์ Hook์ ๊ท์น๋ก ๋์ด๊ฐ๋ ์ข์ต๋๋ค.
effect๋ฅผ ์ด์ฉํ๋ ํ
์ด์ ์๋ จ๋ React ์ฌ์ฉ์๋ค์ด๋ผ๋ฉด ๋ณด๋ค ๊ถ๊ธํดํ useEffect
์ ๋ํด ์ข ๋ ๊น์ด ์์๋ณด๊ฒ ์ต๋๋ค. ์ด ๋ถ๋ถ์ ์ง๊ธ ๋ฐ๋ก ์ฝ์ด์ผ ํ๋ ๊ฒ์ ์๋๋ฉฐ, ์ธ์ ๋ผ๋ effect hook์ ์์ธํ ์ดํด๊ฐ ํ์ํ ๋ ๋์์์ ์ฝ์ด๋ ์ข์ต๋๋ค.
ํ: ๊ด์ฌ์ฌ๋ฅผ ๊ตฌ๋ถํ๋ ค๊ณ ํ๋ค๋ฉด Multiple Effect๋ฅผ ์ฌ์ฉํฉ๋๋ค
Hook์ด ํ์ํ ๋๊ธฐ๊ฐ ๋ ๋ฌธ์ ์ค์ ํ๋๊ฐ ์๋ช ์ฃผ๊ธฐ class ๋ฉ์๋๊ฐ ๊ด๋ จ์ด ์๋ ๋ก์ง๋ค์ ๋ชจ์๋๊ณ , ๊ด๋ จ์ด ์๋ ๋ก์ง๋ค์ ์ฌ๋ฌ ๊ฐ์ ๋ฉ์๋์ ๋๋์ด ๋๋ ๊ฒฝ์ฐ๊ฐ ์์ฃผ ์๋ค๋ ๊ฒ์ ๋๋ค. ์ด์ ์ ์์์์๋ ๋ณด์๋ ์นด์ดํฐ์ ์น๊ตฌ์ ์ํ ์งํ ๋ก์ง์ ๊ฒฐํฉํ ์ปดํฌ๋ํธ๋ฅผ ๋ณด๊ฒ ์ต๋๋ค.
class FriendStatusWithCounter extends React.Component {
constructor(props) {
super(props);
this.state = { count: 0, isOnline: null };
this.handleStatusChange = this.handleStatusChange.bind(this);
}
componentDidMount() {
document.title = `You clicked ${this.state.count} times`;
ChatAPI.subscribeToFriendStatus(
this.props.friend.id,
this.handleStatusChange
);
}
componentDidUpdate() {
document.title = `You clicked ${this.state.count} times`;
}
componentWillUnmount() {
ChatAPI.unsubscribeFromFriendStatus(
this.props.friend.id,
this.handleStatusChange
);
}
handleStatusChange(status) {
this.setState({
isOnline: status.isOnline
});
}
// ...
document.title
์ ์ค์ ํ๋ ๋ก์ง์ด componentDidMount
์ componentDidUpdate
์ ๋๋์ด์ ธ ์์ต๋๋ค. ๊ตฌ๋
(subscription)๋ก์ง ๋ํ componentDidMount
์ componentWillUnmount
์ ๋๋์ด์ ธ ์๋ค์. componentDidMount
๊ฐ ๋ ๊ฐ์ง์ ์์
์ ์ํ ์ฝ๋๋ฅผ ๋ชจ๋ ๊ฐ์ง๊ณ ์์ต๋๋ค.
Hook์ ์ด์ฉํ์ฌ ์ด ๋ฌธ์ ๋ฅผ ์ด๋ป๊ฒ ํด๊ฒฐํ ์ ์์๊น์? State Hook์ ์ฌ๋ฌ ๋ฒ ์ฌ์ฉํ ์ ์๋ ๊ฒ์ฒ๋ผ effect ๋ํ ์ฌ๋ฌ ๋ฒ ์ฌ์ฉํ ์ ์์ต๋๋ค. Effect๋ฅผ ์ด์ฉํ์ฌ ์๋ก ๊ด๋ จ์ด ์๋ ๋ก์ง๋ค์ ๊ฐ๋ผ๋์ ์ ์์ต๋๋ค.
function FriendStatusWithCounter(props) {
const [count, setCount] = useState(0);
useEffect(() => { document.title = `You clicked ${count} times`;
});
const [isOnline, setIsOnline] = useState(null);
useEffect(() => { function handleStatusChange(status) {
setIsOnline(status.isOnline);
}
ChatAPI.subscribeToFriendStatus(props.friend.id, handleStatusChange);
return () => {
ChatAPI.unsubscribeFromFriendStatus(props.friend.id, handleStatusChange);
};
});
// ...
}
Hook์ ์ด์ฉํ๋ฉด ์๋ช ์ฃผ๊ธฐ ๋ฉ์๋์ ๋ฐ๋ผ์๊ฐ ์๋๋ผ ์ฝ๋๊ฐ ๋ฌด์์ ํ๋์ง์ ๋ฐ๋ผ ๋๋ ์๊ฐ ์์ต๋๋ค. React๋ ์ปดํฌ๋ํธ์ ์ฌ์ฉ๋ ๋ชจ๋ effect๋ฅผ ์ง์ ๋ ์์์ ๋ง์ถฐ ์ ์ฉํฉ๋๋ค.
์ค๋ช : effect๊ฐ ์ ๋ฐ์ดํธ ์๋ง๋ค ์คํ๋๋ ์ด์
class์ ์ต์ํ๋ค๋ฉด ์ effect ์ ๋ฆฌ(clean-up)๊ฐ ๋ง์ดํธ ํด์ ๋๋ ๋์ ํ๋ฒ๋ง์ด ์๋๋ผ ๋ชจ๋ ๋ฆฌ๋ ๋๋ง ์์ ์คํ๋๋์ง๊ฐ ๊ถ๊ธํ ๊ฒ์ ๋๋ค. ์ด๋ฌํ ๋์์ธ์ด ๋ฒ๊ทธ๊ฐ ์ ์ ์ปดํฌ๋ํธ๋ฅผ ๋ง๋๋ ๋ฐ์ ์ด๋ป๊ฒ ๋์์ด ๋๋์ง ๋ค์์ ์์๋ฅผ ํตํด ์์๋ด ์๋ค.
์ด ํ์ด์ง์ ์์์ ๋ดค๋ ์น๊ตฌ๊ฐ ์จ๋ผ์ธ์ธ์ง ์๋์ง ํ์ํ๋ FriendStatus
์ปดํฌ๋ํธ ์์๋ฅผ ์๊ฐํด๋ด
์๋ค. class๋ this.props
๋ก๋ถํฐ friend.id
๋ฅผ ์ฝ์ด๋ด๊ณ ์ปดํฌ๋ํธ๊ฐ ๋ง์ดํธ๋ ์ดํ์ ์น๊ตฌ์ ์ํ๋ฅผ ๊ตฌ๋
ํ๋ฉฐ ์ปดํฌ๋ํธ๊ฐ ๋ง์ดํธ๋ฅผ ํด์ ํ ๋์ ๊ตฌ๋
์ ํด์งํฉ๋๋ค.
componentDidMount() {
ChatAPI.subscribeToFriendStatus(
this.props.friend.id,
this.handleStatusChange
);
}
componentWillUnmount() {
ChatAPI.unsubscribeFromFriendStatus(
this.props.friend.id,
this.handleStatusChange
);
}
๊ทธ๋ฐ๋ฐ ์ปดํฌ๋ํธ๊ฐ ํ๋ฉด์ ํ์๋์ด์๋ ๋์ friend
prop์ด ๋ณํ๋ค๋ฉด ๋ฌด์จ ์ผ์ด ์ผ์ด๋ ๊น์? ์ปดํฌ๋ํธ๋ ๋ค๋ฅธ ์น๊ตฌ์ ์จ๋ผ์ธ ์ํ๋ฅผ ๊ณ์ ํ์ํ ๊ฒ์
๋๋ค. ๋ฒ๊ทธ์ธ ๊ฑฐ์ฃ . ๋ํ ๋ง์ดํธ ํด์ ๊ฐ ์ผ์ด๋ ๋์์๋ ๊ตฌ๋
ํด์ง ํธ์ถ์ด ๋ค๋ฅธ ์น๊ตฌ ID๋ฅผ ์ฌ์ฉํ์ฌ ๋ฉ๋ชจ๋ฆฌ ๋์๋ ์ถฉ๋์ด ๋ฐ์ํ ์๋ ์์ต๋๋ค.
ํด๋์ค ์ปดํฌ๋ํธ์์๋ ์ด๋ฐ ๊ฒฝ์ฐ๋ค์ ๋ค๋ฃจ๊ธฐ ์ํด componentDidUpdate
๋ฅผ ์ฌ์ฉํฉ๋๋ค.
componentDidMount() {
ChatAPI.subscribeToFriendStatus(
this.props.friend.id,
this.handleStatusChange
);
}
componentDidUpdate(prevProps) { // ์ด์ friend.id์์ ๊ตฌ๋
์ ํด์งํฉ๋๋ค. ChatAPI.unsubscribeFromFriendStatus( prevProps.friend.id, this.handleStatusChange ); // ๋ค์ friend.id๋ฅผ ๊ตฌ๋
ํฉ๋๋ค. ChatAPI.subscribeToFriendStatus( this.props.friend.id, this.handleStatusChange ); }
componentWillUnmount() {
ChatAPI.unsubscribeFromFriendStatus(
this.props.friend.id,
this.handleStatusChange
);
}
React ์ ํ๋ฆฌ์ผ์ด์
์ ํํ ๋ฒ๊ทธ ์ค์ ํ๋๊ฐ componentDidUpdate
๋ฅผ ์ ๋๋ก ๋ค๋ฃจ์ง ์๋ ๊ฒ์
๋๋ค.
์ด๋ฒ์๋ Hook์ ์ฌ์ฉํ๋ ์ปดํฌ๋ํธ๋ฅผ ์๊ฐํด๋ด ์๋ค.
function FriendStatus(props) {
// ...
useEffect(() => {
// ...
ChatAPI.subscribeToFriendStatus(props.friend.id, handleStatusChange);
return () => {
ChatAPI.unsubscribeFromFriendStatus(props.friend.id, handleStatusChange);
};
});
์ด ๊ฒฝ์ฐ์๋ ๋ฒ๊ทธ์ ์๋ฌ๋ฆฌ์ง ์์ต๋๋ค.(๋ฌ๋ฆฌ ๋ฐ๊พผ ๊ฒ๋ ์๋๋ฐ ๋ง์ด์ฃ .)
useEffect
๊ฐ ๊ธฐ๋ณธ์ ์ผ๋ก ์
๋ฐ์ดํธ๋ฅผ ๋ค๋ฃจ๊ธฐ ๋๋ฌธ์ ๋๋ ์
๋ฐ์ดํธ๋ฅผ ์ํ ํน๋ณํ ์ฝ๋๊ฐ ํ์ ์์ต๋๋ค. ๋ค์์ effect๋ฅผ ์ ์ฉํ๊ธฐ ์ ์ ์ด์ ์ effect๋ ์ ๋ฆฌ(clean-up)ํฉ๋๋ค. ๊ตฌ๋
๊ณผ ๊ตฌ๋
ํด์ง ํธ์ถ์ ๋ฐ๋ณตํด์ ๋ง๋ค์ด๋ด๋ ์ปดํฌ๋ํธ๋ฅผ ํตํด ์ด๋ฅผ ๊ฐ์ํํด๋ด
์๋ค.
// { friend: { id: 100 } } state์ ์ฌ์ฉํ์ฌ ๋ง์ดํธํฉ๋๋ค.
ChatAPI.subscribeToFriendStatus(100, handleStatusChange); // ์ฒซ๋ฒ์งธ effect๊ฐ ์๋ํฉ๋๋ค.
// { friend: { id: 200 } } state๋ก ์
๋ฐ์ดํธํฉ๋๋ค.
ChatAPI.unsubscribeFromFriendStatus(100, handleStatusChange); // ์ด์ ์ effect๋ฅผ ์ ๋ฆฌ(clean-up)ํฉ๋๋ค.
ChatAPI.subscribeToFriendStatus(200, handleStatusChange); // ๋ค์ effect๊ฐ ์๋ํฉ๋๋ค.
// { friend: { id: 300 } } state๋ก ์
๋ฐ์ดํธํฉ๋๋ค.
ChatAPI.unsubscribeFromFriendStatus(200, handleStatusChange); // ์ด์ ์ effect๋ฅผ ์ ๋ฆฌ(clean-up)ํฉ๋๋ค.
ChatAPI.subscribeToFriendStatus(300, handleStatusChange); // ๋ค์ effect๊ฐ ์๋ํฉ๋๋ค.
// ๋ง์ดํธ๋ฅผ ํด์ ํฉ๋๋ค.
ChatAPI.unsubscribeFromFriendStatus(300, handleStatusChange); // ๋ง์ง๋ง effect๋ฅผ ์ ๋ฆฌ(clean-up)ํฉ๋๋ค.
์ด๋ฌํ ๋ฐฉ์์ผ๋ก ๋์ํ๋ ๊ฒ์ด ์ผ๊ด์ฑ์ ์ ์งํด์ฃผ๋ฉฐ ํด๋์ค ์ปดํฌ๋ํธ์์๋ ํํ ์ ๋ฐ์ดํธ ๋ก์ง์ ๋นผ๋จน์ผ๋ฉด์ ๋ฐ์ํ ์ ์๋ ๋ฒ๊ทธ๋ฅผ ์๋ฐฉํฉ๋๋ค.
ํ: Effect๋ฅผ ๊ฑด๋๋ฐ์ด ์ฑ๋ฅ ์ต์ ํํ๊ธฐ
๋ชจ๋ ๋ ๋๋ง ์ดํ์ effect๋ฅผ ์ ๋ฆฌ(clean-up)ํ๊ฑฐ๋ ์ ์ฉํ๋ ๊ฒ์ด ๋๋๋ก ์ฑ๋ฅ ์ ํ๋ฅผ ๋ฐ์์ํค๋ ๊ฒฝ์ฐ๋ ์์ต๋๋ค. ํด๋์ค ์ปดํฌ๋ํธ์ ๊ฒฝ์ฐ์๋ componentDidUpdate
์์ prevProps
๋ prevState
์์ ๋น๊ต๋ฅผ ํตํด ์ด๋ฌํ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ ์ ์์ต๋๋ค.
componentDidUpdate(prevProps, prevState) {
if (prevState.count !== this.state.count) {
document.title = `You clicked ${this.state.count} times`;
}
}
์ด๋ฌํ ์๊ตฌ ์กฐ๊ฑด์ ํํ๊ธฐ ๋๋ฌธ์ useEffect
Hook API์ ์ด๋ฏธ ๋ด์ฌํ์ฌ ์์ต๋๋ค. ํน์ ๊ฐ๋ค์ด ๋ฆฌ๋ ๋๋ง ์์ ๋ณ๊ฒฝ๋์ง ์๋๋ค๋ฉด React๋ก ํ์ฌ๊ธ effect๋ฅผ ๊ฑด๋๋ฐ๋๋ก ํ ์ ์์ต๋๋ค. useEffect
์ ์ ํ์ ์ธ์์ธ ๋ ๋ฒ์งธ ์ธ์๋ก ๋ฐฐ์ด์ ๋๊ธฐ๋ฉด ๋ฉ๋๋ค.
useEffect(() => {
document.title = `You clicked ${count} times`;
}, [count]); // count๊ฐ ๋ฐ๋ ๋๋ง effect๋ฅผ ์ฌ์คํํฉ๋๋ค.
์์ ์์์์ ์ฐ๋ฆฌ๋ [count]
๋ฅผ ๋ ๋ฒ์งธ ์ธ์๋ก ๋๊น๋๋ค. ์ด๊ฒ์ด ์๋ฏธํ๋ ๋ฐ๋ ๋ค์๊ณผ ๊ฐ์ต๋๋ค. count
๊ฐ 5
์ด๊ณ ์ปดํฌ๋ํธ๊ฐ ๋ฆฌ๋ ๋๋ง๋ ์ดํ์๋ ์ฌ์ ํ count
๋ ๋ณํจ์์ด 5
๋ผ๋ฉด React๋ ์ด์ ๋ ๋๋ง ์์ ๊ฐ [5]
๋ฅผ ๊ทธ๋ค์ ๋ ๋๋ง ๋์ [5]
์ ๋น๊ตํฉ๋๋ค. ๋ฐฐ์ด ๋ด์ ๋ชจ๋ ๊ฐ์ด ๊ฐ๊ธฐ ๋๋ฌธ์(5 === 5
) React๋ effect๋ฅผ ๊ฑด๋๋ฐ๊ฒ ๋ฉ๋๋ค. ์ด๋ฐ ์์ผ๋ก ์ต์ ํ๊ฐ ๊ฐ๋ฅํฉ๋๋ค.
count
๊ฐ 6
์ผ๋ก ์
๋ฐ์ดํธ๋ ๋ค์ ๋ ๋๋งํ๋ฉด React๋ ์ด์ ์ ๋ ๋๋ง๋ ๊ฐ [5]
๋ฅผ ๊ทธ๋ค์ ๋ ๋๋ง ์์ [6]
์ ๋น๊ตํฉ๋๋ค. ์ด๋ 5 !== 6
์ด๊ธฐ ๋๋ฌธ์ React๋ effect๋ฅผ ์ฌ์คํํฉ๋๋ค. ๋ฐฐ์ด ๋ด์ ์ฌ๋ฌ ๊ฐ์ ๊ฐ์ด ์๋ค๋ฉด ๊ทธ์ค์ ๋จ ํ๋๋ง ๋ค๋ฅผ์ง๋ผ๋ React๋ effect๋ฅผ ์ฌ์คํํฉ๋๋ค.
์ด๊ฒ์ ์ ๋ฆฌ(clean-up)๋ฅผ ์ฌ์ฉํ๋ effect์ ๊ฒฝ์ฐ์๋ ๋์ผํ๊ฒ ์์ฉํฉ๋๋ค.
useEffect(() => {
function handleStatusChange(status) {
setIsOnline(status.isOnline);
}
ChatAPI.subscribeToFriendStatus(props.friend.id, handleStatusChange);
return () => {
ChatAPI.unsubscribeFromFriendStatus(props.friend.id, handleStatusChange);
};
}, [props.friend.id]); // props.friend.id๊ฐ ๋ฐ๋ ๋๋ง ์ฌ๊ตฌ๋
ํฉ๋๋ค.
๋ ๋ฒ์งธ ์ธ์๋ ๋น๋ ์ ๋ณํ์ ์ํด ์๋์ผ๋ก ์ถ๊ฐ๋ ์๋ ์์ต๋๋ค.
์ฃผ์
์ด ์ต์ ํ ๋ฐฉ๋ฒ์ ์ฌ์ฉํ๋ค๋ฉด ๋ฐฐ์ด์ด ์ปดํฌ๋ํธ ๋ฒ์ ๋ด์์ ๋ฐ๋๋ ๊ฐ๋ค๊ณผ effect์ ์ํด ์ฌ์ฉ๋๋ ๊ฐ๋ค์ ๋ชจ๋ ํฌํจํ๋ ๊ฒ์ ๊ธฐ์ตํด์ฃผ์ธ์. ๊ทธ๋ ์ง ์์ผ๋ฉด ํ์ฌ ๊ฐ์ด ์๋ ์ด์ ์ ๋ ๋๋ง ๋์ ๊ฐ์ ์ฐธ๊ณ ํ๊ฒ ๋ฉ๋๋ค. ์ด์ ๋ํด์๋ ํจ์๋ฅผ ๋ค๋ฃจ๋ ๋ฐฉ๋ฒ๊ณผ ์์กด์ฑ ๋ฐฐ์ด์ด ์์ฃผ ๋ฐ๋ ๋๋ ์ด๋ป๊ฒ ํด์ผ ํ๋๊ฐ์์ ๋ ์์ธํ ์์๋ณผ ์ ์์ต๋๋ค.
effect๋ฅผ ์คํํ๊ณ ์ด๋ฅผ ์ ๋ฆฌ(clean-up)ํ๋ ๊ณผ์ ์ (๋ง์ดํธ์ ๋ง์ดํธ ํด์ ์์)๋ฑ ํ ๋ฒ์ฉ๋ง ์คํํ๊ณ ์ถ๋ค๋ฉด, ๋น ๋ฐฐ์ด(
[]
)์ ๋ ๋ฒ์งธ ์ธ์๋ก ๋๊ธฐ๋ฉด ๋ฉ๋๋ค. ์ด๋ ๊ฒ ํจ์ผ๋ก์จ React๋ก ํ์ฌ๊ธ ์ฌ๋ฌ๋ถ์ effect๊ฐ prop์ด๋ state์ ๊ทธ ์ด๋ค ๊ฐ์๋ ์์กดํ์ง ์์ผ๋ฉฐ ๋ฐ๋ผ์ ์ฌ์คํ๋์ด์ผ ํ ํ์๊ฐ ์์์ ์๊ฒ ํ๋ ๊ฒ์ ๋๋ค. ์ด๋ ์์กด์ฑ ๋ฐฐ์ด์ ์๋ ๋ฐฉ๋ฒ์ ๊ทธ๋๋ก ๋ฐ๋ผ์ ์ฌ์ฉํ๋ ๊ฒ์ผ ๋ฟ์ด๋ฉฐ ํน๋ณํ ๋ฐฉ๋ฒ์ธ ๊ฒ์ ์๋๋๋ค.๋น ๋ฐฐ์ด(
[]
)์ ๋๊ธฐ๊ฒ ๋๋ฉด, effect ์์ prop๊ณผ state๋ ์ด๊น๊ฐ์ ์ ์งํ๊ฒ ๋ฉ๋๋ค. ๋น ๋ฐฐ์ด([]
)์ ๋ ๋ฒ์งธ ์ธ์๋ก ๋๊ธฐ๋ ๊ฒ์ด ๊ธฐ์กด์ ์ฌ์ฉํ๋componentDidMount
์componentWillUnmount
๋ชจ๋ธ์ ๋ ๊ฐ๊น์ง๋ง, effect์ ์ฆ์ ์ฌ์คํ์ ํผํ ์ ์๋ ๋ ๋์ ํด๊ฒฐ๋ฐฉ๋ฒ์ด ์์ต๋๋ค. ๋ํ React๋ ๋ธ๋ผ์ฐ์ ๊ฐ ๋ค ๊ทธ๋ ค์ง ๋๊น์งuseEffect
์ ์คํ์ ์ง์ฐํ๊ธฐ ๋๋ฌธ์ ์ถ๊ฐ์ ์ธ ์์ ์ ๋ํ๋ ๊ฒ์ด ํฐ ๋ฌธ์ ๊ฐ ๋์ง๋ ์์ต๋๋ค.
exhaustive-deps
๊ท์น์eslint-plugin-react-hooks
ํจํค์ง์ ํฌํจํ๋ ๊ฒ์ ์ถ์ฒํฉ๋๋ค. ์ด ํจํค์ง๋ ์์กด์ฑ์ด ๋ฐ๋ฅด์ง ์๊ฒ ์ง์ ๋์์ ๋ ๊ฒฝ๊ณ ํ๊ณ ์์ ํ๋๋ก ์๋ ค์ค๋๋ค.
๋ค์ ๋จ๊ณ
์ฌ๊ธฐ๊น์ง ์ค๋๋ผ ์๊ณ ๊ฐ ๋ง์ผ์ จ์ต๋๋ค. ๊ธด ๊ธ์ด์ง๋ง ๋๊น์ง ์ฝ์ผ๋ฉด์ ๋ง์ ๊ถ๊ธ์ฆ์ด ํด๊ฒฐ๋์๊ธฐ๋ฅผ ๋ฐ๋๋๋ค. ์ง๊ธ๊น์ง ๋ฐฐ์ด State Hook๊ณผ Effect Hook์ ๊ฒฐํฉํ๋ฉด ๋ง์ ๊ฒ์ ํ ์ ์์ต๋๋ค. class๋ฅผ ์ด์ฉํ๋ ๋๋ถ๋ถ์ ๊ฒฝ์ฐ๋ฅผ ๊ตฌํํ ์ ์์ต๋๋ค. ๊ตฌํ๋์ง ์๋ ๊ฒฝ์ฐ์๋ additional Hooks์ด ๋์์ด ๋ ๊ฒ์ ๋๋ค.
์ฐ๋ฆฌ๋ ๋๊ธฐ์ ์์ ๋์ด์๋ ๋ฌธ์ ๋ค์ Hook์ด ์ด๋ป๊ฒ ํด๊ฒฐํ ์ ์๋์ง ์์๊ฐ๊ณ ์์ต๋๋ค. ์ด๋ป๊ฒ effect์ ์ ๋ฆฌ(clean-up)๊ฐ componentDidUpdate
์ componentWillUnmount
์์์ ์ค๋ณต์ ํผํ๊ณ , ๊ด๋ จ ์๋ ์ฝ๋๋ค์ ํ๊ณณ์ ๋ชจ์ด๊ฒ ํ๋ฉฐ ๋ฒ๊ทธ๋ฅผ ์ค์ผ ์ ์๊ฒ ๋์์ฃผ๋์ง ์์๋ณด์์ต๋๋ค. ๋ํ effect๋ฅผ ๊ทธ ๋ชฉ์ ์ ๋ฐ๋ผ ์ด๋ป๊ฒ ๊ตฌ๋ถํ๋์ง๋ ๋ณด์์ต๋๋ค. ์ด๋ ํด๋์ค ์ปดํฌ๋ํธ์์๋ ํ ์ ์๋ ์ผ์ด์์ฃ .
์ง๊ธ ์ด ์์ ์์ ์ฌ๋ฌ๋ถ์ Hook์ด ์ด๋ป๊ฒ ์๋ํ๋ ๊ฒ์ธ์ง ๊ถ๊ธํดํ๊ณ ์์ ๊ฒ์
๋๋ค. ์ด๋ป๊ฒ React๋ ๋ฆฌ๋ ๋๋ง ์์ ํน์ ํ useState
์ ์คํ์ด ์ด๋ค state ๋ณ์์ ์์ํ๋์ง ์๋ ๊ฒ์ผ๊น์? ์ด๋ป๊ฒ React๋ ์ด์ ๊ณผ ๊ทธ๋ค์ effect๋ฅผ ์
๋ฐ์ดํธ ๋๋ง๋ค โ๋งค์น์
ํ๋(์ผ์นํ๋)โ ๊ฒ์ผ๊น์? ์ด์ ๋ํด์๋ ๋ค์ ์ฅ์์ Hook์ ์๋์ ํต์ฌ์ ์ธ Hook์ ๊ท์น์ ํตํด์ ๋ฐฐ์๋ณผ ๊ฒ์
๋๋ค.