[React] Hook์— ๋Œ€ํ•œ ์„ค๋ช… (useState, useEffect, ๋“ฑ์žฅ ๋ฐฐ๊ฒฝ๊นŒ์ง€)

React Hook

React ๊ณต์‹์‚ฌ์ดํŠธ ์ฐธ์กฐ : https://ko.reactjs.org/docs/hooks-intro.html

 

Hook ์†Œ๊ฐœ

 Hook์€ ์–ด๋–ค ๊ฒƒ์ด๊ณ  ์™œ ๋‚˜์˜ค๊ฒŒ ๋˜์—ˆ์„๊นŒ?

 

Hook์ด๋ž€?

 ์šฐ์„  Hook์€ React 16.8 ๋ฒ„์ „์— ์ƒˆ๋กœ ์ถ”๊ฐ€๋œ ์ตœ์‹  ๊ธฐ๋Šฅ์œผ๋กœ, ํด๋ž˜์Šคํ˜• ์ปดํฌ๋„ŒํŠธ์˜ ๋‹จ์ ์„ ๊ทน๋ณตํ•˜๊ณ ์ž ๋‚˜์˜จ ํ•จ์ˆ˜ํ˜• ์ปดํฌ๋„ŒํŠธ์— ๋Œ€ํ•œ ๊ธฐ๋Šฅ์ด๋‹ค. Hook์€ ํ•จ์ˆ˜ํ˜• ์ปดํฌ๋„ŒํŠธ๋กœ๋„ ํด๋ž˜์Šคํ˜• ์ปดํฌ๋„ŒํŠธ์˜ ๊ธฐ๋Šฅ์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•ด์ค€๋‹ค.

 

ํ•จ์ˆ˜ํ˜• ์ปดํฌ๋„ŒํŠธ๋ž€?

// ํด๋ž˜์Šคํ˜• ์ปดํฌ๋„ŒํŠธ
import React, { Component } from 'react';

class App extends Component {
    render(){
        return (
            //jsx
        );
    }
}

export default App;
// ํ•จ์ˆ˜ํ˜• ์ปดํฌ๋„ŒํŠธ
import React from 'react';

function App(){ 
    // ํ™”์‚ดํ‘œ ํ•จ์ˆ˜ ํ‘œํ˜„๋„ ๊ฐ€๋Šฅํ•˜๋‹ค.
    return(
        //jsx
    );
}

export default App;

 ํด๋ž˜์Šคํ˜• ์ปดํฌ๋„ŒํŠธ๋Š” ์ง๊ด€์ ์œผ๋กœ ์œ„์˜ ์ฝ”๋“œ์™€ ๊ฐ™์€ ์ฐจ์ด๊ฐ€ ์žˆ๋‹ค. ์ด๋ฆ„ ๊ทธ๋Œ€๋กœ ์ปดํฌ๋„ŒํŠธ๋ฅผ ํด๋ž˜์Šค๋กœ ๊ตฌํ˜„ํ•œ ๊ฒƒ์ธ์ง€ ํ•จ์ˆ˜ ํ˜•ํƒœ๋กœ ๊ตฌํ˜„ํ•œ ๊ฒƒ์ธ์ง€์— ๋”ฐ๋ฅธ ์ฐจ์ด์ด๋‹ค.

 ํ•จ์ˆ˜ํ˜•ํƒœ์˜ ์ปดํฌ๋„ŒํŠธ์—์„œ ์‚ฌ์šฉ๋˜๋Š” ๋ช‡๊ฐ€์ง€ ๊ธฐ์ˆ ์„ Hook์ด๋ผ๊ณ  ๋ถ€๋ฅธ๋‹ค.

 

