๊ด€๋ฆฌ ๋ฉ”๋‰ด

Daehyunii's Dev-blog

classํ˜• ์ปดํฌ๋„ŒํŠธ - shouldComponentUpdate( ) ๋ณธ๋ฌธ

๐Ÿ“š Language & CS knowledge/React

classํ˜• ์ปดํฌ๋„ŒํŠธ - shouldComponentUpdate( )

Daehyunii 2022. 12. 15. 23:29
shouldComponentUpdate ๋ผ์ดํ”„ ์‚ฌ์ดํด ๋ฉ”์„œ๋“œ
๋ Œ๋”๋ง์‹œ state, props์˜ ๋ณ€๊ฒฝ์ด ์žˆ๋Š” ๊ฒฝ์šฐ์—๋งŒ ๋ Œ๋”๋ง ๋  ์ˆ˜ ์žˆ๋„๋กํ•˜๋Š” ์ตœ์ ํ™”์— ์œ ์šฉํ•œ ๋ฉ”์„œ๋“œ์ด๋‹ค.

 

  ์•„๋ž˜์˜ ์ฝ”๋“œ๋ฅผ ๋ณด๋ฉด click๋ฒ„ํŠผ์ด ์žˆ๋Š” ํ•˜๋‚˜์˜ ํ…Œ์ŠคํŠธ์šฉ ์ปดํฌ๋„ŒํŠธ์ด๋‹ค. click ์ด๋ฒคํŠธ๋ฅผ ๋„ฃ์–ด์คฌ์ง€๋งŒ click์„ ์—ฌ๋Ÿฌ๋ฒˆ ๋ˆ„๋ฅด๋”๋ผ๋„ ๊ณ„์†ํ•ด์„œ ๋™์ผํ•˜๊ฒŒ ๋นˆ ๊ฐ์ฒด๋กœ setStateํ•˜๊ธฐ ๋•Œ๋ฌธ์— state๋Š” ๋ณ€๊ฒฝ๋˜์ง€ ์•Š๋Š”๋‹ค.  ์ฆ‰ ์—ฌ๋Ÿฌ๋ฒˆ์˜ click์—๋„ state๋Š” ๋ฐ”๋€Œ๋Š” ๊ฒƒ์ด ์—†๋‹ค. ๋ฆฌ์•กํŠธ์˜ ํ•ต์‹ฌ์€ '์ƒํƒœ๊ฐ€ ๋ณ€ํ™”ํ•˜๋ฉด ์ƒˆ๋กญ๊ฒŒ ๊ทธ๋ฆฐ๋‹ค!' ๋ผ๊ณ  ๋ณผ ์ˆ˜ ์žˆ๋‹ค. ๋ฆฌ์•กํŠธ์—์„œ ๋ฆฌ๋ Œ๋”๋ง์ด ๋ฐœ์ƒํ•˜๋Š” ์ด์œ ๋Š” ํฌ๊ฒŒ 3๊ฐ€์ง€ ์ด๋‹ค. state๊ฐ€ ๋ณ€ํ•˜๊ฑฐ๋‚˜, props๊ฐ€ ๋ณ€ํ•˜๊ฑฐ๋‚˜, ๋ถ€๋ชจ ์ปดํฌ๋„ŒํŠธ๊ฐ€ ๋ฆฌ๋ Œ๋”๋ง๋˜๋ฉด ์ž์‹ ์ปดํฌ๋„ŒํŠธ๋„ ๊ฐ™์ด ๋ฆฌ๋ Œ๋”๋ง๋˜๋Š” ๊ฒฝ์šฐ 3๊ฐ€์ง€ ์ด๋‹ค. ๊ทธ๋ ‡๋‹ค๋ฉด ์ƒํƒœ๊ฐ€ ๋ณ€ํ•˜์ง€ ์•Š์€ ๊ฒฝ์šฐ์—๋Š” ๋ Œ๋”๋ง ๋˜์ง€ ์•Š๋Š”๊ฒŒ ์ •์ƒ์ด๋‹ค.(props์™€ ๋ถ€๋ชจ-์ž์‹ ์ปดํฌ๋„ŒํŠธ์˜ ๊ด€๊ณ„๋Š” ์ง€๊ธˆ์€ ์ œ์™ธํ•˜๊ณ  ์„ค๋ช…ํ•˜๊ฒ ๋‹ค.) ๋‹ค์Œ ์•„๋ž˜ ์ฝ”๋“œ๋ฅผ ์‚ดํŽด๋ณด์ž

