Front/React.js

[React] ๋ฆฌ์•กํŠธ Hook (ํ›…)

ddo04 2024. 8. 28. 00:50
728x90

๐Ÿ›œ useCounter() Custom Hook ๋งŒ๋“ค๊ธฐ

  • useCounter Hook์€ ์ดˆ๊ธฐ ์นด์šด๋“œ ๊ฐ’์„ ํŒŒ๋ผ๋ฏธํ„ฐ๋กœ ๋ฐ›์•„์„œ ์นด์šดํŠธ๋ผ๋Š” ์ด๋ฆ„์˜ state๋ฅผ ์ƒ์„ฑํ•˜์—ฌ ๊ฐ’์„ ์ œ๊ณตํ•˜๊ณ  ์นด์šดํŠธ ์ฆ๊ฐ€ ๋ฐ ๊ฐ์†Œ๋ฅผ ํŽธ๋ฆฌํ•˜๊ฒŒ ํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•จ์ˆ˜๋ฅผ ์ œ๊ณตํ•˜๋Š” Hook
  • useCounter Hook์„ ์‚ฌ์šฉํ•˜๋ฉด ์–ด๋–ค ํ•จ์ˆ˜ ์ปดํฌ๋„ŒํŠธ์—์„œ๋“ ์ง€ ์นด์šดํŠธ ๊ธฐ๋Šฅ์„ ์‰ฝ๊ฒŒ ์‚ฌ์šฉ ๊ฐ€๋Šฅ

๐Ÿ›œ Accommodate Component ๋งŒ๋“ค๊ธฐ

  • Accommodate ์ปดํฌ๋„ŒํŠธ๋Š” useCount ํ›…์„ ์‚ฌ์šฉํ•˜์—ฌ ์นด์šดํŠธ๋ฅผ ๊ด€๋ฆฌ
  • ์ตœ๋Œ€ ์นด์šดํŠธ ๊ฐœ์ˆ˜๋Š” maxCapacity๋ผ๋Š” ์ด๋ฆ„์˜ ์ƒ์ˆ˜๋กœ ์ •์˜๋˜์–ด ์žˆ๊ณ  ์นด์šดํŠธ ๊ฐœ์ˆ˜๊ฐ€ ์ตœ๋Œ€ ์šฉ๋Ÿ‰์„ ์ดˆ๊ณผํ•˜๋ฉด ๊ฒฝ๊ณ  ๋ฌธ๊ตฌ๊ฐ€ ํ‘œ์‹œ๋˜๋ฉฐ ๋” ์ด์ƒ ์ž…์žฅ์ด ๋ถˆ๊ฐ€๋Šฅ
  • useEffect ํ›…์˜ ์ž‘๋™ ๋ฐฉ์‹์„ ์‚ฌ์šฉํ•˜๊ธฐ ์œ„ํ•ด ์ผ๋ถ€๋Ÿฌ ๋‘ ๊ฐœ์˜ useEffect ํ›…์„ ์‚ฌ์šฉ
  • ํ•˜๋‚˜๋Š” ์˜์กด์„ฑ ๋ฐฐ์—ด์ด ์—†๋Š” ํ˜•ํƒœ์ด๊ณ  ๋‹ค๋ฅธ ํ•˜๋‚˜๋Š” ์žˆ๋Š” ํ˜•ํƒœ
  • ์˜์กด์„ฑ ๋ฐฐ์—ด์ด ์—†๋Š” useEffectHook์€ ์ปดํฌ๋„ŒํŠธ๊ฐ€ ๋งˆ์šดํŠธ ๋œ ์งํ›„์— ํ˜ธ์ถœ๋˜๋ฉฐ ์ดํ›„ ์ปดํฌ๋„ŒํŠธ๊ฐ€ ์—…๋ฐ์ดํŠธ๋  ๋•Œ๋งˆ๋‹ค ํ˜ธ์ถœ
  • ์˜์กด์„ฑ ๋ฐฐ์—ด์ด ์žˆ๋Š” useEffectHook์€ ์ปดํฌ๋„ŒํŠธ๊ฐ€ ๋งˆ์šดํŠธ๋œ ์งํ›„์— ํ˜ธ์ถœ๋˜๋ฉฐ ์ดํ›„ ์นด์šดํŠธ ๊ฐ’์ด ๋ฐ”๋€” ๋•Œ๋งˆ๋‹ค ํ˜ธ์ถœ๋˜๋Š”๋ฐ ์ด๋•Œ ์šฉ๋Ÿ‰์ด ๊ฐ€๋“ ์ฐผ๋Š”์ง€ ์•„๋‹Œ์ง€์˜ ์ƒํƒœ๋ฅผ isFull์ด๋ผ๋Š” ์Šคํ…Œ์ดํŠธ์— ์ €์žฅ
  • ์˜์กด์„ฑ์ด ์—†๋Š” ๋ฐฐ์—ด์ด useEffect ํ›…์ด ํ˜ธ์ถœ๋œ ์ด์œ ๋Š” ์ปดํฌ๋„ŒํŠธ๊ฐ€ ์—…๋ฐ์ดํŠธ ๋๊ธฐ ๋•Œ๋ฌธ์ž„
  • ์˜์กด์„ฑ ๋ฐฐ์—ด์ด ์žˆ๋Š” useEffect ํ›…์ด ํ˜ธ์ถœ๋œ ์ด์œ ๋Š” ์นด์šดํŠธ ๊ฐ’์ด ๋ณ€๊ฒฝ๋˜์—ˆ๊ธฐ ๋•Œ๋ฌธ์ž„
  • ์ •์›์ด ๊ฐ€๋“ ์ฐจ๋ฉด isFull์˜ ๊ฐ’์ด true๊ฐ€ ๋˜๊ธฐ ๋•Œ๋ฌธ์— ์ž…์žฅ ๋ฒ„ํŠผ์ด ๋น„ํ™œ์„ฑํ™”๋˜์–ด ๋” ์ด์ƒ ๋ˆ„๋ฅผ ์ˆ˜ ์—†๊ฒŒ ๋˜๊ณ  ๋นจ๊ฐ„ ๊ธ€์”จ๋กœ ๊ฒฝ๊ณ  ๋ฌธ๊ตฌ๊ฐ€ ์ถœ๋ ฅ
  • ๋กœ๊ทธ์—์„œ ์นด์šดํŠธ ๊ฐ’์ด 10์ด ๋œ ์ดํ›„์— ๋” ์ด์ƒ ๋ณ€ํ•˜์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์— ์นด์šดํŠธ๋ฅผ ์˜์กด์„ฑ ๋ฐฐ์—ด์— ๊ฐ–๊ณ  ์žˆ๋Š” useEffectHook์€ ํ˜ธ์ถœ๋˜์ง€ ์•Š๋Š” ๊ฒƒ์„ ๋ณผ ์ˆ˜ ์žˆ์Œ
  • useCounterHook์—์„œ Math.max ํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์นด์šดํŠธ ๊ฐ’์ด 0 ์•„๋ž˜๋กœ ๋‚ด๋ ค๊ฐˆ ์ˆ˜ ์—†๊ฒŒ ๋งŒ๋“ค์–ด๋†จ๊ธฐ ๋•Œ๋ฌธ์— ๊ฐ’์ด 0์ด ๋˜๋ฉด ๋” ์ด์ƒ useEffect Hook๋„ ํ˜ธ์ถœ๋˜์ง€ ์•Š์Œ

๐Ÿ›œ Hooks

  • Hook์„ ์‚ฌ์šฉํ•˜๋ฉด ํ•จ์ˆ˜ ์ปดํฌ๋„ŒํŠธ๋„ ํด๋ž˜์Šค ์ปดํฌ๋„ŒํŠธ์˜ ๊ธฐ๋Šฅ์„ ๋ชจ๋‘ ๋™์ผํ•˜๊ฒŒ ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ์Œ
  • ์›๋ž˜ ์กด์žฌํ•˜๋Š” ์–ด๋–ค ๊ธฐ๋Šฅ์— ๊ฐˆ๊ณ ๋ฆฌ๋ฅผ ๊ฑฐ๋Š” ๊ฒƒ์ฒ˜๋Ÿผ ๋ผ์–ด ๋“ค์–ด๊ฐ€ ๊ฐ™์ด ์ˆ˜ํ–‰๋˜๋Š” ๊ฒƒ์„ ์˜๋ฏธ
  • React์˜ state์™€ ์ƒ๋ช…์ฃผ๊ธฐ ๊ธฐ๋Šฅ์˜ ๊ฐˆ๊ณ ๋ฆฌ๋ฅผ ๊ฑธ์–ด ์›ํ•˜๋Š” ์‹œ์ ์— ์ •ํ•ด์ง„ ํ•จ์ˆ˜๋ฅผ ์‹คํ–‰๋˜๋„๋ก ๋งŒ๋“  ๊ฒƒ
  • ์‹คํ–‰๋˜๋Š” ํ•จ์ˆ˜๋ฅผ hook์ด๋ผ๊ณ  ๋ถ€๋ฅด๊ธฐ๋กœ ์ •ํ•จ
  • hook์˜ ์ด๋ฆ„์€ use๋กœ ์‹œ์ž‘
  • hook์ด ์ˆ˜ํ–‰ํ•˜๋Š” ๊ธฐ๋Šฅ์— ๋”ฐ๋ผ ์ด๋ฆ„์„ ์ง“๊ฒŒ ๋˜์—ˆ๋Š”๋ฐ ๊ฐ ๊ธฐ๋Šฅ์„ ์‚ฌ์šฉํ•˜๊ฒ ๋‹ค๋Š” ์˜๋ฏธ๋กœ use๋ฅผ ๋ถ™์ž„
  • ๊ฐœ๋ฐœ์ž๊ฐ€ ์ง์ ‘ ์ปค์Šคํ…€ ํ›…์„ ๋งŒ๋“ค์–ด์„œ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š”๋ฐ ์ปค์Šคํ…€ ํ˜น์€ ๊ฐœ๋ฐœ์ž ๋งˆ์Œ๋Œ€๋กœ ์ด๋ฆ„์„ ์ง€์„ ์ˆ˜ ์žˆ์ง€๋งŒ ๋’ค์—์„œ ๋ฐฐ์šธ ํ›…์˜ ๊ทœ์น™์— ๋”ฐ๋ผ ์ด๋ฆ„ ์•ž์— use๋ฅผ ๋ถ™์—ฌ์„œ ํ›…์ด๋ผ๋Š” ๊ฒƒ์„ ๋‚˜ํƒ€๋‚ด ์ฃผ์–ด์•ผ ํ•จ
  • state๋ฅผ ์ด์šฉํ•˜์—ฌ ๋ Œ๋”๋ง์— ํ•„์š”ํ•œ ๋ฐ์ดํ„ฐ๋ฅผ ๊ด€๋ฆฌ

