ํ‹ฐ์Šคํ† ๋ฆฌ ๋ทฐ

https://ko.reactjs.org/docs/hooks-effect.html

 

 

 

 

side effect ( = effect)

๊ธฐ๋Šฅ

  • ๋ฐ์ดํ„ฐ ๊ฐ€์ ธ์˜ค๊ธฐ
  • ๊ตฌ๋… ์„ค์ •ํ•˜๊ธฐ
  • ์ˆ˜๋™์œผ๋กœ ๋ฆฌ์•กํŠธ ์ปดํฌ๋„ŒํŠธ์˜ DOM ์ˆ˜์ •ํ•˜๊ธฐ

 

์ข…๋ฅ˜

  • ์ •๋ฆฌ(clean-up)๊ฐ€ ํ•„์š”ํ•œ ๊ฒƒ
  • ๊ทธ๋ ‡์ง€ ์•Š์€ ๊ฒƒ

 

 

์ •๋ฆฌ(Clean-up)๋ฅผ ์ด์šฉํ•˜์ง€ ์•Š๋Š” Effects

๋ฆฌ์•กํŠธ๊ฐ€ DOM์„ ์—…๋ฐ์ดํŠธํ•œ ๋’ค ์ถ”๊ฐ€๋กœ ์ฝ”๋“œ๋ฅผ ์‹คํ–‰ํ•ด์•ผ ํ•˜๋Š” ๊ฒฝ์šฐ

  • ๋„คํŠธ์›Œํฌ ๋ฆฌํ€˜์ŠคํŠธ
  • DOM ์ˆ˜๋™ ์กฐ์ž‘
  • ๋กœ๊น…

-> ์‹คํ–‰ ์ดํ›„ ์‹ ๊ฒฝ ์“ธ ๊ฒƒ์ด ์—†๊ธฐ ๋•Œ๋ฌธ์—!

 

 

 

 

useEffect

useEffect๊ฐ€ ํ•˜๋Š” ์ผ?

-> useEffect Hook์„ ์ด์šฉํ•˜์—ฌ ์šฐ๋ฆฌ๋Š” ๋ฆฌ์•กํŠธ์—๊ฒŒ ์ปดํฌ๋„ŒํŠธ๊ฐ€ ๋ Œ๋”๋ง ์ดํ›„์— ์–ด๋–ค ์ผ์„ ์ˆ˜ํ–‰ํ•ด์•ผํ•˜๋Š” ์ง€๋ฅผ ๋งํ•จ

  • ๋ฆฌ์•กํŠธ๋Š” ์šฐ๋ฆฌ๊ฐ€ ๋„˜๊ธด ํ•จ์ˆ˜(effect)๋ฅผ ๊ธฐ์–ตํ–ˆ๋‹ค๊ฐ€ DOM ์—…๋ฐ์ดํŠธ๋ฅผ ์ˆ˜ํ–‰ํ•œ ์ดํ›„์— ๋ถˆ๋Ÿฌ๋‚ผ ๊ฒƒ
  • ๋ฌธ์„œ ํƒ€์ดํ‹€ ์ง€์ •, ๋ฐ์ดํ„ฐ ๊ฐ€์ ธ์˜ค๊ธฐ, ๋ช…๋ นํ˜• API ๋ถˆ๋Ÿฌ๋‚ด๊ธฐ ๋“ฑ

 

useEffect๋ฅผ ์ปดํฌ๋„ŒํŠธ ์•ˆ์—์„œ ๋ถˆ๋Ÿฌ๋‚ด๋Š” ์ด์œ ?

-> effect๋ฅผ ํ†ตํ•ด count state ๋ณ€์ˆ˜(๋˜๋Š” ๊ทธ ์–ด๋–ค props์—๋„)์— ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋จ

  • ํ•จ์ˆ˜ ๋‚ด๋ถ€์— ์กด์žฌํ•˜๊ธฐ ๋•Œ๋ฌธ์— ํŠน๋ณ„ํ•œ API์—†์ด๋„ ๊ฐ’์„ ์–ป์„ ์ˆ˜ ์žˆ์Œ

 

useEffect๋Š” ๋ Œ๋”๋ง ์ดํ›„์— ๋งค๋ฒˆ ์ˆ˜ํ–‰๋˜๋‚˜?