๊ธฐ์กด ๋ฒ„์ „๊ณผ์˜ ํ˜ธํ™˜

 ๊ฐ‘์ž๊ธฐ ํ•จ์ˆ˜ํ˜• ์ปดํฌ๋„ŒํŠธ๋ฅผ ์‚ฌ์šฉํ•˜๊ฒŒ ๋œ๋‹ค๋ฉด ์ด์ „ ๋ฒ„์ „๊ณผ๋Š” ํ˜ธํ™˜์ด ๋˜๋Š”๊ฑธ๊นŒ? Hook์€ ์ผ๋ถ€ ์ปดํฌ๋„ŒํŠธ์—๋งŒ ์ ์šฉํ•ด๋„ ๋˜๊ณ  ์ด์ „ ๋ฒ„์ „๊ณผ์˜ ํ˜ธํ™˜์„ฑ์„ ๊นจ๋œจ๋ฆฌ๋Š” ๋ณ€ํ™”๊ฐ€ ์ „ํ˜€ ์—†์œผ๋ฏ€๋กœ ์‚ฌ์šฉํ•ด๋„ ๋œ๋‹ค. ์•„์ง๊นŒ์ง€๋Š” ํด๋ž˜์Šคํ˜• ์ปดํฌ๋„ŒํŠธ๋ฅผ ์ œ๊ฑฐํ•˜๋ ค๋Š” ๊ณ„ํš๋„ ์—†์œผ๋ฏ€๋กœ ๋‘ ํ˜•ํƒœ ๋ชจ๋‘ ํ˜ผํ•ฉํ•ด์„œ ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•˜๋‹ค.

 ๊ทธ๋ ‡๋‹ค๋ฉด ์™œ ๊ตณ์ด ์ž˜ ์“ฐ๊ณ  ์žˆ๋˜ ํด๋ž˜์Šคํ˜• ์ปดํฌ๋„ŒํŠธ๋ฅผ ํ•จ์ˆ˜ํ˜• ์ปดํฌ๋„ŒํŠธ๋กœ ๋ฐ”๊ฟ”์•ผํ• ๊นŒ?

 

ํ•จ์ˆ˜ํ˜• ์ปดํฌ๋„ŒํŠธ์˜ ํŠน์ง•

 ํด๋ž˜์Šค๋Š” react๋ฅผ ๋ฐฐ์šฐ๋Š” ๋ฐ์— ์žˆ์–ด์„œ ํฐ ์ง„์ž…์žฅ๋ฒฝ์ด์—ˆ๋‹ค. ์ฝ”๋“œ์˜ ์žฌ์‚ฌ์šฉ์„ฑ๊ณผ ์ฝ”๋“œ ๊ตฌ์„ฑ์„ ์–ด๋ ต๊ฒŒ ๋งŒ๋“ค๊ณ , this์˜ ์‚ฌ์šฉ์ด๋‚˜ ์ด๋ฒคํŠธ ํ•ธ๋“ค๋Ÿฌ์˜ ๋“ฑ๋ก ๋“ฑ ๊ธฐ๋ณธ์ ์ธ JS ๋ฌธ๋ฒ• ์‚ฌํ•ญ์„ ์•Œ์•„์•ผ ๋‹ค๋ฃฐ ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.

 ๋˜ํ•œ ํด๋ž˜์Šค๋Š” ์ž˜ ์ถ•์†Œ๋˜์ง€ ์•Š๊ณ , reloading์„ ๊นจ์ง€๊ธฐ ์‰ฝ๊ณ  ์‹ ๋ขฐํ•˜๊ธฐ ์–ด๋ ต๊ฒŒ ๋งŒ๋“ ๋‹ค. ๋”ฐ๋ผ์„œ react์˜ ์ตœ์‹  ๊ธฐ์ˆ ๋“ค์ด ํด๋ž˜์Šคํ˜• ์ปดํฌ๋„ŒํŠธ์— ํšจ๊ณผ์ ์œผ๋กœ ์ ์šฉ๋˜์ง€ ์•Š์•˜๋‹ค.

 

์ •๋ฆฌํ•ด๋ณด์ž๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.

  1. ํด๋ž˜์Šค์˜ ๋ฌธ๋ฒ•์ด ์–ด๋ ต๋‹ค.
  2. ์ถ•์†Œ๊ฐ€ ์–ด๋ ต๋‹ค.
  3. reloading์˜ ์‹ ๋ขฐ์„ฑ์ด ๋–จ์–ด์ง„๋‹ค.
  4. ์ตœ์‹  ๊ธฐ์ˆ ์˜ ์ ์šฉ์ด ํšจ๊ณผ์ ์ด์ง€ ์•Š๋‹ค.

 ํ•จ์ˆ˜ํ˜• ์ปดํฌ๋„ŒํŠธ๋Š” ์ด๋Ÿฌํ•œ ๋‹จ์ ๋“ค์„ ์ปค๋ฒ„ํ•  ์ˆ˜ ์žˆ๋‹ค. ํ•˜์ง€๋งŒ ํด๋ž˜์Šค ์ปดํฌ๋„ŒํŠธ์˜ ์žฅ์ ์ธ state ์‚ฌ์šฉ์ด๋‚˜ life cycle์„ ์ง์ ‘ ๋‹ค๋ฃจ๋Š” ๋“ฑ์˜ ๊ธฐ๋Šฅ์„ ์‚ฌ์šฉํ•˜์ง€ ๋ชปํ•œ๋‹ค. ์ด๋ฅผ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด Hook์ด ๋“ฑ์žฅํ–ˆ๋‹ค.

 