๐Ÿ›œ useState()

  • state๋ฅผ ์‚ฌ์šฉํ•˜๊ธฐ ์œ„ํ•œ hook
  • ํ•จ์ˆ˜ ์ปดํฌ๋„ŒํŠธ์—์„œ๋Š” ๊ธฐ๋ณธ์ ์œผ๋กœ state๋ผ๋Š” ๊ฒƒ์„ ์ œ๊ณตํ•˜์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์— class ์ปดํฌ๋„ŒํŠธ์ฒ˜๋Ÿผ state๋ฅผ ์‚ฌ์šฉํ•˜๊ณ  ์‹ถ์œผ๋ฉด useState hook๋ฅผ ์‚ฌ์šฉํ•ด์•ผ ํ•จ
import React, {useState} from "react";

function Counter(props) {
	var count = 0;
    
    return (
    	<div>
        	<p>์ด {count}๋ฒˆ ํด๋ฆญํ–ˆ์Šต๋‹ˆ๋‹ค.</p>
            <button onClick={() => count++}>
            	ํด๋ฆญ
            </button>
        </div>
    );
}
  • ์นด์šดํ„ฐ ์ปดํฌ๋„ŒํŠธ๋Š” ๋ฒ„ํŠผ์„ ํด๋ฆญํ•˜๋ฉด ์นด์šดํŠธ๋ฅผ ํ•˜๋‚˜์”ฉ ์ฆ๊ฐ€์‹œํ‚ค๊ณ  ํ˜„์žฌ ์นด์šดํŠธ๋ฅผ ๋ณด์—ฌ์ฃผ๋Š” ๋‹จ์ˆœํ•œ ์ปดํฌ๋„ŒํŠธ
  • ์นด์šดํ„ฐ๋ฅผ ํ•จ์ˆ˜์˜ ๋ณ€์ˆ˜๋กœ ์„ ์–ธํ•ด์„œ ์‚ฌ์šฉํ•˜๊ฒŒ ๋˜๋ฉด ๋ฒ„ํŠผ ํด๋ฆญ ์‹œ ์นด์šดํŠธ ๊ฐ’์„ ์ฆ๊ฐ€์‹œํ‚ฌ ์ˆ˜๋Š” ์žˆ์ง€๋งŒ ์žฌ๋ Œ๋”๋ง์ด ์ผ์–ด๋‚˜์ง€ ์•Š์•„ ์ƒˆ๋กœ์šด ์นด์šดํ„ฐ ๊ฐ’์ด ํ™”๋ฉด์— ํ‘œ์‹œ๋˜์ง€ ์•Š๊ฒŒ ๋จ
  • state๋ฅผ ์‚ฌ์šฉํ•ด์„œ ๊ฐ’์ด ๋ฐ”๋€” ๋•Œ๋งˆ๋‹ค ์žฌ๋ Œ๋”๋ง ๋˜๋„๋ก ํ•ด์•ผ ํ•˜๋Š”๋ฐ ํ•จ์ˆ˜ ์ปดํฌ๋„ŒํŠธ์—๋Š” ํ•ด๋‹น ๊ธฐ๋Šฅ์ด ๋”ฐ๋กœ ์—†๊ธฐ ๋•Œ๋ฌธ์— useState๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ state๋ฅผ ์„ ์–ธํ•˜๊ณ  ์—…๋ฐ์ดํŠธํ•˜์—ฌ์•ผ ํ•จ
const [๋ณ€์ˆ˜๋ช…, setํ•จ์ˆ˜๋ช…] = useState(์ดˆ๊ธฐ๊ฐ’);
  • useState๋ฅผ ๋…ธ์ถœํ•  ๋•Œ์—๋Š” ํŒŒ๋ผ๋ฏธํ„ฐ๋กœ ์„ ์–ธํ•  state์˜ ์ดˆ๊ธฐ๊ฐ’์ด ๋“ค์–ด๊ฐ
  • ํด๋ž˜์Šค ์ปดํฌ๋„ŒํŠธ์˜ ์ƒ์„ฑ์ž์—์„œ state๋ฅผ ์„ ์–ธํ•  ๋•Œ ์ดˆ๊ธฐ๊ฐ’์„ ๋„ฃ์–ด์ฃผ๋Š” ๊ฒƒ๊ณผ ๋™์ผํ•œ ๊ฒƒ 
  • ์ดˆ๊ธฐ๊ฐ’์„ ๋„ฃ์–ด useState๋ฅผ ๋…ธ์ถœํ•˜๋ฉด return ๊ฐ’์œผ๋กœ ๋ฐฐ์—ด์ด ๋‚˜์˜ด
  • return ๋œ ๋ฐฐ์—ด์—๋Š” ๋‘ ๊ฐ€์ง€ ํ•ญ๋ชฉ์ด ์žˆ๋Š”๋ฐ ์ฒซ ๋ฒˆ์งธ ํ•ญ๋ชฉ์€ state๋กœ ์„ ์–ธ๋œ ๋ณ€์ˆ˜์ด๊ณ  ๋‘ ๋ฒˆ์งธ ํ•ญ๋ชฉ์€ ํ•ด๋‹น state์˜ set ํ•จ์ˆ˜
import React, {useState} from "react";

function Counter(props) {
	const [count, setCount] = useState(0);
    
    return(
    	<div>
        	<p>์ด {count}๋ฒˆ ํด๋ฆญํ–ˆ์Šต๋‹ˆ๋‹ค/</p>
            <button onClick={() => setCount(count + 1)}>
            	ํด๋ฆญ
            </button>
        </div>
    );
};
  • useState๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์นด์šดํŠธ ๊ฐ’์„ state๋กœ ๊ด€๋ฆฌํ•˜๋„๋ก ๋งŒ๋“  ๊ฒƒ
  • state ๋ณ€์ˆ˜๋ช…๊ณผ set ํ•จ์ˆ˜๊ฐ€ ๊ฐ๊ฐ count, setCount๋กœ ๋˜์–ด ์žˆ๋Š” ๊ฒƒ์„ ๋ณผ ์ˆ˜ ์žˆ์Œ
  • ๋ฒ„ํŠผ์ด ๋ˆŒ๋ ธ์„ ๋•Œ setCount ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•ด์„œ ์นด์šดํŠธ 1 ์ฆ๊ฐ€
  • ์นด์šดํŠธ์˜ ๊ฐ’์ด ๋ณ€๊ฒฝ๋˜๋ฉด ์ปดํฌ๋„ŒํŠธ๊ฐ€ ์ œ๋ Œ๋”๋ง ๋˜๋ฉด์„œ ํ™”๋ฉด์— ์ƒˆ๋กœ์šด ์นด์šด๋“œ ๊ฐ’์ด ํ‘œ์‹œ
  • ํด๋ž˜์Šค ์ปดํฌ๋„ŒํŠธ์—์„œ setState ํ•จ์ˆ˜๋ฅผ ํ™์ถœํ•˜์—ฌ state๊ฐ€ ์—…๋ฐ์ดํŠธ๋˜๊ณ  ์ดํ›„ ์ปดํฌ๋„ŒํŠธ๊ฐ€ ์žฌ๋ Œ๋”๋ง ๋˜๋Š” ๊ณผ์ •๊ณผ ๋™์ผ
  • ํด๋ž˜์Šค ์ปดํฌ๋„ŒํŠธ์—์„œ๋Š” setState ํ•จ์ˆ˜ ํ•˜๋‚˜๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋ชจ๋“  state ๊ฐ’์„ ์—…๋ฐ์ดํŠธํ•  ์ˆ˜ ์žˆ์—ˆ์ง€๋งŒ useState๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๋ฐฉ๋ฒ•์—๋Š” ๋ณ€์ˆ˜ ๊ฐ๊ฐ์— ๋Œ€ํ•œ set ํ•จ์ˆ˜๊ฐ€ ๋”ฐ๋กœ ์กด์žฌ

