๐Ÿ“Œ useEffect

1
useEffect(effectCallback);

ํ•จ์ˆ˜ ์ปดํฌ๋„ŒํŠธ์—์„œ ๋ฐœ์ƒ ๊ฐ€๋Šฅํ•œ side-effect(๋ถ€์ˆ˜ํšจ๊ณผ)๋ฅผ ๊ด€๋ฆฌํ•˜๊ธฐ ์œ„ํ•ด ์‚ฌ์šฉํ•œ๋‹ค.

  • ๋น„๋™๊ธฐ ํ†ต์‹  ์š”์ฒญ ๋ฐ ์‘๋‹ต
  • DOM ์กฐ์ž‘
  • ๊ตฌ๋…/์ทจ์†Œ ๋“ฑ

๋ฆฌ์•กํŠธ๊ฐ€ ํ•  ์ˆ˜ ์—†๋Š” ์ž‘์—…์„ ํ•  ๋•Œ, useEffect()๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค.

๐ŸŒˆ React Hook ์‹คํ–‰ ํ๋ฆ„

Hook ์‹คํ–‰ ํ๋ฆ„

๋ฆฌ์•กํŠธ Hook์˜ ์‹คํ–‰ํ๋ฆ„์€ ์œ„ ์‚ฌ์ง„๊ณผ ๊ฐ™๋‹ค.

ํ•จ์ˆ˜ ์ปดํฌ๋„ŒํŠธ์—์„œ ํด๋ž˜์Šค ์ปดํฌ๋„ŒํŠธ์˜ ์ƒ๋ช…์ฃผ๊ธฐ๋ฅผ ๊ตฌํ˜„ํ•˜๊ธฐ ์œ„ํ•ด useEffect()๊ฐ€ componentDidMount(), componentDidUpdate(), componentWillUnmount() ๋ฉ”์„œ๋“œ๊ฐ€ ๋ฐœ์ƒ๋˜๋Š” ์ฃผ๊ธฐ๋ฅผ ๋Œ€์ฒดํ•  ์ˆ˜ ์žˆ์–ด์•ผํ•œ๋‹ค.

useEffect()๊ฐ€ ์ด๋“ค์„ 100% ๋Œ€์ฒดํ•  ์ˆœ ์—†์ง€๋งŒ ๋ฌธ์ œ์—†์„ ์ •๋„๋กœ ํ‰๋‚ด๋‚ด์–ด ์‚ฌ์šฉํ•˜๊ณ  ์žˆ๋‹ค.

๐Ÿฅ ์ดํŽ™ํŠธ ์กฐ๊ฑด ์ฒ˜๋ฆฌ

1. componentDidMount() ๋Œ€์ฒด ๋ฐฉ๋ฒ•

1
2
3
useEffect(() => {
// componentDidMount
}, []);
  • useEffect 2๋ฒˆ์งธ ์ธ์ž๋กœ ๋นˆ ๋ฐฐ์—ด์„ ์ฃผ๊ฒŒ๋˜๋ฉด ์ปดํฌ๋„ŒํŠธ๊ฐ€ ์ฒ˜์Œ mount ๋˜๋Š” ๋•Œ์— ํ•œ๋ฒˆ๋งŒ ํ˜ธ์ถœ๋œ๋‹ค.

2. componentDidUpdate() ๋Œ€์ฒด ๋ฐฉ๋ฒ•

1
2
3
4
5
6
7
useEffect(
() => {
// componentDidMount
// componentDidUpdate
}.
[...dependencies]
);
  • useEffect 2๋ฒˆ์งธ ์ธ์ž๋กœ ๋นˆ ๋ฐฐ์—ด ๋Œ€์‹  ๊ด€๋ฆฌํ•  ์ƒํƒœ๊ฐ€ ์ถ”๊ฐ€๋˜๋ฉด ํ•ด๋‹น ์ƒํƒœ๊ฐ€ ๋ณ€๊ฒฝ๋  ๋•Œ์—๋งŒ ์ดํŽ™ํŠธ ํ•จ์ˆ˜๊ฐ€ ์‹คํ–‰๋œ๋‹ค. ์ฆ‰, mount๋  ๋•Œ๋Š” 1๋ฒˆ ์‹คํ–‰๋˜๊ณ , update ๋  ๋•Œ ๋งˆ๋‹ค ์‹คํ–‰๋œ๋‹ค.

3. componentWillUnmount() ๋Œ€์ฒด ๋ฐฉ๋ฒ•

์ด๋ฒคํŠธ ๊ตฌ๋…/์ทจ์†Œ์ฒ˜๋Ÿผ ์ปดํฌ๋„ŒํŠธ๊ฐ€ ์ œ๊ฑฐ๋  ๋•Œ ์‹คํ–‰๋˜์–ด์•ผ ํ•˜๋Š” ํ•จ์ˆ˜์˜ ๊ฒฝ์šฐ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์‚ฌ์šฉํ•œ๋‹ค.

1
2
3
4
5
6
7
8
9
function Tester() {
useEffect(() => {
let clearId = setInterval(() => console.count(), 500);
// ์ •๋ฆฌ ํ•จ์ˆ˜(cleanup)
return () => {
clearInterval(clearId);
};
}, []);
}
  • cleanUp ํ•จ์ˆ˜๋Š” ๋ฉ”๋ชจ๋ฆฌ ๋ˆ„์ˆ˜ ๋ฐฉ์ง€๋ฅผ ์œ„ํ•ด UI์—์„œ ์ปดํฌ๋„ŒํŠธ๋ฅผ ์ œ๊ฑฐํ•˜๊ธฐ ์ง์ „์— ์ˆ˜ํ–‰๋œ๋‹ค.
  • Effect ํ•จ์ˆ˜๊ฐ€ ์‹คํ–‰๋  ๋•Œ๋งˆ๋‹ค cleanUp ํ•จ์ˆ˜๊ฐ€ ๋จผ์ € ์‹คํ–‰๋˜์–ด ์ •๋ฆฌํ•œ๋‹ค.

์ด๋Š” componentWillUnmount()์ฒ˜๋Ÿผ ๋™์ž‘ํ•˜๋Š” ๊ฒƒ ๊ฐ™์ง€๋งŒ, ๋ฆฌ์•กํŠธ ํŒ€์€ ํด๋ž˜์Šค ์ปดํฌ๋„ŒํŠธ ์ƒ๋ช…์ฃผ๊ธฐ๋Œ€๋กœ ๋กœ์ง์„ ๊ตฌํ˜„ํ–ˆ์„ ๋•Œ, ๋Œ€๊ทœ๋ชจ ํ”„๋กœ์ ํŠธ์—์„œ ๋ฒ„๊ทธ๋ฅผ ๋งŽ์ด ๋ฐœ๊ฒฌํ•˜์˜€๋‹ค.

๊ทธ๋ฆฌํ•˜์—ฌ ๋ฆฌ์•กํŠธ ํŒ€์—์„œ๋Š” ๊ตฌ๋…์ทจ์†Œ ํ›„ ๋‹ค์‹œ ๊ตฌ๋…ํ•˜๋Š” ๊ณผ์ •์„ ํ†ตํ•ด ์ด๋ฅผ ๊ตฌํ˜„ํ•˜์˜€๋‹ค.

1
2
3
4
5
6
7
8
9
10
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๊ฐ€ ๋ฐ”๋€” ๋•Œ๋งŒ ์žฌ๊ตฌ๋…ํ•ฉ๋‹ˆ๋‹ค.