-> YES! ๊ธฐ๋ณธ์ ์œผ๋กœ ์ฒซ๋ฒˆ์งธ ๋ Œ๋”๋ง๊ณผ ์ดํ›„ ๋ชจ๋“  ์—…๋ฐ์ดํŠธ์—์„œ ์ˆ˜ํ–‰๋จ

  • Mounting๊ณผ Update๋ผ๋Š” ๋ฐฉ์‹์œผ๋กœ ์ƒ๊ฐํ•˜๊ธฐ๋ณด๋‹จ, effect๋ฅผ ๋ Œ๋”๋ง ์ดํ›„์— ์ƒํ•˜๋Š” ๊ฒƒ์œผ๋กœ ์ƒ๊ฐํ•˜๋Š” ๊ฒƒ์ด ๋” ์‰ฝ๋‹ค
  • ๋ฆฌ์•กํŠธ๋Š” effect๊ฐ€ ์ˆ˜ํ–‰๋˜๋Š” ์‹œ์ ์— ์ด๋ฏธ DOM ์—…๋ฐ์ดํŠธ๊ฐ€ ๋˜์—ˆ์Œ์„ ๋ณด์žฅ

 

 

TIP

  • componentDidMount ๋˜๋Š” componentDidUpdate์™€๋Š” ๋‹ฌ๋ฆฌ
    useEffect์—์„œ ์‚ฌ์šฉ๋˜๋Š” effect๋Š” ๋ธŒ๋ผ์šฐ์ €๊ฐ€ ํ™”๋ฉด์„ ์—…๋ฐ์ดํŠธํ•˜๋Š” ๊ฒƒ์„ ์ฐจ๋‹จํ•˜์ง€ ์•Š๋Š”๋‹ค.
  • ์ด๋กœ ์ธํ•ด ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ๋ฐ˜์‘์„ฑ ํ–ฅ์ƒ
  • ๋Œ€๋ถ€๋ถ„์˜ effect๋Š” ๋™๊ธฐ์ ์œผ๋กœ ์‹คํ–‰๋  ํ•„์š”X
  • ๋™๊ธฐ์  ์‹คํ–‰ํžˆ ํ•„์š”ํ•œ ๊ฒฝ์šฐ, useLayoutEffect ํ›… ์‚ฌ์šฉ (useEffect์™€ ๋™์ผํ•œ API์‚ฌ์šฉ)

 

 

 

 

 

 

์ •๋ฆฌ(Clean-up)๋ฅผ ์ด์šฉํ•˜๋Š” Effects

์™ธ๋ถ€ ๋ฐ์ดํ„ฐ์— ๊ตฌ๋…์„ ์„ค์ •ํ•ด์•ผ ํ•˜๋Š” ๊ฒฝ์šฐ

๋ฉ”๋ชจ๋ฆฌ ๋ˆ„์ˆ˜๊ฐ€ ๋ฐœ์ƒํ•˜์ง€ ์•Š๋„๋ก ์ •๋ฆฌ(clean-up)ํ•˜๋Š” ๊ฒƒ์€ ๋งค์šฐ ์ค‘์š”!

 

 

Class ์ปดํฌ๋„ŒํŠธ ์‚ฌ์šฉ ์˜ˆ์‹œ

  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
    });
  }
  • componentDidMount ์™€ componentWillUnMount ๋ฉ”์†Œ๋“œ ๋‚ด์˜ ๊ฐœ๋…์ƒ ๊ฐ™์€ effect์— ๋Œ€ํ•œ ์ฝ”๋“œ๊ฐ€ ์žˆ์Œ์—๋„,
    ์ƒ๋ช…์ฃผ๊ธฐ ๋ฉ”์„œ๋“œ๋Š” ์ด๋ฅผ ๋ถ„๋ฆฌํ•จ

 

 

Hook ์‚ฌ์šฉ ์˜ˆ์‹œ

  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);
    };
  });

effect์—์„œ ํ•จ์ˆ˜ ๋ฐ˜ํ™˜ํ•˜๋Š” ์ด์œ ?