๐Ÿ›œ useEffect()

  • ์‚ฌ์ดํŠธ ์ดํŽ™ํŠธ(side effec) t๋ฅผ ์ˆ˜ํ–‰ํ•˜๊ธฐ ์œ„ํ•œ Hook
  • ์‚ฌ์ดํŠธ ์ดํŽ™ํŠธ๋Š” ๋ถ€์ž‘์šฉ์ด๋ผ๋Š” ์˜๋ฏธ๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ์Œ
  • ๊ฐœ๋ฐœ์ž๊ฐ€ ์˜๋„์น˜ ์•Š์€ ์ฝ”๋“œ๊ฐ€ ์‹คํ–‰๋˜๋ฉด์„œ ๋ฒ„๊ทธ๊ฐ€ ๋‚˜ํƒ€๋‚˜๋ฉด side effect๊ฐ€ ๋ฐœ์ƒํ–ˆ๋‹ค๊ณ  ๋งํ•จ
  •  ๋ฆฌ์•กํŠธ์—์„œ ๋งํ•˜๋Š” side effect๋Š” ํšจ๊ณผ ํ˜น์€ ์˜ํ–ฅ์„ ๋œปํ•˜๋Š” ์˜๋ฏธ์— ๊ฐ€๊นŒ์›€
  •  ์„œ๋ฒ„์—์„œ ๋ฐ์ดํ„ฐ๋ฅผ ๋ฐ›์•„์˜ค๊ฑฐ๋‚˜ ์ˆ˜๋™์œผ๋กœ DOM์„ ๋ณ€๊ฒฝํ•˜๋Š” ๋“ฑ์˜ ์ž‘์—…์„ ์˜๋ฏธ
  •  ๋‹ค๋ฅธ ์ปดํฌ๋„ŒํŠธ์— ์˜ํ–ฅ์„ ๋ฏธ์น  ์ˆ˜ ์žˆ์œผ๋ฉฐ. ๋ Œ๋”๋ง ์ค‘์—๋Š” ์ž‘์—…์ด ์™„๋ฃŒํ•  ์ˆ˜ ์—†๊ธฐ ๋•Œ๋ฌธ์ž„
  • useEffect๋Š” ๋ฆฌ์•กํŠธ์˜ ํ•จ์ˆ˜ ์ปดํฌ๋„ŒํŠธ์—์„œ side effect๋ฅผ ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•ด์ฃผ๋Š” Hook
useEffect(์ดํŽ™ํŠธ ํ•จ์ˆ˜, ์˜์กด์„ฑ ๋ฐฐ์—ด);
  • ์˜์กด์„ฑ ๋ฐฐ์—ด์„ ์˜์กดํ•˜๊ณ  ์žˆ๋Š” ๋ฐฐ์—ด์ธ๋ฐ ๋ฐฐ์—ด ์•ˆ์— ์žˆ๋Š” ๋ณ€์ˆ˜ ์ค‘์— ํ•˜๋‚˜๋ผ๋„ ๊ฐ’์ด ๋ณ€๊ฒฝ๋˜์—ˆ์„ ๋•Œ Effect ํ•จ์ˆ˜ ์‹คํ–‰
  • Effect ํ•จ์ˆ˜๋Š” ์ฒ˜์Œ ์ปดํฌ๋„ŒํŠธ๊ฐ€ ๋ Œ๋”๋ง ๋œ ์ดํ›„์™€ ์—…๋ฐ์ดํŠธ๋กœ ์ธํ•œ ์žฌ๋ Œ๋”๋ง ์ดํ›„์— ์‹คํ–‰
useEffect(์ดํŽ™ํŠธ ํ•จ์ˆ˜, []);
  • ์ดํŽ™ํŠธ ํ•จ์ˆ˜๊ฐ€ mount์™€ unmount์— ๋‹จ ํ•œ ๋ฒˆ์”ฉ๋งŒ ์‹คํ–‰๋˜๊ฒŒ ํ•˜๊ณ  ์‹ถ๋‹ค๋ฉด ๋นˆ ๋ฐฐ์—ด์„ ๋„ฃ์œผ๋ฉด ๋จ
  • ํ•ด๋‹น ์ดํŽ™ํŠธ๊ฐ€ props๋‚˜ state์— ์žˆ๋Š” ์–ด๋–ค ๊ฐ’์—๋„ ์˜์กดํ•˜์ง€ ์•Š๋Š” ๊ฒƒ์ด ๋˜๋ฏ€๋กœ ์—ฌ๋Ÿฌ ๋ฒˆ ์‹คํ–‰๋˜์ง€ ์•Š์Œ
useEffect(์ดํŽ™ํŠธ ํ•จ์ˆ˜);
  • ์˜์กด์„ฑ ๋ฐฐ์—ด์€ ์ƒ๋žตํ•  ์ˆ˜ ์žˆ์ง€๋งŒ ์ƒ๋žตํ•˜๋ฉด ์ปดํฌ๋„ŒํŠธ๊ฐ€ ์—…๋ฐ์ดํŠธ๋  ๋•Œ๋งˆ๋‹ค ํ˜ธ์ถœ
  • ์ปดํฌ๋„ŒํŠธ๊ฐ€ ์ฒ˜์Œ ๋ Œ๋”๋ง ๋  ๋•Œ๋ฅผ ํฌํ•จํ•ด์„œ ๋งค๋ฒˆ ๋ Œ๋”๋ง ๋  ๋•Œ๋งˆ๋‹ค Effect๊ฐ€ ์‹คํ–‰
import React, {useState, useEffect} from "react";

function Counter(props) {
	const [count, setCount] = useState(0);
    
    useEffect(() => {
    	document.title = `you clicked ${count} times`;
    });
    
    return (
    	<div>
        	<p>์ด {count}๋ฒˆ ํด๋ฆญํ–ˆ์Šต๋‹ˆ๋‹ค.</p>
            <button onClick={() => setCount(count + 1)}>
            	ํด๋ฆญ
            </button>
        </div>
    );
}
  • useEffect๋ฅผ ์‚ฌ์šฉํ•ด์„œ ํด๋ž˜์Šค ์ปดํฌ๋„ŒํŠธ์—์„œ ์ œ๊ณตํ•˜๋Š” componentDidMount, componentDidUpdate์™€ ๊ฐ™์€ ์ƒ๋ช…์ฃผ๊ธฐ ํ•จ์ˆ˜์˜ ๊ธฐ๋Šฅ์„ ๋™์ผํ•˜๊ฒŒ ์ˆ˜ํ–‰ํ•˜๋„๋ก ๋งŒ๋“ฆ
  • useEffect ์•ˆ์— ์žˆ๋Š” ์ดํŽ™ํŠธ ํ•จ์ˆ˜์—์„œ๋Š” ๋ธŒ๋ผ์šฐ์ €์—์„œ ์ œ๊ณตํ•˜๋Š” API๋ฅผ ์‚ฌ์šฉํ•ด์„œ ๋„ํ๋จผํŠธ์˜ ํƒ€์ดํ‹€์„ ์—…๋ฐ์ดํŠธ
  • ๋„ํ๋จผํŠธ์˜ ํƒ€์ดํ‹€์€ ๋ธŒ๋ผ์šฐ์ €์—์„œ ํŽ˜์ด์ง€๋ฅผ ์—ด์—ˆ์„ ๋•Œ ์ฐฝ์— ํ‘œ์‹œ๋˜๋Š” ๋ฌธ์ž์—ด
  • ์˜์กด์„ฑ ๋ฐฐ์—ด ์—†์ด useEffect๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด React๋Š” DOM์ด ๋ณ€๊ฒฝ๋œ ์ดํ›„์— ํ•ด๋‹น ์ดํŽ™ํŠธ ํ•จ์ˆ˜๋ฅผ ์‹คํ–‰ํ•˜๋ผ๋Š” ์˜๋ฏธ
  • ๊ธฐ๋ณธ์ ์œผ๋กœ ์ปดํฌ๋„ŒํŠธ๊ฐ€ ์ฒ˜์Œ ๋ Œ๋”๋ง ๋  ๋•Œ๋ฅผ ํฌํ•จํ•ด์„œ ๋งค๋ฒˆ ๋ Œ๋”๋ง ๋  ๋•Œ๋งˆ๋‹ค ์ดํŽ™ํŠธ๊ฐ€ ์‹คํ–‰๋œ๋‹ค๊ณ  ๋ณด๋ฉด ๋จ
  • ์ดํŽ™ํŠธ ํ•จ์ˆ˜๊ฐ€ ์ฒ˜์Œ ์ปดํฌ๋„ŒํŠธ๊ฐ€ ๋งˆ์šดํŠธ ๋˜์—ˆ์„ ๋•Œ ์‹คํ–‰๋˜๊ณ  ์ดํ›„ ์ปดํฌ๋„ŒํŠธ๊ฐ€ ์—…๋ฐ์ดํŠธ๋  ๋•Œ๋งˆ๋‹ค ์‹คํ–‰
  • ๊ฒฐ๊ณผ์ ์œผ๋กœ ์ปดํฌ๋„ŒํŠธ ๋””๋“œ ๋งˆ์šดํŠธ. ์ปดํฌ๋„ŒํŠธ ๋‹ค๋“œ ์—…๋ฐ์ดํŠธ์™€ ๋™์ผํ•œ ์—ญํ• ์„ ํ•˜๊ฒŒ ๋จ
  • Effect๋Š” ํ•จ์ˆ˜ ์ปดํฌ๋„ŒํŠธ ์•ˆ์—์„œ ์„ ์–ธ๋˜๊ธฐ ๋•Œ๋ฌธ์— ํ•ด๋‹น ์ปดํฌ๋„ŒํŠธ์˜ props์™€ state์— ์ ‘๊ทผ ๊ฐ€๋Šฅ
  • count๋ผ๋Š” state์— ์ ‘๊ทผํ•˜์—ฌ ํ•ด๋‹น ๊ฐ’์ด ํฌํ•จ๋œ ๋ฌธ์ž์—ด์„ ์ƒ์„ฑํ•ด์„œ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์„ ๋ณผ ์ˆ˜ ์žˆ์Œ
import React, [useState, useEffect) from "react";