Hook์˜ ํŠน์ง•

 Hook์€ React ๊ฐœ๋…์— ๋ณด๋‹ค ์ง๊ด€์ ์ธ API๋ฅผ ์ œ๊ณตํ•œ๋‹ค. ๋˜ํ•œ ์ƒํƒœ์— ๊ด€๋ จ๋œ ๋กœ์ง์„ ์žฌ์‚ฌ์šฉํ•˜๊ธฐ ์‰ฝ๊ฒŒ ๋งŒ๋“ ๋‹ค.

mixin, HOC, render props ๋“ฑ์˜ ๋‚ด์šฉ => ์ •๋ฆฌํ•˜๊ธฐ

 

Hook ๊ธฐ๋Šฅ

 Hook์€ ํ•จ์ˆ˜ํ˜• ์ปดํฌ๋„ŒํŠธ๊ฐ€ ํด๋ž˜์Šคํ˜• ์ปดํฌ๋„ŒํŠธ์˜ ๊ธฐ๋Šฅ์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•ด์ฃผ๋Š” ๊ธฐ๋Šฅ์ด๋‹ค. ํŠน์ง•์ ์œผ๋กœ state์™€ lifecycle๊ณผ ๊ฐ™์€ ๊ธฐ๋Šฅ์„ ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•˜๊ฒŒ ํ•ด์ค€๋‹ค.

 

State Hook

 ํ•จ์ˆ˜ํ˜• ์ปดํฌ๋„ŒํŠธ์—์„œ state๋ฅผ ์‚ฌ์šฉํ•˜๋ ค๋ฉด ์–ด๋–ป๊ฒŒ ํ•ด์•ผํ• ๊นŒ?

const [count, setCount] = useState(0);

useState๋Š” Hook์˜ ๊ธฐ์ˆ ์ด๋‹ค. ํ•จ์ˆ˜ํ˜• ์ปดํฌ๋„ŒํŠธ์—์„œ๋Š” ํด๋ž˜์Šคํ˜• ์ปดํฌ๋„ŒํŠธ์™€ ๊ฐ™์ด state๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์—†๊ธฐ ๋•Œ๋ฌธ์—, Hook์„ ์‚ฌ์šฉํ•ด์„œ state์™€ ๊ฐ™์€ ๊ธฐ๋Šฅ์„ ํ•  ์ˆ˜ ์žˆ๋„๋ก ๋งŒ๋“ค์–ด์ฃผ์—ˆ๋‹ค.

useState๋Š” ์„ค์ •ํ•  state ๊ฐ’๊ณผ ์ด ๊ฐ’์„ ์—…๋ฐ์ดํŠธํ•˜๋Š” ํ•จ์ˆ˜๋ฅผ ์Œ์œผ๋กœ ์ œ๊ณตํ•œ๋‹ค. ์ด ํ•จ์ˆ˜๋Š” ํด๋ž˜์Šค ์ปดํฌ๋„ŒํŠธ์—์„œ์˜ this.setState์™€ ์œ ์‚ฌํ•˜์ง€๋งŒ ์ด์ „ state์™€ ์ƒˆ๋กœ์šด state๋ฅผ ํ•ฉ์น˜์ง€ ์•Š๋Š”๋‹ค๋Š” ์ฐจ์ด์ ์ด ์žˆ๋‹ค.