import React, { Component } from "react";

class Test extends Component {
  state = {
    counter: 0,
  };

  onClick = () => {
    this.setState({});
  };

  render() {
    return (
      <div>
        <button onClick={this.onClick}>ํด๋ฆญ</button>
      </div>
    );
  }
}

export default Test;

  ์œ„์˜ ์‚ฌ์ง„์ฒ˜๋Ÿผ React Developer Tools์˜ ์„ค์ •์„ ๋ˆŒ๋Ÿฌ๋ณด์ž.(ํ†ฑ๋‹ˆ๋ฐ”ํ€ด ๋ชจ์–‘) Highlight updates when components render๋ผ๋Š” ์˜ต์…˜์ด ์žˆ๊ณ  ์ด๊ฒƒ์„ ์„ ํƒํ•ด๋ณด๋ฉด ๋ Œ๋”๋ง์ด ๋  ๋•Œ ๋งˆ๋‹ค ํ•˜์ด๋ผ์ดํŠธ ์ฒ˜๋ฆฌ๋ฅผ ํ•ด์ฃผ๋Š” ๊ธฐ๋Šฅ์ด ์ œ๊ณต๋œ๋‹ค. ์ด์ œ ๋ Œ๋”๋ง๋œ button์„ ๊ณ„์†ํ•ด์„œ ํด๋ฆญํ•ด ๋ณด์ž! 

 

 

 

  ํด๋ฆญํ•ด๋ณด๋ฉด ์œ„์˜ ์˜์ƒ๊ณผ ๊ฐ™์ด state๊ฐ€ ๋ณ€๊ฒฝ๋˜์ง€ ์•Š์•˜์Œ์—๋„ ๊ณ„์†ํ•ด์„œ ๋ Œ๋”๋ง๋˜๋Š” ๊ฒƒ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค. ๋‹ค์‹œ ๋งํ•ด ํด๋ฆญ ์ด๋ฒคํŠธ๊ฐ€ ๋ฐœ์ƒํ•˜๊ณ  setState๊ฐ€ ํ˜ธ์ถœ์ด ๋˜์—ˆ๋‹ค๋Š” ์ด์œ ๋งŒ์œผ๋กœ state์˜ ๋ณ€๊ฒฝ์ด ์—†์Œ์—๋„ ๋‹ค์‹œ ๋ Œ๋”๋ง ๋œ ๊ฒƒ์ด๋‹ค.

 

์ด๋Ÿฌํ•œ ์ด์œ ๋Š” ๋ฌด์—‡์ผ๊นŒ? ๊ทธ ์ด์œ ๋Š” ๋ฐ”๋กœ React.Component์—์„œ ์ฐพ์„ ์ˆ˜ ์žˆ๋‹ค. React.Component๋Š” shouldComponentUpdate๋ฅผ ๋”ฐ๋กœ ์„ค์ •ํ•ด์ฃผ์ง€ ์•Š์€ ๊ฒฝ์šฐ, ํ•ญ์ƒ true๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค. ์ฆ‰, setState๊ฐ€ ์‹คํ–‰๋˜๋ฉด state, props์˜ ๋ณ€๊ฒฝ ์—ฌ๋ถ€๋ฅผ ์‹ ๊ฒฝ์“ฐ์ง€ ์•Š๊ณ  ๋ฌด์กฐ๊ฑด์ ์œผ๋กœ ์ปดํฌ๋„ŒํŠธ๋ฅผ ์—…๋ฐ์ดํŠธ์‹œํ‚จ๋‹ค๋Š” ๊ฒƒ์ด๋‹ค.

 