function UserStatus(props){
	const [isOnline. setIsonline] = useState(null);
    
    function handleStatusChange(status){
    	setIsOnline(state.isOnline);
    }
    
    useEffect(() => {
    	ServerAPI.subscribeUserStatus(props.user.id, handleStatusChange);
        return () => {
        	ServerAPI.unsubscribeUserStatus(props.user.id, handleStatusChange);
        };
    });
   	
    if (isOnline === null) {
    	return '๋Œ€๊ธฐ ์ค‘.....';
    }
    return isOnline ? '์˜จ๋ผ์ธ' : '์˜คํ”„๋ผ์ธ';
}
  • ํ•จ์ˆ˜๋ฅผ ํ•˜๋‚˜ ๋ฆฌํ„ดํ•˜๋Š”๋ฐ ํ•ด๋‹น ํ•จ์ˆ˜ ์•ˆ์—๋Š” ๊ตฌ๋…์„ ํ•ด์ง€ํ•˜๋Š” api๋ฅผ ํ˜ธ์ถœํ•˜๋„๋ก ๋˜์–ด ์žˆ์Œ
  • useEffect์—์„œ ๋ฆฌํ„ดํ•˜๋Š” ํ•จ์ˆ˜๋Š” ์ปดํฌ๋„ŒํŠธ๊ฐ€ mount ํ•ด์ œ, ์ฆ‰ unmount ๋  ๋•Œ ํ˜ธ์ถœ   
  • useEffectHook์€ ํ•˜๋‚˜์˜ ์ปดํฌ๋„ŒํŠธ์˜ ์—ฌ๋Ÿฌ ๊ฐœ๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Œ
  • useState ํ›…๊ณผ useEffect ํ›…์„ ๊ฐ๊ฐ ๋‘ ๊ฐœ์”ฉ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์„ ๋ณผ ์ˆ˜ ์žˆ์Œ
useEffect(() => {
	// ์ปดํฌ๋„ŒํŠธ๊ฐ€ ๋งˆ์šดํŠธ ๋œ ์ดํ›„,
    // ์˜์กด์„ฑ ๋ฐฐ์—ด์— ์žˆ๋Š” ๋ณ€์ˆ˜๋“ค ์ค‘ ํ•˜๋‚˜๋ผ๋„ ๊ฐ’์ด ๋ณ€๊ฒฝ๋˜์—ˆ์„ ๋•Œ ์‹คํ–‰๋จ
    // ์˜์กด์„ฑ ๋ฐฐ์—ด์— ๋นˆ ๋ฐฐ์—ด์„ ๋„ฃ์œผ๋ฉด ๋งˆ์šดํŠธ์™€ ์–ธ๋งˆ์šดํŠธ์‹œ์— ๋‹จ ํ•œ ๋ฒˆ์”ฉ๋งŒ ์‹คํ–‰๋จ
    // ์˜์กด์„ฑ ๋ฐฐ์—ด ์ƒ๋žต ์‹œ ์ปดํฌ๋„ŒํŠธ ์—…๋ฐ์ดํŠธ ์‹œ๋งˆ๋‹ค ์‹คํ–‰๋จ
    ...
    
    return () => {
    	// ์ปดํฌ๋„ŒํŠธ๊ฐ€ ๋งˆ์šดํŠธ๋ฅผ ํ•ด์ œ๋˜๊ธฐ ์ „์— ์‹คํ–‰๋จ
        ...
    }
}, [์˜์กด์„ฑ ๋ณ€์ˆ˜1, ์˜์กด์„ฑ ๋ณ€์ˆ˜2,....]);
  • Effect ํ•จ์ˆ˜์™€ ์˜์กด์„ฑ ๋ฐฐ์—ด์ด ๋“ค์–ด๊ฐ€๊ณ  ์ปดํฌ๋„ŒํŠธ๊ฐ€ ๋งˆ์šดํŠธ ๋œ ์ดํ›„ ์˜์กด์„ฑ ๋ฐฐ์—ด์— ์žˆ๋Š” ๋ณ€์ˆ˜ ์ค‘์— ํ•˜๋‚˜๋ผ๋„ ๊ฐ’์ด ๋ณ€๊ฒฝ๋˜์—ˆ์„ ๋•Œ ์‹คํ–‰
  • ์˜์กด์„ฑ ๋ฐฐ์—ด์— ๋นˆ ๋ฐฐ์—ด์„ ๋„ฃ์œผ๋ฉด ๋งˆ์šดํŠธ์™€ ์›๋งˆ์šดํŠธ ์‹œ์— ๋‹จ ํ•œ ๋ฒˆ์”ฉ๋งŒ ์‹คํ–‰
  • ์˜์กด์„ฑ ๋ฐฐ์—ด ์ƒ๋žต ์‹œ์—๋Š” ์ปดํฌ๋„ŒํŠธ ์—…๋ฐ์ดํŠธ ์‹œ๋งˆ๋‹ค ์‹คํ–‰

๐Ÿ›œ useMemo()

  • useMemo ํ˜น์€ memoized value๋ฅผ ๋ฆฌ๋Ÿฐ ํ•˜๋Š” ํ›…
  • memoized value๋Š” useMemo ํ›…๊ณผ ๋ฐ”๋กœ ๋’ค์— ๋‚˜์˜ฌ useCallback ํ›…์„ ์ดํ•ดํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” memoized value์— ๋Œ€ํ•ด ์•Œ๊ณ  ์žˆ์–ด์•ผ ํ•จ
  • useMemo์™€ useCallback ํ›…์—์„œ๋Š” memoization์ด๋ผ๋Š” ๊ฐœ๋…์ด ๋‚˜์˜ด
  • memoization์€ ์ตœ์ ํ™”๋ฅผ ์œ„ํ•ด ์‚ฌ์šฉํ•˜๋Š” ๊ฐœ๋…
  • ๋น„์šฉ์ด ๋†’์€, ์—ฐ์‚ฐ๋Ÿ‰์ด ๋งŽ์ด ๋“œ๋Š” ํ•จ์ˆ˜์˜ ํ˜ธ์ถœ ๊ฒฐ๊ณผ๋ฅผ ์ €์žฅํ•ด ๋‘์—ˆ๋‹ค๊ฐ€ ๊ฐ™์€ ์ž…๋ ฅ ๊ฐ’์œผ๋กœ ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•˜๋ฉด ์ƒˆ๋กœ ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•˜์ง€ ์•Š๊ณ  ์ด์ „์— ์ €์žฅํ•ด ๋†จ๋˜ ํ˜ธ์ถœ ๊ฒฐ๊ณผ๋ฅผ ๋ฐ”๋กœ ๋ฐ˜ํ™˜ํ•˜๋Š” ๊ฒƒ
  • ์ด๋Ÿฌํ•œ ๋ฐฉ์‹์„ ์‚ฌ์šฉํ•˜๋ฉด ๊ฒฐ๊ณผ์ ์œผ๋กœ ํ•จ์ˆ˜ ํ˜ธ์ถœ ๊ฒฐ๊ณผ๋ฅผ ๋ฐ›๊ธฐ๊นŒ์ง€ ๊ฑธ๋ฆฌ๋Š” ์‹œ๊ฐ„๋„ ์งง์•„์ง€๊ณ  ๋ถˆํ•„์š”ํ•œ ์ค‘๋ณต ์—ฐ์‚ฐ์„ ํ•˜์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์— ์ปดํ“จํ„ฐ์˜ ์ž์›์„ ์ ๊ฒŒ ์‚ฌ์šฉ
  • ๋ฉ”๋ชจ์ด์ œ์ด์…˜์˜ ๋ฉ”๋ชจ๋Š” ์šฐ๋ฆฌ๊ฐ€ ํ”ํžˆ ๋ฉ”๋ชจํ•˜๋‹ค๋ผ๊ณ  ํ‘œํ˜„ํ•˜๋Š” ๊ฒƒ๊ณผ ๋น„์Šทํ•œ ๋งฅ๋ฝ์ด๋ผ๊ณ  ์ƒ๊ฐํ•˜๋ฉด ์‰ฝ๊ฒŒ ์ดํ•ด ๊ฐ€๋Šฅ
  • ๋ฉ”๋ชจ๋ฅผ ํ•ด๋‘์—ˆ๋‹ค๊ฐ€ ๋‹ค์‹œ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ
const memoizedValue = useMemo(
	() => {
    	// ์—ฐ์‚ฐ๋Ÿ‰์ด ๋†’์€ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•˜์—ฌ ๊ฒฐ๊ณผ๋ฅผ ๋ฐ˜ํ™˜
        return computeExpensiveValue(์˜์กด์„ฑ ๋ณ€์ˆ˜1. ์˜์กด์„ฑ ๋ณ€์ˆ˜2);
    },
    [์˜์กด์„ฑ ๋ณ€์ˆ˜1. ์˜์กด์„ฑ ๋ณ€์ˆ˜2]
);
  • ๋ฉ”๋ชจ์ด์ œ์ด์…˜์˜ ๊ฐœ๋…์ฒ˜๋Ÿผ ์˜์กด์„ฑ ๋ฐฐ์—ด์— ๋“ค์–ด์žˆ๋Š” ๋ณ€์ˆ˜๊ฐ€ ๋ณ€ํ–ˆ์„ ๊ฒฝ์šฐ์—๋งŒ ์ƒˆ๋กœ create ํ•จ์ˆ˜๋ฅผ ๋…ธ์ถœํ•˜์—ฌ ๊ฒฐ๊ด๊ฐ’์„ ๋ฐ˜ํ™˜ํ•˜๋ฉฐ ๊ทธ๋ ‡์ง€ ์•Š์€ ๊ฒฝ์šฐ์—๋Š” ๊ธฐ์กดํ•จ์ˆ˜์˜ ๊ฒฐ๊ณผ๊ฐ’์„ ๊ทธ๋Œ€๋กœ ๋ฐ˜ํ™˜
  • useMemo ํ›…์„ ์‚ฌ์šฉํ•˜๋ฉด ์ปดํฌ๋„ŒํŠธ๊ฐ€ ๋‹ค์‹œ ๋ Œ๋”๋ง ๋  ๋•Œ๋งˆ๋‹ค ์—ฐ์‚ฐ๋Ÿ‰์ด ๋†’์€ ์ž‘์—…์„ ๋ฐ˜๋ณตํ•˜๋Š” ๊ฒƒ์„ ํ”ผํ•  ์ˆ˜ ์žˆ์Œ
  • ๊ฒฐ๊ณผ์ ์œผ๋กœ ๋น ๋ฅธ ๋ Œ๋”๋ง ์†๋„๋ฅผ ์–ป์„ ์ˆ˜ ์žˆ์Œ
  • useMemo๋กœ ์ „๋‹ฌ๋œ ํ•จ์ˆ˜๋Š” ๋ Œ๋”๋ง์ด ์ผ์–ด๋‚˜๋Š” ๋™์•ˆ ์‹คํ–‰
  • ๋ Œ๋”๋ง์ด ์ผ์–ด๋‚˜๋Š” ๋™์•ˆ ์‹คํ–‰๋˜์„œ๋Š” ์•ˆ๋  ์ž‘์—…์„ useMemo์˜ ํ•จ์ˆ˜์— ๋„ฃ์œผ๋ฉด ์•ˆ ๋จ
  • ์„œ๋ฒ„์—์„œ ๋ฐ์ดํ„ฐ๋ฅผ ๋ฐ›์•„์˜ค๊ฑฐ๋‚˜ ์ˆ˜๋™์œผ๋กœ DOM์„ ๋ณ€๊ฒฝํ•˜๋Š” ์ž‘์—… ๋“ฑ์€ ๋ Œ๋”๋ง์ด ์ผ์–ด๋‚˜๋Š” ๋™์•ˆ ์‹คํ–‰๋˜์„œ๋Š” ์•ˆ๋˜๊ธฐ ๋•Œ๋ฌธ์— useMemo ํ›… ํ•จ์ˆ˜์— ๋„ฃ์œผ๋ฉด ์•ˆ ๋˜๊ณ  useEffect ํ›… ์‚ฌ์šฉ
const memoizedValue = useMemo(
	() => computerExpensiveValue(a, b)
);
  • ์˜์กด์„ฑ ๋ฐฐ์—ด์„ ๋„ฃ์ง€ ์•Š์„ ๊ฒฝ์šฐ ๋ Œ๋”๋ง์ด ์ผ์–ด๋‚  ๋•Œ๋งˆ๋‹ค ๋งค๋ฒˆ create ํ•จ์ˆ˜ ์‹คํ–‰
  • useMemo ํ›…์— ์˜์กด์„ฑ ๋ฐฐ์—ด์„ ๋„ฃ์ง€ ์•Š๊ณ  ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์€ ์•„๋ฌด๋Ÿฐ ์˜๋ฏธ๊ฐ€ ์—†์Œ
const memoizedValue = useMemo(
	() => {
    	return computeExpensiveValue(a, b);
    },
    []
);
  • ์˜์กด์„ฑ ๋ฐฐ์—ด์— ๋นˆ ๋ฐฐ์—ด์„ ๋„ฃ๊ฒŒ ๋˜๋ฉด ์ปดํฌ๋„ŒํŠธ๊ฐ€ ๋งˆ์šดํŠธ ๋  ๋•Œ๋งŒ createํ•จ์ˆ˜๊ฐ€ ํ˜ธ์ถœ
  • ๋งˆ์šดํŠธ ์ดํ›„์—๋Š” ๊ฐ’์ด ๋ณ€๊ฒฝ๋˜์ง€ ์•Š์Œ
  • ๋Œ€๋ถ€๋ถ„ useMemo ํ›…์— ์˜์กด์„ฑ ๋ฐฐ์—ด์˜ ๋ณ€์ˆ˜๋“ค์„ ๋„ฃ๊ณ  ํ•ด๋‹น ๋ณ€์ˆ˜๋“ค์˜ ๊ฐ’์ด ๋ฐ”๋€œ์— ๋”ฐ๋ผ ์ƒˆ๋กœ ๊ฐ’์„ ๊ณ„์‚ฐํ•ด์•ผ ํ•  ๊ฒฝ์šฐ์— ์‚ฌ์šฉ

๐Ÿ›œ useCallback()

  • useMemoHook๊ณผ ์œ ์‚ฌํ•œ ์—ญํ• ์„ ํ•˜์ง€๋งŒ ๊ฐ’์ด ์•„๋‹Œ ํ•จ์ˆ˜๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค๋Š” ์ ์—์„œ ๋‹ค๋ฆ„
  • ์ปดํฌ๋„ŒํŠธ๊ฐ€ ๋ Œ๋”๋ง ๋  ๋•Œ๋งˆ๋‹ค ๋งค๋ฒˆ ํ•จ์ˆ˜๋ฅผ ์ƒˆ๋กœ ์ •์˜ํ•˜๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๋ผ ์˜์กด ๋ฐฐ์—ด์˜ ๊ฐ’์ด ๋ฐ”๋€ ๊ฒฝ์šฐ์—๋งŒ ํ•จ์ˆ˜๋ฅผ ์ƒˆ๋กœ ์ •์˜ํ•˜์—ฌ ๋ฆฌํ„ด
const memoizedCallback = useCallback(
	() => {
    	doSomething(์˜์กด์„ฑ ๋ณ€์ˆ˜1, ์˜์กด์„ฑ ๋ณ€์ˆ˜2);
    },
    [์˜์กด์„ฑ ๋ณ€์ˆ˜1, ์˜์กด์„ฑ ๋ณ€์ˆ˜2]
);
  • ํ•จ์ˆ˜์™€ ์˜์กด์„ฑ ๋ฐฐ์—ด์„ ํŒŒ๋ผ๋ฏธํ„ฐ๋กœ ๋ฐ›์Œ
  • ์˜์กด์„ฑ ๋ณ€์ˆ˜์— ์žˆ๋Š” ๋ณ€์ˆ˜ ์ค‘ ํ•˜๋‚˜๋ผ๋„ ๋ณ€๊ฒฝ๋˜๋ฉด ๋ฉ”๋ชจ์ด์ œ์ด์…˜๋œ ์ฝœ๋ฐฑ ํ•จ์ˆ˜๋ฅผ ๋ฐ˜ํ™˜
  • ์˜์กด์„ฑ ๋ฐฐ์—ด์— ๋”ฐ๋ผ ๋ฉ”๋ชจ์ด์ฆˆ๋“œ ๊ฐ’์„ ๋ฐ˜ํ™˜ํ•œ๋‹ค๋Š” ์ ์—์„œ๋Š” ์œ ์ฆˆ ๋ฉ”๋ชจ ํ›…๊ณผ ์™„์ „ํžˆ ๋™์ผ
useCallback(ํ•จ์ˆ˜, ์˜์กด์„ฑ ๋ฐฐ์—ด);

useMemo(() => ํ•จ์ˆ˜, ์˜์กด์„ฑ ๋ฐฐ์—ด);
  • ์œ ์ฆˆ ์ฝœ๋ฐฑ ํ›…์„ ์‚ฌ์šฉํ•˜์ง€ ์•Š๊ณ  ์ปดํฌ๋„ŒํŠธ ๋‚ด์— ํ•จ์ˆ˜๋ฅผ ์ •์˜ํ•œ๋‹ค๋ฉด ๋งค๋ฒˆ ๋ Œ๋”๋ง์ด ์ผ์–ด๋‚  ๋•Œ๋งˆ๋‹ค ํ•จ์ˆ˜๊ฐ€ ์ƒˆ๋กœ ์ •์˜
  • useCallbackHook์„ ์‚ฌ์šฉํ•˜์—ฌ ํŠน์ • ๋ณ€์ˆ˜์˜ ๊ฐ’์ด ๋ณ€ํ•œ ๊ฒฝ์šฐ์—๋งŒ ํ•จ์ˆ˜๋ฅผ ๋‹ค์‹œ ์ •์˜ํ•˜๋„๋ก ํ•˜์—ฌ ๋ถˆํ•„์š”ํ•œ ๋ฐ˜๋ณต ์ž‘์—…์„ ์—†์• ์คŒ

๐Ÿ›œ useRef()

  • Reference๋ฅผ ์‚ฌ์šฉํ•˜๊ธฐ ์œ„ํ•œ Hook
  • React์—์„œ ๋ ˆํผ๋Ÿฐ์Šค๋ž€ ํŠน์ • ์ปดํฌ๋„ŒํŠธ์— ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ๋Š” ๊ฐ์ฒด๋ฅผ ์˜๋ฏธ
  • ๋ ˆํผ๋Ÿฐ์Šค ๊ฐ์ฒด๋ฅผ ๋ฐ˜ํ™˜
  • ๋ ˆํผ๋Ÿฐ์Šค ๊ฐ์ฒด์˜ current ์†์„ฑ์€ ํ˜„์žฌ ๋ ˆํผ๋Ÿฐ์Šค ํ•˜๊ณ  ์žˆ๋Š” ์—˜๋ฆฌ๋จผํŠธ๋ฅผ ์˜๋ฏธ