useState๋Š” ์ธ์ž๋กœ ์ดˆ๊ธฐ state ์„ค์ •๊ฐ’์„ ํ•˜๋‚˜ ๋ฐ›๋Š”๋‹ค. ์ด ์ดˆ๊ธฐ๊ฐ’์€ ์ฒซ ๋ฒˆ์งธ ๋ Œ๋”๋ง ์‹œ์— ํ•œ ๋ฒˆ ์‚ฌ์šฉ๋œ๋‹ค.

 

Effect Hook

 react์˜ ์ปดํฌ๋„ŒํŠธ ๋‚ด์—์„œ ๋ฐ์ดํ„ฐ๋ฅผ ๊ฐ€์ ธ์˜ค๊ฑฐ๋‚˜ ๊ตฌ๋…ํ•˜๊ณ , DOM์„ ์กฐ์ž‘ํ•˜๋Š” ์ž‘์—…์„ side effects ๋˜๋Š” effects๋ผ๊ณ  ํ•œ๋‹ค. ์ด๋Š” ๋‹ค๋ฅธ ์ปดํฌ๋„ŒํŠธ์— ์˜ํ–ฅ์„ ์ค„ ์ˆ˜ ๋„ ์žˆ๊ณ  ๋ Œ๋”๋ง ๊ณผ์ •์—์„œ๋Š” ๊ตฌํ˜„ ๋ถˆ๊ฐ€๋Šฅํ•œ ์ž‘์—…์ด๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.

useEffect๋Š” ์ด๋Ÿฌํ•œ side effects๋ฅผ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•ด์ค€๋‹ค. ํด๋ž˜์Šค ์ปดํฌ๋„ŒํŠธ์˜ componentDidMount๋‚˜ componentDidUpdate, componentWillUnmount์™€ ๊ฐ™์ด lifecycle์„ ๋‹ค๋ฃจ๋Š” ๋ชฉ์ ์œผ๋กœ ์ œ๊ณต๋˜์ง€๋งŒ ์ด๋ฅผ ํ•˜๋‚˜์˜ API๋กœ ํ†ตํ•ฉํ•˜์˜€๋‹ค๋Š” ๊ฒƒ์ด ์ฐจ์ด์ ์ด๋‹ค.

 

ํด๋ž˜์Šคํ˜• ์ปดํฌ๋„ŒํŠธ์˜ life cycle

 react์˜ ์›๋ž˜ lifecycle์€ ์œ„์˜ ๊ทธ๋ฆผ๊ณผ ๊ฐ™๋‹ค. react ์ปดํฌ๋„ŒํŠธ side effect์—๋Š” ์ผ๋ฐ˜์ ์œผ๋กœ ์ •๋ฆฌ๊ฐ€ ํ•„์š”ํ•œ ๊ฒƒ๊ณผ ๊ทธ๋ ‡์ง€ ์•Š์€ ๊ฒƒ์ด ์žˆ๋‹ค.

 
์ •๋ฆฌ๊ฐ€ ํ•„์š”ํ•˜์ง€ ์•Š์€ effects

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

componentDidMount() {
    // same code
}
componentDidUpdate() {
    // same code
}
  • ํด๋ž˜์Šค ์ปดํฌ๋„ŒํŠธ

    ํด๋ž˜์Šค ์ปดํฌ๋„ŒํŠธ์—์„œ๋Š” ์ด๋Ÿฌํ•œ side effect๋ฅผ componentDidMount๋‚˜ componentDidUpdate ํ•จ์ˆ˜๋กœ ๋‹ค๋ฃฌ๋‹ค. ์ปดํฌ๋„ŒํŠธ๊ฐ€ ๋ง‰ ๋งˆ์šดํŠธ๋˜๋Š” ๋‹จ๊ณ„์ธ์ง€ ์—…๋ฐ์ดํŠธ๋˜๋Š” ๋‹จ๊ณ„์ธ์ง€์— ๋”ฐ๋ผ ๋‘˜ ์ค‘ ์–ด๋–ค ํ•จ์ˆ˜๋ฅผ ์“ธ ์ง€๊ฐ€ ๋‹ฌ๋ผ์ง€๋ฏ€๋กœ ํ•ญ์ƒ ์‹คํ–‰๋˜๊ฒŒ ํ•˜๋ ค๋ฉด ํด๋ž˜์Šคํ˜• ์ปดํฌ๋„ŒํŠธ์—์„œ๋Š” ์ค‘๋ณต๋œ ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•ด์•ผํ•œ๋‹ค.

 useEffect(() => {
     // same code
 });
  • ํ•จ์ˆ˜ํ˜• ์ปดํฌ๋„ŒํŠธ

    ํ•จ์ˆ˜ํ˜• ์ปดํฌ๋„ŒํŠธ์—์„œ๋Š” useEffect hook์„ ์‚ฌ์šฉํ•˜์—ฌ ํ•œ๋ฒˆ์— ๋‚˜ํƒ€๋‚ผ ์ˆ˜ ์žˆ๋‹ค. ์ด hook์€ ๋งˆ์šดํŒ…๊ณผ ์—…๋ฐ์ดํŠธ์˜ ๊ฐœ๋…์ด ์—†์ด ๋ Œ๋”๋ง ์ดํ›„์— ๋งค๋ฒˆ ์ˆ˜ํ–‰๋œ๋‹ค.

 