-> clean-up ํ•˜๋ ค๊ณ 

  • ๋ชจ๋“  effect๋Š” clean-up์„ ์œ„ํ•œ ํ•จ์ˆ˜ ๋ฐ˜ํ™˜ ๊ฐ€๋Šฅ
  • ๊ตฌ๋…์˜ ์ถ”๊ฐ€์™€ ์ œ๊ฑฐ๊ฐ€ ๋ฌถ์—ฌ์„œ ๋ชจ๋‘ ํ•˜๋‚˜์˜ effect๋ฅผ ๊ตฌ์„ฑ

 

๋ฆฌ์•กํŠธ๊ฐ€ effect๋ฅผ clean-upํ•˜๋Š” ์‹œ์ ์€ ์ •ํ™•ํžˆ ์–ธ์ œ?

-> ์ปดํฌ๋„ŒํŠธ๊ฐ€ ๋งˆ์šดํŠธ ํ•ด์ œ๋  ๋•Œ

  • ํ•˜์ง€๋งŒ, ์œ„ ์˜ˆ์‹œ์—์„œ ๋ณด์•˜๋“ฏ์ด, effect๋Š” ํ•œ๋ฒˆ์ด ์•„๋‹ˆ๋ผ ๋ Œ๋”๋ง ๋  ๋•Œ๋งˆ๋‹ค ์‹คํ–‰๋จ
    (๋•Œ๋ฌธ์—,๋‹ค์Œ effect๋ฅผ ์‹คํ–‰ํ•˜๊ธฐ ์ „์— ์ด์ „ ๋ Œ๋”๋ง์—์„œ ํŒŒ์ƒ๋œ effect๋ฅผ clean-up ํ•ด์•ผํ•จ)

 

TIP

  • effect์—์„œ ๋ฐ˜๋“œ์‹œ ์œ ๋ช…ํ•จ์ˆ˜(named function)์„ ๋ฐ˜ํ™˜ํ•ด์•ผ ํ•˜๋Š” ๊ฒƒ์€ ์•„๋‹˜
  • ํ™”์‚ดํ‘œ ํ•จ์ˆ˜๋ฅผ ๋ฐ˜ํ™˜ํ•˜๊ฑฐ๋‚˜ ๋‹ค๋ฅธ ์ด๋ฆ„์œผ๋กœ ๋ถˆ๋Ÿฌ๋„ ๋ฌด๋ฐฉ. (๋ชฉ์ ์„ ๋ถ„๋ช…ํžˆ ํ•˜๊ธฐ ์œ„ํ•ด clean-up์ด๋ผ๊ณ  ๋ถ€๋ฆ„)

 

 

์š”์•ฝ

  • effect Hook์€ ๋‘ ๊ฐ€์ง€ ๊ฒฝ์šฐ๋ฅผ ํ•œ ๊ฐœ์˜ API๋กœ ํ†ตํ•ฉํ•œ๋‹ค.
  • Hook์„ ์ด์šฉํ•˜๋ฉด ์ƒ๋ช…์ฃผ๊ธฐ ๋ฉ”์„œ๋“œ์— ๋”ฐ๋ผ์„œ๊ฐ€ ์•„๋‹ˆ๋ผ ์ฝ”๋“œ๊ฐ€ ๋ฌด์—‡์„ ํ•˜๋Š”์ง€์— ๋”ฐ๋ผ ๋‚˜๋ˆŒ ์ˆ˜ ์žˆ์Œ

 

 

 

 

 

* ์ฐธ๊ณ ์ž๋ฃŒ *

React ํด๋ž˜์Šค ์ปดํฌ๋„ŒํŠธ์˜ ์ƒ๋ช…์ฃผ๊ธฐ

[velog.io/@piecemaker/React-%EC%BB%B4%ED%8F%AC%EB%84%8C%ED%8A%B8%EC%9D%98-%EC%83%9D%EB%AA%85%EC%A3%BC%EA%B8%B0]

 

React ์ปดํฌ๋„ŒํŠธ์˜ ์ƒ๋ช…์ฃผ๊ธฐ

React ์ปดํฌ๋„ŒํŠธ๊ฐ€ ๋งˆ์šดํŠธ๋˜๊ณ  ์–ธ๋งˆ์šดํŠธ ๋˜๊ธฐ๊นŒ์ง€์˜ ์ƒ๋ช…์ฃผ๊ธฐ์— ๋Œ€ํ•ด ์•Œ์•„๋ณธ๋‹ค.

velog.io

 

๋Œ“๊ธ€