const refContainer = useRef(์ดˆ๊นƒ๊ฐ’);
  • ํŒŒ๋ผ๋ฏธํ„ฐ๋กœ ์ดˆ๊ธฐ๊ฐ’์„ ๋„ฃ์œผ๋ฉด ํ•ด๋‹น ์ดˆ๊ธฐ๊ฐ’์œผ๋กœ ์ดˆ๊ธฐํ™”๋œ ๋ ˆํผ๋Ÿฐ์Šค ๊ฐ์ฒด๋ฅผ ๋ฐ˜ํ™˜
  • ๋ฐ˜ํ™˜๋œ ๋ ˆํผ๋Ÿฐ์Šค ๊ฐ์ฒด๋Š” ์ปดํฌ๋„ŒํŠธ์˜ ๋ผ์ดํ”„ํƒ€์ž„ ์ „์ฒด์— ๊ฑธ์ณ์„œ ์œ ์ง€
  • useRefHook์€ ๋ณ€๊ฒฝ ๊ฐ€๋Šฅํ•œ current๋ผ๋Š” ์†์„ฑ์„ ๊ฐ€์ง„ ํ•˜๋‚˜์˜ ์ƒ์ž๋ผ๊ณ  ์ƒ๊ฐ
function TextInputWithFocusButton(props) {
	const inputElem = useRef(null);
    
    const onButtonClick = () => {
    	inputElem.current.focus();
    };
    
    return (
    	<>
        	<input ref={inputElem} type="text" />
            <button onClick={onButtonClick}>
            	Focus the input
            </button>
        </>
    );
}
  • useRefHooks์„ ์‚ฌ์šฉํ•˜์—ฌ ๋ฒ„ํŠผ ํด๋ฆญ ์‹œ input์— ํฌ์ปค์Šค๋ฅผ ํ•˜๋„๋ก ํ•˜๋Š” ์ฝ”๋“œ
  • ์ดˆ๊ธฐ๊ฐ’์„ null์„ ๋„ฃ์—ˆ๊ณ  ๊ฒฐ๊ณผ๋กœ ๋ฐ˜ํ™˜๋œ inputEI์ด๋ผ๋Š” ๋ ˆํผ๋Ÿฐ์Šค ๊ฐ์ฒด๋ฅผ input ํƒœ๊ทธ์— ๋„ฃ์–ด ์คŒ
  • ๋ฒ„ํŠผ ํด๋ฆญ ์‹œ ํ˜ธ์ถœ๋˜๋Š” ํ•จ์ˆ˜์—์„œ inputElim.current๋ฅผ ํ†ตํ•ด ์‹ค์ œ ์—˜๋ฆฌ๋จผํŠธ์— ์ ‘๊ทผํ•˜์—ฌ ํฌ์ปค์Šค ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•˜๊ณ  ์žˆ์Œ
<div ref={myRef} />
  • ๋ ˆํผ๋Ÿฐ์Šค์™€ ๊ด€๋ จ๋œ DOM์— ์ ‘๊ทผํ•˜๊ธฐ ์œ„ํ•ด ์‚ฌ์šฉํ•˜๋Š” ref ์†์„ฑ์— ์ต์ˆ™ํ•  ์ˆ˜ ์žˆ์Œ
  • ๋ฆฌ์•กํŠธ์—์„œ๋Š” ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•˜๋ฉด ๋…ธ๋“œ๊ฐ€ ๋ณ€๊ฒฝ๋  ๋•Œ๋งˆ๋‹ค myRef์˜ current ์†์„ฑ์— ํ˜„์žฌ ํ•ด๋‹นํ•˜๋Š” DOM ๋…ธ๋“œ๋ฅผ ์ €์žฅ
  • ref ์†์„ฑ๊ณผ ๊ธฐ๋Šฅ์€ ๋น„์Šทํ•˜์ง€๋งŒ useRef Hook์€ ํด๋ž˜์Šค์˜ instance ํ•„๋“œ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ๊ณผ ์œ ์‚ฌํ•˜๊ฒŒ ๋‹ค์–‘ํ•œ ๋ณ€์ˆ˜๋ฅผ ์ €์žฅํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ์žฅ์ ์ด ์žˆ์Œ
  • useRef Hook์ด ์ผ๋ฐ˜์ ์ธ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ๊ฐ์ฒด๋ฅผ ๋ฆฌํ„ดํ•˜๊ธฐ ๋•Œ๋ฌธ์ž„
  • useRef ํ›…์€ ๋งค๋ฒˆ ๋ Œ๋”๋ง ๋  ๋•Œ๋งˆ๋‹ค ํ•ญ์ƒ ๊ฐ™์€ ๋ ˆํผ๋Ÿฐ์Šค ๊ฐ์ฒด๋ฅผ ๋ฐ˜ํ™˜
  • useRef() Hook์€ ๋‚ด๋ถ€์˜ ๋ฐ์ดํ„ฐ๊ฐ€ ๋ณ€๊ฒฝ๋˜์—ˆ์„ ๋•Œ ๋ณ„๋„๋กœ ์•Œ๋ฆฌ์ง€ ์•Š์Œ
  • ์ปค๋ŸฐํŠธ ์†์„ฑ์„ ๋ณ€๊ฒฝํ•œ๋‹ค๊ณ  ํ•ด์„œ ์žฌ๋ Œ๋”๋ง์ด ์ผ์–ด๋‚˜์ง€ ์•Š์Œ

๐Ÿ›œ Callback ref

  • ๋ˆ๋…ธ๋“œ์˜ ๋ณ€ํ™”๋ฅผ ์•Œ๊ธฐ ์œ„ํ•œ ๊ฐ€์žฅ ๊ธฐ์ดˆ์ ์ธ ๋ฐฉ๋ฒ•์œผ๋กœ ์ฝœ๋ฐฑ ๋ ˆํ”„๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๋ฐฉ๋ฒ•์ด ์žˆ์Œ
  • React๋Š” ref๊ฐ€ ๋‹ค๋ฅธ ๋…ธ๋“œ์— ์—ฐ๊ฒฐํ•  ๋•Œ๋งˆ๋‹ค Callback๋ฅผ ํ˜ธ์ถœ
function MeasureExample(props) {
	const [height, setHeight] = useState(0);
    
    const measureRef = useCallback(node => {
    	if (node !== null) {
        	setHeight(node.getBoundingClientRect().height);
        }
    }, []);
    
    return (
    	<>
        	<h1 ref={measuredRef}>์•ˆ๋…•, ๋ฆฌ์•กํŠธ</h1>
            <h2>์œ„ ํ—ค๋”์˜ ๋†’์ด๋Š” {Math.round(height)}px ์ž…๋‹ˆ๋‹ค.</h2>
        </>
    );
}
  • ๋ ˆํผ๋Ÿฐ์Šค๋ฅผ ์œ„ํ•ด์„œ useRefHook์„ ์‚ฌ์šฉํ•˜์ง€ ์•Š๊ณ  useCallback ํ›…์„ ์‚ฌ์šฉํ•˜๋Š” callbackRef ๋ฐฉ์‹์„ ์‚ฌ์šฉ
  • useRefHook์„ ์‚ฌ์šฉํ•˜๊ฒŒ ๋˜๋ฉด ๋ ˆํผ๋Ÿฐ์Šค ๊ฐ์ฒด๊ฐ€ current ์†์„ฑ์ด ๋ณ€๊ฒฝ๋˜์—ˆ๋Š”์ง€๋ฅผ ๋”ฐ๋กœ ์•Œ๋ ค์ฃผ์ง€ ์•Š์Œ
  • callback-ref ๋ฐฉ์‹์„ ์‚ฌ์šฉํ•˜๊ฒŒ ๋˜๋ฉด ์ž์‹ ์ปดํฌ๋„ŒํŠธ๊ฐ€ ๋ณ€๊ฒฝ๋˜์—ˆ์„ ๋•Œ ์•Œ๋ฆผ์„ ๋ฐ›์„ ์ˆ˜ ์žˆ๊ณ  ์ด๋ฅผ ํ†ตํ•˜์—ฌ ๋‹ค๋ฅธ ์ •๋ณด๋“ค์„ ์—…๋ฐ์ดํŠธํ•  ์ˆ˜ ์žˆ์Œ
  • useCallback ํ›… ์˜์กด์„ฑ ๋ฐฐ์—ด๋กœ ๋น„์–ด์žˆ๋Š” ๋ฐฐ์—ด, ์ฆ‰ empty array๋ฅผ ๋„ฃ์—ˆ๋Š”๋ฐ h1 ํƒœ๊ทธ๊ฐ€ mount, unmount ๋  ๋•Œ๋งŒ callback ํ•จ์ˆ˜๊ฐ€ ํ˜ธ์ถœ๋˜๋ฉฐ ์žฌ๋ Œ๋”๋ง์ด ์ผ์–ด๋‚  ๋•Œ์—๋Š” ํ˜ธ์ถœ๋˜์ง€ ์•Š์Œ

๐Ÿ›œ Hook์˜ ๊ทœ์น™

  • Hook์€ ๋ฌด์กฐ๊ฑด ์ตœ์ƒ์œ„ ๋ ˆ๋ฒจ์—์„œ๋งŒ ํ˜ธ์ถœํ•ด์•ผ ํ•จ
  • ๋ฐ˜๋ณต๋ฌธ์ด๋‚˜ ์กฐ๊ฑด๋ฌธ ๋˜๋Š” ์ค‘์ฒฉ๋œ ํ•จ์ˆ˜๋“ค ์•ˆ์—์„œ Hook์„ ํ˜ธ์ถœํ•˜๋ฉด ์•ˆ ๋จ
  • Hook์€ ์ปดํฌ๋„ŒํŠธ๊ฐ€ ๋ Œ๋”๋ง ๋  ๋•Œ๋งˆ๋‹ค ๋งค๋ฒˆ ๊ฐ™์€ ์ˆœ์„œ๋กœ ํ˜ธ์ถœ๋˜์–ด์•ผ ํ•จ
  • React๊ฐ€ ๋‹ค์ˆ˜์˜ useState hook์™€ useEffect hook์— ํ˜ธ์ถœํ•˜์—ฌ ์ปดํฌ๋„ŒํŠธ์˜ state๋ฅผ ์˜ฌ๋ฐ”๋ฅด๊ฒŒ ๊ด€๋ฆฌํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋จ
function MyComponent(props) {
	const [name, setName] = useState('Inje');
    
    if (name !== ' ') {
    	useEffect(() => {
        	...
        });
    }
    
    ....
}
  • ์ด ์ฝ”๋“œ๋Š” if๋ฌธ์ด ๋“ค์–ด๊ฐ„ ์กฐ๊ฑด๋ฌธ์˜ ๊ฐ’์ด ์ฐธ์ธ ๊ฒฝ์šฐ์—๋งŒ useEffect ํ›…์„ ํ˜ธ์ถœํ•˜๋„๋ก ๋˜์–ด ์žˆ์Œ
  • ์ค‘๊ฐ„์— name์˜ ๊ฐ’์ด ๋นˆ ๋ฌธ์ž์—ด์ด ๋˜๋ฉด ์กฐ๊ฑด๋ฌธ์˜ ๊ฐ’์ด false๊ฐ€ ๋˜์–ด useEffect ํ›…์ด ํ˜ธ์ถœ๋˜์ง€ ์•Š์Œ
  • ๊ฒฐ๊ณผ์ ์œผ๋กœ ๋ Œ๋”๋ง ํ•  ๋•Œ๋งˆ๋‹ค ํ›…์ด ๊ฐ™์€ ์ˆœ์„œ๋Œ€๋กœ ํ˜ธ์ถœ๋˜๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๋ผ ์กฐ๊ฑด๋ฌธ์˜ ๊ฒฐ๊ณผ์— ๋”ฐ๋ผ ํ˜ธ์ถœ๋˜๋Š” Hook์ด ๋‹ฌ๋ผ์ง์œผ๋กœ ์ž˜๋ชป๋œ ์ฝ”๋“œ
  • ๋ฆฌ์•กํŠธ ํ•จ์ˆ˜ ์ปดํฌ๋„ŒํŠธ์—์„œ๋งŒ Hook์„ ํ˜ธ์ถœํ•ด์•ผ ํ•จ
  • ์ผ๋ฐ˜์ ์ธ JavaScript ํ•จ์ˆ˜์—์„œ Hook์„ ํ˜ธ์ถœํ•˜๋ฉด ์•ˆ ๋จ
  • Hook์€ React ํ•จ์ˆ˜ ์ปดํฌ๋„ŒํŠธ์—์„œ ํ˜ธ์ถœํ•˜๊ฑฐ๋‚˜ ์ง์ ‘ ๋งŒ๋“  ์ปค์Šคํ…€ Hook์—์„œ๋งŒ ํ˜ธ์ถœํ•  ์ˆ˜ ์žˆ์Œ
  • React ์ปดํฌ๋„ŒํŠธ์— ์žˆ๋Š” state์™€ ๊ด€๋ จ๋œ ๋ชจ๋“  ๋กœ์ง์€ ์†Œ์Šค ์ฝ”๋“œ๋ฅผ ํ†ตํ•ด ๋ช…ํ™•ํ•˜๊ฒŒ ํ™•์ธ์ด ๊ฐ€๋Šฅํ•ด์•ผ ํ•จ

๐Ÿ›œ eslint-plugin-react-hooks

  • Hook์˜ ๊ทœ์น™์„ ๋”ฐ๋ฅด๋„๋ก ๊ฐ•์ œํ•ด ์ฃผ๋Š” ํ”Œ๋Ÿฌ๊ทธ์ธ
  • eslint๋Š” JavaScript ์ฝ”๋“œ์—์„œ ๋ฐœ๊ฒฌ๋˜๋Š” ๋ฌธ์ œ ํŒจํ„ด์„ ์‹๋ณ„ํ•˜๊ธฐ ์œ„ํ•œ ์ •์  ์ฝ”๋“œ ๋ถ„์„ ๋„๊ตฌ
  • ์ด ํ”Œ๋Ÿฌ๊ทธ์ธ์„ ์‚ฌ์šฉํ•˜๋ฉด React ์ปดํฌ๋„ŒํŠธ๊ฐ€ Hook์˜ ๊ทœ์ง์„ ๋”ฐ๋ฅด๋Š”์ง€ ์•„๋‹Œ์ง€ ๋ถ„์„ํ•  ์ˆ˜ ์žˆ์Œ
  • ์ด ํ”Œ๋Ÿฌ๊ทธ์ธ์€ ์˜์กด์„ฑ ๋ฐฐ์—ด์ด ์ž˜๋ชป๋˜์–ด ์žˆ๋Š” ๊ฒฝ์šฐ์— ์ž๋™์œผ๋กœ ๊ฒฝ๊ณ  ํ‘œ์‹œ๋ฅผ ํ•ด์ฃผ๋ฉฐ ๊ณ ์น  ๋ฐฉ๋ฒ•์„ ์ œ์•ˆํ•ด ์ฃผ๊ธฐ๋„ ํ•จ
const memoizedValue = useMemo(
	() => {
    	// ์—ฐ์‚ฐ๋Ÿ‰์ด ๋†’์€ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•˜์—ฌ ๊ฒฐ๊ณผ๋ฅผ ๋ฐ˜ํ™˜
        return computeExpensiveValue(์˜์กด์„ฑ ๋ณ€์ˆ˜1, ์˜์กด์„ฑ ๋ณ€์ˆ˜2);
    },
    [์˜์กด์„ฑ ๋ณ€์ˆ˜1, ์˜์กด์„ฑ ๋ณ€์ˆ˜2]
);
  • useMemo์—์„œ ์˜์กด์„ฑ ๋ฐฐ์—ด์— ๋„ฃ์€ ๋ณ€์ˆ˜๋“ค์€ createํ•จ์ˆ˜์˜ ํŒŒ๋ผ๋ฏธํ„ฐ๋กœ ์ „๋‹ฌ๋˜์ง€ ์•Š์Œ
  • useMemoHook์˜ ์›๋ž˜์˜ ์˜๋ฏธ๊ฐ€ ์˜์กด์„ฑ ๋ฐฐ์—ด์— ์žˆ๋Š” ๋ณ€์ˆ˜ ์ค‘ ํ•˜๋‚˜๋ผ๋„ ๋ณ€ํ•˜๋ฉด create ํ•จ์ˆ˜๋ฅผ ๋‹ค์‹œ ํ˜ธ์ถœํ•˜๋Š” ๊ฒƒ์ด๊ธฐ ๋•Œ๋ฌธ์— create ํ•จ์ˆ˜์—์„œ ์ฐธ์กฐํ•˜๋Š” ๋ชจ๋“  ๋ณ€์ˆ˜๋ฅผ ์˜์กด์„ฑ ๋ฐฐ์—ด์— ๋„ฃ์–ด์ฃผ๋Š” ๊ฒƒ์ด ๋งž์Œ
  • ์ปดํŒŒ์ผ๋Ÿฌ๊ฐ€ ๊ฐœ์„ ๋˜์–ด ์˜์กด์„ฑ ๋ฐฐ์—ด์„ ์ž๋™ ์ƒ์„ฑํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋  ๊ฒƒ
  • ํ˜„์žฌ๋Š” ์ง์ ‘ ์˜์กด์„ฑ ๋ฐฐ์—ด์„ ์ž˜ ๋งŒ๋“ค์–ด์ฃผ๋Š” ๊ฒƒ์ด ์ค‘์š”
  • eslint ํ”Œ๋Ÿฌ๊ทธ์ธ react-hooks ํŒจํ‚ค์ง€๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ๋„์›€์ด ๋จ

๐Ÿ›œ Custom Hook ๋งŒ๋“ค๊ธฐ

  • ์—ฌ๋Ÿฌ ์ปดํฌ๋„ŒํŠธ์—์„œ ๋ฐ˜๋ณต์ ์œผ๋กœ ์‚ฌ์šฉํ•˜๋Š” ๋กœ์ง์„ Hook์œผ๋กœ ๋งŒ๋“ค์–ด ์žฌ์‚ฌ์šฉํ•˜๊ธฐ ์œ„ํ•จ

  • userStatus๋ผ๋Š” ์ปดํฌ๋„ŒํŠธ๋Š” isOnline์ด๋ผ๋Š” state์— ๋”ฐ๋ผ์„œ ์‚ฌ์šฉ์ž์˜ ์ƒํƒœ๊ฐ€ ์˜จ๋ผ์ธ์ธ์ง€ ์•„๋‹Œ์ง€๋ฅผ ํ…์ŠคํŠธ๋กœ ๋ณด์—ฌ์ฃผ๋Š” ์ปดํฌ๋„ŒํŠธ
  • ๋™์ผํ•œ ์›น์‚ฌ์ดํŠธ์—์„œ ์—ฐ๋ฝ์ฒ˜ ๋ชฉ๋ก์„ ์ œ๊ณตํ•˜๋Š”๋ฐ ์˜จ๋ผ์ธ์ธ ์‚ฌ์šฉ์ž์˜ ์ด๋ฆ„์€ ์ดˆ๋ก์ƒ‰์œผ๋กœ ํ‘œ์‹œํ•˜๊ณ  ์‹ถ์Œ

  • userStatus์™€ useState, useEffect์„ ์‚ฌ์šฉํ•˜๋Š” ๋ถ€๋ถ„์ด ๋™์ผํ•œ ๊ฒƒ์„ ๋ณผ ์ˆ˜ ์žˆ์Œ
  • ์—ฌ๋Ÿฌ ๊ณณ์—์„œ ์ค‘๋ณต๋˜๋Š” ์ฝ”๋“œ
  • ๊ธฐ์กด ๋ฆฌ์•กํŠธ์—์„œ๋Š” ๋ณดํ†ต ์Šคํ…Œ์ดํŠธ์™€ ๊ด€๋ จ๋œ ๋กœ์ง์ด ์ค‘๋ณต๋˜๋Š” ๊ฒฝ์šฐ์— renderProps ๋˜๋Š” HOC๋ผ๊ณ  ๋ถˆ๋ฆฌ๋Š” higher order component๋ฅผ ์‚ฌ์šฉ
  • ์—ฌ๊ธฐ์—์„œ๋Š” ์ค‘๋ณต๋˜๋Š” ์ฝ”๋“œ๋ฅผ ์ถ”์ถœํ•˜์—ฌ ์ปค์Šคํ…€ ํ›…์œผ๋กœ ๋งŒ๋“œ๋Š” ์ƒˆ๋กœ์šด ๋ฐฉ๋ฒ•์„ ์‚ฌ์šฉํ•ด ๋ณด๋„๋ก ํ•จ
  • ์ค‘๋ณต๋˜๋Š” ๋กœ์ง์„ custom hook์œผ๋กœ ์ถ”์ถœ