์ •๋ฆฌ๊ฐ€ ํ•„์š”ํ•œ effects

 ์ •๋ฆฌ๊ฐ€ ํ•„์š”ํ•œ effects๋Š” ์™ธ๋ถ€ ๋ฐ์ดํ„ฐ์— ๊ตฌ๋…์„ ์„ค์ •ํ•ด์•ผํ•˜๋Š” ๊ฒฝ์šฐ๋ฅผ ๋“ค ์ˆ˜ ์žˆ๋‹ค. ์ด๋Ÿฐ ๊ฒฝ์šฐ ๋ฉ”๋ชจ๋ฆฌ ๋ˆ„์ˆ˜๊ฐ€ ๋ฐœ์ƒํ•˜์ง€ ์•Š๋„๋ก ๋ฐ์ดํ„ฐ๋ฅผ ์ •๋ฆฌํ•˜๋Š” ๊ฒƒ์ด ๋งค์šฐ ์ค‘์š”ํ•˜๋‹ค.

  • ํด๋ž˜์Šค ์ปดํฌ๋„ŒํŠธ

    ํด๋ž˜์Šค ์ปดํฌ๋„ŒํŠธ์—์„œ๋Š” componentDidMount ํ•จ์ˆ˜์—์„œ ๊ตฌ๋…์„ ์„ค์ •ํ•œ ํ›„, componentWillUnmountํ•จ์ˆ˜์—์„œ ์ด๋ฅผ ์ •๋ฆฌํ•œ๋‹ค.

  • ํ•จ์ˆ˜ํ˜• ์ปดํฌ๋„ŒํŠธ

    ํ•จ์ˆ˜ํ˜• ์ปดํฌ๋„ŒํŠธ์—์„œ๋Š” useEffect hook์—์„œ ์ด๋ฅผ ํ•จ๊ป˜ ๋‹ค๋ฃจ์–ด์•ผํ•œ๋‹ค. useEffect์—์„œ ์ •๋ฆฌ๋ฅผ ์œ„ํ•œ ํ•จ์ˆ˜๋Š” return์œผ๋กœ ๋ฐ˜ํ™˜ํ•ด์ค„ ์ˆ˜ ์žˆ๋‹ค. ๋”ฐ๋ผ์„œ ๊ตฌ๋…์˜ ๋กœ์ง์€ useEffect hook ๋‚ด์— ์ •์˜ํ•˜๊ณ , ์ •๋ฆฌ๋ฅผ ์œ„ํ•œ ๋กœ์ง์€ return์œผ๋กœ ๋ฐ˜ํ™˜ํ•ด์ฃผ๋ฉด ๋œ๋‹ค.

    ๋”ฐ๋ผ์„œ ๊ตฌ๋…์ด๋ผ๋Š” ํ•˜๋‚˜์˜ ๋กœ์ง๊ณผ ๊ด€๋ จ๋œ ์š”์†Œ๊ฐ€ ํด๋ž˜์Šค์™€๋Š” ๋‹ฌ๋ฆฌ ํ•จ์ˆ˜ํ˜• ์ปดํฌ๋„ŒํŠธ์—์„œ๋Š” ํ•œ ๊ณณ์— ๋ฌถ์—ฌ์žˆ๊ฒŒ ๋œ๋‹ค.

 ์ด๋ ‡๊ฒŒ Hook์„ ์‚ฌ์šฉํ•˜๋ฉด ํด๋ž˜์Šคํ˜• ์ปดํฌ๋„ŒํŠธ์™€๋Š” ๋‹ค๋ฅด๊ฒŒ ์ƒ๋ช…์ฃผ๊ธฐ ๋ฉ”์„œ๋“œ๊ฐ€ ์•„๋‹ˆ๋ผ ํŠน์ • ๊ธฐ์ค€์— ๋”ฐ๋ผ ๋กœ์ง๋“ค์„ ๋‚˜๋ˆŒ ์ˆ˜๊ฐ€ ์žˆ๋‹ค.