์ด๋Š” ๋งค์šฐ ๋น„ํšจ์œจ์ ์ด๋‹ค. ๊ทธ๋ ‡๋‹ค๋ฉด ์ด๋ฅผ ์ตœ์ ํ™”๋Š” ๋ฐฉ๋ฒ•์€ ๋ฌด์—‡์ด ์žˆ์„๊นŒ? ๋ฐ”๋กœ ์ฒ˜์Œ์— ์–ธ๊ธ‰ํ•œ shouldComponentUpdate() ๋ฉ”์„œ๋“œ๋ฅผ ํ†ตํ•ด ์„ค์ •ํ•ด์ฃผ๋Š” ๊ฒƒ์ด๋‹ค. shouldComponentUpdate()๋Š” ๋ Œ๋”๋ง ์ง์ „์— ์‹คํ–‰๋œ๋‹ค. state์™€ ๋ณ€๊ฒฝ๋  state๋ฅผ ๋น„๊ตํ•˜์—ฌ ๋ณ€ํ™”๊ฐ€ ์žˆ๋Š” ๊ฒฝ์šฐ์—๋Š” true๋ฅผ ๋ฐ˜ํ™˜ํ•˜์—ฌ ๋ฆฌ๋ Œ๋”๋ง ๋˜๋„๋ก ๋งŒ๋“ค๊ณ , ๊ทธ๋ ‡์ง€ ์•Š์€ ๊ฒฝ์šฐ์—๋Š” false๋ฅผ ๋ฐ˜ํ™˜ํ•˜์—ฌ ๋ฆฌ๋ Œ๋”๋ง๋˜์ง€ ์•Š๊ฒŒ ๋งŒ๋“ค์–ด ์ค€๋‹ค. ์ด๋ฅผ ํ†ตํ•ด ํ•ด๋‹น ๋‹ค์‹œ ์ตœ์ ํ™” ํ•ด๋ณด์ž.

 

import React, { Component } from "react";

class Test extends Component {
  state = {
    counter: 0,
  };

  shouldComponentUpdate(nextProps, nextState, nextContext) {
    if (this.state.counter !== nextState.counter) {
      return true;
    }
    return false;
  }

  onClick = () => {
    this.setState({});
  };

  render() {
    return (
      <div>
        <button onClick={this.onClick}>ํด๋ฆญ</button>
      </div>
    );
  }
}

export default Test;

๋‹ค์‹œ ๋ฒ„ํŠผ์„ ํด๋ฆญํ•ด ๋ณด๊ฒ ๋‹ค.

 

 

 

  ํ•˜์ด๋ผ์ดํŠธ ํ‘œ์‹œ๊ฐ€ ๋‚˜ํƒ€๋‚˜์ง€ ์•Š๋Š”๋‹ค. ์ฆ‰ ๋‹ค์‹œ ๋ Œ๋”๋ง์ด ๋˜๊ณ  ์žˆ์ง€ ์•Š๋‹ค๋Š” ๋œป์ด๋‹ค. ๋ฌผ๋ก  ํ•ด๋‹น ์ปดํฌ๋„ŒํŠธ์˜ state์˜ ๋ณ€ํ™”๊ฐ€ ์—†๋Š” ๊ฒฝ์šฐ์—๋งŒ ๋‹ค์‹œ ๋ Œ๋”๋ง๋˜์ง€ ์•Š๋Š”๊ฒƒ์ด๋‹ˆ state๊ฐ€ ๋ณ€๊ฒฝ๋˜๋Š” ๊ฒฝ์šฐ์—๋Š” ๋‹ค์‹œ ๋ Œ๋”๋ง ๋  ๊ฒƒ์ด๋‹ค! 

 

์ง€๊ธˆ๊นŒ์ง€ classํ˜• ์ปดํฌ๋„ŒํŠธ์˜ ๊ฒฝ์šฐ state์˜ ๋ณ€ํ™”๊ฐ€ ์žˆ๋Š” ๊ฒฝ์šฐ์—๋งŒ ๋ Œ๋”๋ง๋  ์ˆ˜ ์žˆ๋„๋ก ๋งŒ๋“ค์–ด์ฃผ๋Š” ๋ฉ”์„œ๋“œ๋ฅผ ์•Œ์•„๋ณด์•˜๋‹ค!