๐Ÿ›œ Custom Hook ์ถ”์ถœ

  • ์ด๋ฆ„์ด use๋กœ ์‹œ์ž‘ํ•˜๊ณ  ๋‚ด๋ถ€์—์„œ ๋‹ค๋ฅธ Hook์„ ํ˜ธ์ถœํ•˜๋Š” ํ•˜๋‚˜์˜ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ํ•จ์ˆ˜

  • ์ค‘๋ณต๋˜๋Š” ๋กœ์ง์„ useUserStatus๋ผ๋Š” ์ปค์Šคํ…€ ํ›…์œผ๋กœ ์ถ”์ถœ
  • ๋‘ ๊ฐœ์˜ ์ปดํฌ๋„ŒํŠธ์—์„œ ์ค‘๋ณต๋˜๋Š” ๋กœ์ง์„ ์ถ”์ถœํ•˜์—ฌ ๊ฐ€์ ธ์˜ด
  • ๋‹ค๋ฅธ ์ปดํฌ๋„ŒํŠธ ๋‚ด๋ถ€์—์„œ์™€ ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ ๋‹ค๋ฅธ ํ›…์„ ์ถ”์ถœํ•˜๋Š” ๊ฒƒ์€ ๋ฌด์กฐ๊ฑด ์ปค์Šคํ…€ ํ›…์˜ ์ตœ์ƒ์œ„ ๋ ˆ๋ฒจ์—์„œ๋งŒ ํ•ด์•ผ ํ•จ
  • ํŒŒ๋ผ๋ฏธํ„ฐ๋กœ ๋ฌด์—‡์„ ๋ฐ›์„์ง€ ์–ด๋–ค ๊ฒƒ์„ ๋ฆฌํ„ดํ•ด์•ผ ํ• ์ง€๋ฅผ ๊ฐœ๋ฐœ์ž๊ฐ€ ์ง์ ‘ ์ •ํ•  ์ˆ˜ ์žˆ์Œ
  • ์ปค์Šคํ…€ ํ›…์€ ๊ทธ๋ƒฅ ๋‹จ์ˆœํ•œ ํ•จ์ˆ˜์™€๋„ ๊ฐ™์Œ
  • ์ด๋ฆ„์€ use๋กœ ์‹œ์ž‘ํ•˜๋„๋ก ํ•ด์„œ ์ด๊ฒƒ์ด ๋‹จ์ˆœํ•œ ํ•จ์ˆ˜๊ฐ€ ์•„๋‹Œ ๋ฆฌ์•กํŠธ ํ›…์ด๋ผ๋Š” ๊ฒƒ์„ ๋‚˜ํƒ€๋‚ด ์คŒ
  • ํ›…์ด๊ธฐ ๋•Œ๋ฌธ์— ์œ„์— ์žˆ๋Š” ํ›…์˜ ๋‘ ๊ฐ€์ง€ ๊ทœ์น™์ด ์ ์šฉ

๐Ÿ›œ Custom Hook ์‚ฌ์šฉ

  • ์œ ์ € ์Šคํ…Œ์ดํ„ฐ์Šค์™€ ์œ ์ € ๋ฆฌ์ŠคํŠธ ์•„์ดํ…œ ์ปดํฌ๋„ŒํŠธ๋กœ๋ถ€ํ„ฐ ์ค‘๋ณต๋œ ๋กœ์ง์„ ์ œ๊ฑฐํ•˜๋Š” ๊ฒƒ

  • ๋™์ž‘์— ๋ณ€๊ฒฝ์ด ์—†๊ณ  ์ค‘๋ณต๋˜๋Š” ๋กœ์ง๋งŒ์„ ์ถ”์ถœํ•˜์—ฌ ์ปค์Šคํ…€ Hook์œผ๋กœ ๋งŒ๋“  ๊ฒƒ
  • ์ปค์Šคํ…€ Hook์€ ๋ฆฌ์•กํŠธ ๊ธฐ๋Šฅ์ด ์•„๋‹Œ Hook์˜ ๋””์ž์ธ์—์„œ ์ž์—ฐ์Šค๋Ÿฝ๊ฒŒ ๋”ฐ๋ฅด๋Š” ๊ทœ์น™
  • Custom Hook์˜ ์ด๋ฆ„์„ use๋กœ ์‹œ์ž‘ํ•˜๋Š” ๊ฒƒ์„ ์ค‘์š”ํ•œ ๊ทœ์น™์ž„
  • ์ด๋ฆ„์ด use๋กœ ์‹œ์ž‘ํ•˜์ง€ ์•Š๋Š”๋‹ค๋ฉด ํŠน์ • ํ•จ์ˆ˜์˜ ๋‚ด๋ถ€์—์„œ hook์„ ํ˜ธ์ถœํ•˜๋Š”์ง€๋ฅผ ์•Œ ์ˆ˜ ์—†๊ธฐ ๋•Œ๋ฌธ์— hook์˜ ๊ทœ์น™ ์œ„๋ฐ˜ ์—ฌ๋ถ€๋ฅผ ์ž๋™์œผ๋กœ ํ™•์ธํ•  ์ˆ˜ ์—†์Œ
  •  state์™€ ์—ฐ๊ด€๋œ ๋กœ์ง์„ ์žฌ์‚ฌ์šฉ์ด ๊ฐ€๋Šฅํ•˜๋„๋ก ๋งŒ๋“  ๊ฒƒ
  • ์—ฌ๋Ÿฌ ๊ฐœ์˜ ์ปดํฌ๋„ŒํŠธ์—์„œ ํ•˜๋‚˜์˜ Custom Hook์„ ์‚ฌ์šฉํ•  ๋•Œ ์ปดํฌ๋„ŒํŠธ ๋‚ด๋ถ€์— ์žˆ๋Š” ๋ชจ๋“  state์™€ effects๋Š” ์ „๋ถ€ ๋ถ„๋ฆฌ
  • ๊ฐ Custom Hook ํ˜ธ์ถœ์— ๋Œ€ํ•ด์„œ ๋ถ„๋ฆฌ๋œ state๋ฅผ ์–ป๊ฒŒ ๋จ

  • ChatUserSelector๋ผ๋Š” ์ปดํฌ๋„ŒํŠธ๋Š” select ํƒœ๊ทธ๋ฅผ ํ†ตํ•ด ๋ชฉ๋ก์—์„œ ์‚ฌ์šฉ์ž๋ฅผ ์„ ํƒํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•ด์ฃผ๊ณ  ์žˆ์œผ๋ฉฐ, ์‚ฌ์šฉ์ž๋ฅผ ์„ ํƒํ•  ๊ฒฝ์šฐ ํ•ด๋‹น ์‚ฌ์šฉ์ž๊ฐ€ ์˜จ๋ผ์ธ์ธ์ง€ ์•„๋‹Œ์ง€๋ฅผ ๋ณด์—ฌ์ฃผ๊ฒŒ ๋จ
  • ๊ฐ Custom Hook์˜ ํ˜ธ์ถœ ๋˜ํ•œ ์™„์ „ํžˆ ๋…๋ฆฝ์ ์ž„

 

๊ณต๋ถ€ํ•œ ์ž๋ฃŒ

https://www.inflearn.com/course/%EC%B2%98%EC%9D%8C-%EB%A7%8C%EB%82%9C-%EB%A6%AC%EC%95%A1%ED%8A% B8/dashboard

 

[์ง€๊ธˆ ๋ฌด๋ฃŒ] ์ฒ˜์Œ ๋งŒ๋‚œ ๋ฆฌ์•กํŠธ(React) ๊ฐ•์˜ | Inje Lee (์†Œํ”Œ) - ์ธํ”„๋Ÿฐ

Inje Lee (์†Œํ”Œ) | ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ์™€ CSS ๊ธฐ์ดˆ ๋ฌธ๋ฒ•๊ณผ ํ•จ๊ป˜ ๋ฆฌ์•กํŠธ์˜ ๊ธฐ์ดˆ๋ฅผ ํƒ„ํƒ„ํ•˜๊ฒŒ ๋‹ค์งˆ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค., ๊น”๋”ํ•œ ๊ฐ•์˜์ž๋ฃŒ, ๊ผผ๊ผผํ•œ ์„ค๋ช…์œผ๋กœ์‰ฝ๊ฒŒ ๋ฐฐ์šฐ๋Š” ๋ฆฌ์•กํŠธ ๊ฐ•์˜์ž…๋‹ˆ๋‹ค. ๐Ÿ‘จ‍๐Ÿซ ๋ฆฌ์•กํŠธ์˜ ์„ธ๊ณ„๋กœ

www.inflearn.com