useEffect์—์„œ ๊ตฌ๋…๊ณผ ์ •๋ฆฌ๋ฅผ ๋™์‹œ์— ๋‹ค๋ฃธ์œผ๋กœ์จ ํ•˜๋‚˜์˜ ๋กœ์ง์„ ๋ฌถ์–ด์„œ ๋‹ค๋ฃฐ ์ˆ˜๋Š” ์žˆ๊ฒŒ ๋˜์—ˆ๋‹ค. ๊ทธ๋ ‡๋‹ค๋ฉด ๊ด€๋ จ์ด ์—†๋Š” ๋กœ์ง๋“ค์€ ์–ด๋–ป๊ฒŒ ๊ตฌ๋ถ„ํ• ๊นŒ?

useEffect hook๋„ useState์™€ ๊ฐ™์ด ์—ฌ๋Ÿฌ๋ฒˆ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค. ๋”ฐ๋ผ์„œ ๋‹ค๋ฅธ hook์— ์ •์˜ํ•จ์œผ๋กœ์จ ์„œ๋กœ ๊ด€๋ จ์ด ์—†๋Š” ๋กœ์ง๋“ค์€ ๊ฐˆ๋ผ๋†“์„ ์ˆ˜ ์žˆ๋‹ค. react๋Š” ์ด hook๋“ค์„ ์ง€์ •๋œ ์ˆœ์„œ์— ๋”ฐ๋ผ ์ ์šฉํ•œ๋‹ค.

 

๊ธฐํƒ€ ์ฃผ์ œ

useEffect๋Š” ๋žœ๋”๋ง ๋•Œ๋งˆ๋‹ค ์‹คํ–‰๋˜๋Š”๋ฐ, ๋งค๋ฒˆ ์ •๋ฆฌ๋ฅผ ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์„ฑ๋Šฅ์ด ์ €ํ•˜๋  ์ˆ˜๋„ ์žˆ๋‹ค. ์ด๋ฅผ ์–ด๋–ป๊ฒŒ ํ•ด๊ฒฐํ• ๊นŒ?

 

ํด๋ž˜์Šค ์ปดํฌ๋„ŒํŠธ์—์„œ๋Š” componentDidUpdate ํ•จ์ˆ˜์˜ ๋งค๊ฐœ๋ณ€์ˆ˜๋กœ prevProps์™€ prevState๋ฅผ ๋ฐ›์„ ์ˆ˜ ์žˆ๋‹ค. ์ด์™€ ๊ฐ™์ด hook์—์„œ๋„ ์ด ๋‘ ์š”์†Œ๊ฐ€ ๋ณ€๊ฒฝ๋˜์ง€ ์•Š์•˜๋‹ค๋ฉด effect๋ฅผ ๊ฑด๋„ˆ๋›ฐ๋„๋ก ํ•  ์ˆ˜ ์žˆ๋‹ค.

useEffect(() => {
  document.title = `You clicked ${count} times`;
}, [count]); 
// count๊ฐ€ ๋ฐ”๋€” ๋•Œ๋งŒ effect๋ฅผ ์žฌ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค.

์ด๋ ‡๊ฒŒ useEffect์˜ ์„ ํƒ์  ์ธ์ˆ˜์ธ ๋‘ ๋ฒˆ์งธ ์ธ์ˆ˜๋กœ ๋ฐฐ์—ด์„ ๋„˜๊ธฐ๋ฉด ๋œ๋‹ค. ์œ„์˜ ์˜ˆ์ œ์—์„œ count๊ฐ€ ์ด์ „ ๊ฐ’๊ณผ ๊ฐ™์œผ๋ฉด useEffect๋Š” ์‹คํ–‰๋˜์ง€ ์•Š์„ ๊ฒƒ์ด๋‹ค.

 

 

componentDidUpdate ํ•จ์ˆ˜๋Š” ๊ธฐ์กด์ด ์–ด๋–ค ์—ญํ• ์ด์—ˆ์œผ๋ฉฐ, useEffect๋กœ ๋ฐ”๋€ ํ›„ ์–ด๋–ค ๊ฒƒ์ด ๋ณ€ํ™”ํ–ˆ์„๊นŒ?

 

componentDidupdateํ•จ์ˆ˜๋Š” ํด๋ž˜์Šคํ˜• ์ปดํฌ๋„ŒํŠธ์—์„œ ์ด์ „ ๋ฐ์ดํ„ฐ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋ฒ„๊ทธ๊ฐ€ ์ผ์–ด๋‚˜๋Š” ๊ฒฝ์šฐ๋ฅผ ๋ฐฉ์ง€ํ•˜๋Š” ์—ญํ• ์„ ์ˆ˜ํ–‰ํ•œ๋‹ค. ํ•จ์ˆ˜ํ˜• ์ปดํฌ๋„ŒํŠธ์—์„œ๋Š” useEffect ์ž์ฒด๊ฐ€ ์—…๋ฐ์ดํŠธ๋ฅผ ๋‹ค๋ฃจ๊ธฐ ๋•Œ๋ฌธ์— ๋”ฐ๋กœ ๊ตฌ์„ฑํ•˜์ง€ ์•Š์•„๋„ ๋œ๋‹ค. ์—…๋ฐ์ดํŠธ์™€ ๋™์‹œ์— ์ด์ „ state๋ฅผ ์ •๋ฆฌํ•ด์ฃผ๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.

 

Hook์˜ ๊ทœ์น™

  1. ์ตœ์ƒ์œ„์—์„œ๋งŒ ํ˜ธ์ถœํ•ด์•ผํ•œ๋‹ค.

๋ฐ˜๋ณต๋ฌธ, ์กฐ๊ฑด๋ฌธ ํ˜น์€ ์ค‘์ฒฉ๋œ ํ•จ์ˆ˜ ๋‚ด์—์„œ Hook์„ ํ˜ธ์ถœํ•˜๋ฉด ์•ˆ๋œ๋‹ค. ์ด ๊ทœ์น™์„ ๋”ฐ๋ฅธ๋‹ค๋ฉด ์ปดํฌ๋„ŒํŠธ๊ฐ€ ๋ Œ๋”๋ง ๋  ๋•Œ๋งˆ๋‹ค ํ•ญ์ƒ ๋™์ผํ•œ ์ˆœ์„œ๋กœ Hook์ด ํ˜ธ์ถœ๋œ๋‹ค. ์ด๋Š” react๊ฐ€ useState์™€ useEffect๋ฅผ ์—ฌ๋Ÿฌ ๋ฒˆ ํ˜ธ์ถœํ•˜๋Š” ์ค‘์—๋„ Hook ์ƒํƒœ๋ฅผ ์œ ์ง€ํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•ด์ฃผ๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.

 

  1. ์˜ค์ง React ํ•จ์ˆ˜ ๋‚ด์—์„œ๋งŒ ํ˜ธ์ถœํ•ด์•ผํ•œ๋‹ค.

์ผ๋ฐ˜์ ์ธ JS ํ•จ์ˆ˜์—์„œ Hook์„ ํ˜ธ์ถœํ•˜๋ฉด ์•ˆ๋œ๋‹ค.

์ด ๋‘ ๊ทœ์น™์„ ๊ฐ•์ œํ•˜๋Š” ํ”Œ๋Ÿฌ๊ทธ์ธ์€ eslint-plugin-react-hooks์ด๊ณ  ์ด๋ฅผ ํ”„๋กœ์ ํŠธ์— ์ถ”๊ฐ€ํ•  ์ˆ˜ ์žˆ๋‹ค. Create React App์—๋Š” ๊ธฐ๋ณธ์ ์œผ๋กœ ํฌํ•จ๋˜์–ด์žˆ๋‹ค.

 

Hook API

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

๋ฐ˜์‘ํ˜•