Hooks๊ฐ€ ๋“ฑ์žฅํ•œ ์ด์œ 

  • ๊ธฐ์กด์˜ ํด๋ž˜์Šค ๋ฌธ๋ฒ•์—์„œ ์‚ฌ์šฉํ•˜์˜€๋˜ ๋ผ์ดํ”„์‚ฌ์ดํด ๋ฉ”์„œ๋“œ ๊ธฐ๋ฐ˜์€ ๊ด€๋ จ ์—†๋Š” ๋กœ์ง์ด ์„ž์—ฌ ์ฝ”๋“œ๊ฐ€ ์ž‘์„ฑ๋˜๋Š” ๊ฒฝ์šฐ๊ฐ€ ์žˆ์—ˆ๊ณ  ๊ทธ๋กœ ์ธํ•ด์„œ ๋ฒ„๊ทธ๊ฐ€ ์‰ฝ๊ฒŒ ๋ฐœ์ƒํ•˜๊ณ , ๋ฌด๊ฒฐ์„ฑ์„ ํ•ด์น˜๋Š” ๊ฒฝ์šฐ๊ฐ€ ๋งŽ์•˜๋‹ค. ๋•Œ๋ฌธ์— ๋กœ์ง ๊ธฐ๋ฐ˜์œผ๋กœ ๋‚˜๋ˆŒ ์ˆ˜ ์žˆ๊ณ  ์ปดํฌ๋„ŒํŠธ๋ฅผ ํ•จ์ˆ˜ ๋‹จ์œ„๋กœ ์ž˜๊ฒŒ ์ชผ๊ฐค ์ˆ˜ ์žˆ๋Š” React Hooks๊ฐ€ ๋‚˜์™€ ํ•จ์ˆ˜ ์ปดํฌ๋„ŒํŠธ๋กœ ์ž‘์„ฑํ•˜๊ฒŒ ๋˜์—ˆ๋‹ค.

  • Hooks์„ ์ด์šฉํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š”

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


Hooks์˜ ์ข…๋ฅ˜

useState

  • ์ƒํƒœ๋ฅผ ๋ณ€์ˆ˜๋กœ ์„ ์–ธํ•˜์—ฌ ๊ด€๋ฆฌํ•˜๋ฉฐ, ์ƒํƒœ์˜ ๋ถˆ๋ณ€์„ฑ์„ ์œ ์ง€ํ•œ ์ฑ„ ์ƒํƒœ๋ฅผ ๋ณ€๊ฒฝํ•  ์ˆ˜ ์žˆ๋„๋ก ๋„์™€์ค€๋‹ค.
  • [state, setState]์˜ ์ธ์ž๋กœ๋Š”
    • state: ์ƒํƒœ์˜ ํ˜„์žฌ ๊ฐ’์ด ํ‘œํ˜„๋˜๊ณ  ์ดˆ๊ธฐ์—๋Š” ์‚ฌ์šฉ์ž๊ฐ€ ์ œ๊ณตํ•œ ์ดˆ๊ธฐ ์ƒํƒœ๋กœ ์„ค์ •๋˜์–ด ํ‘œํ˜„
    • setState: ์ƒํ˜ธ ์ž‘์šฉ์— ๋”ฐ๋ผ ๋‹ค๋ฅธ ๊ฐ’์œผ๋กœ ๋ณ€๊ฒฝ
const [state, setState] = useState(initialState);

useEffect

  • ์ปดํฌ๋„ŒํŠธ ๋‚ด์— ๋ณ€ํ™”๊ฐ€ ๋ฐœ์ƒํ–ˆ์„ ๊ฒฝ์šฐ์— ์‹คํ–‰๋˜๋Š” ๋ฉ”์„œ๋“œ
  • ํ™”๋ฉด์— ๋ Œ๋”๋ง์ด ์™„๋ฃŒ๋œ ํ›„์— ์ˆ˜ํ–‰๋œ๋‹ค.
  • useEffect(function, โ€ฆdependencies?);
    • function : useEffect๊ฐ€ ์ˆ˜ํ–‰๋  ๋•Œ ์‹คํ–‰๋˜๋Š” ํ•จ์ˆ˜
    • deps [optional] : ๋ฐฐ์—ด ํ˜•ํƒœ์ด๋ฉฐ, ์˜์กด(dependency) ๊ฐ’์„ ์˜๋ฏธ
  • useEffect์•ˆ์—์„œ์˜ return์€ ์ •๋ฆฌ ํ•จ์ˆ˜(clean-up)๋ฅผ ์‚ฌ์šฉํ•˜๊ธฐ์œ„ํ•ด ์“ฐ์—ฌ์ง‘๋‹ˆ๋‹ค.
    • ๋ฉ”๋ชจ๋ฆฌ ๋ˆ„์ˆ˜ ๋ฐฉ์ง€๋ฅผ ์œ„ํ•ด UI์—์„œ ์ปดํฌ๋„ŒํŠธ๋ฅผ ์ œ๊ฑฐํ•˜๊ธฐ ์ „์— ์ˆ˜ํ–‰ํ•œ๋‹ค.
    • ์ปดํฌ๋„ŒํŠธ๊ฐ€ ์—ฌ๋Ÿฌ ๋ฒˆ ๋ Œ๋”๋ง ๋œ๋‹ค๋ฉด ๋‹ค์Œ effect๊ฐ€ ์ˆ˜ํ–‰๋˜๊ธฐ ์ „์— ์ด์ „ effect๊ฐ€ ์ •๋ฆฌ๋œ๋‹ค.
useEffect(() => {}); // ๋ Œ๋”๋ง ๊ฒฐ๊ณผ๊ฐ€ ์‹ค์ œ ๋”์— ๋ฐ˜์˜๋ ๋•Œ ๋งˆ๋‹ค ํ˜ธ์ถœ
useEffect(() => {}, []); // ์ปดํฌ๋„ŒํŠธ๊ฐ€ ์ฒ˜์Œ ๋‚˜ํƒ€๋‚ ๋•Œ ํ•œ ๋ฒˆ ํ˜ธ์ถœ
useEffect(() => {}, [dependencies1, dependencies2, ...]); // ์กฐ๊ฑด๋ถ€ effect ๋ฐœ์ƒ, ์˜์กด์„ฑ ์ค‘ ํ•˜๋‚˜๊ฐ€ ๋ณ€๊ฒฝ๋œ๋‹ค๋ฉด, ๋ฆฌ๋ Œ๋”๋ง์ด ์ผ์–ด๋‚œ๋‹ค.

useRef

  • useState๋Š” ์ƒํƒœ์˜ ๊ฐ’์ด ๋ณ€ํ•˜๋ฉด ๋ Œ๋”๋ง์ด ์ผ์–ด๋‚˜์ง€๋งŒ, useRef๋Š” ์ƒํƒœ์˜ ๊ฐ’์ด ๋ณ€ํ•˜๋”๋ผ๋„ ๋ Œ๋”๋ง์„ ์ผ์œผํ‚ค์ง€ ์•Š๋Š”๋‹ค.
  • ํŠน์ • DOM ์š”์†Œ์— ์ ‘๊ทผํ• ๋•Œ ์‚ฌ์šฉํ•˜๋Š” ํŽธ์ด๋ฉฐ, .current ํ”„๋กœํผํ‹ฐ๋กœ ์ „๋‹ฌ๋œ ์ธ์ž๋กœ ์ดˆ๊ธฐํ™”๋œ ๋ณ€๊ฒฝ ๊ฐ€๋Šฅํ•œ ref ๊ฐ์ฒด๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค. (JavaScript์˜ Document.querySelector์™€ ๋น„์Šทํ•œ ๊ธฐ๋Šฅ)
  • ๋ฐ˜ํ™˜๋œ ๊ฐ์ฒด๋Š” ์ปดํฌ๋„ŒํŠธ์˜ ์ „ ์ƒ์• ์ฃผ๊ธฐ๋ฅผ ํ†ตํ•ด ์œ ์ง€๋œ๋‹ค.
const refContainer = useRef(null);

useMemo

  • ๋ฉ”๋ชจ์ด์ œ์ด์…˜๋œ ๊ฐ’์„ ๋ฐ˜ํ™˜ํ•œ๋‹ค.
  • ์ด๋ฏธ ์—ฐ์‚ฐ ๋œ ๊ฐ’์„ ๋ฆฌ๋ Œ๋”๋ง ์‹œ ๋‹ค์‹œ ๊ณ„์‚ฐํ•˜์ง€ ์•Š๋„๋ก ํ•œ๋‹ค.
  • ์˜์กด์„ฑ์ด ๋ณ€๊ฒฝ๋˜์—ˆ์„ ๋•Œ์—๋งŒ ๋ฉ”๋ชจ์ด์ œ์ด์…˜๋œ ๊ฐ’๋งŒ ๋‹ค์‹œ ๊ณ„์‚ฐํ•œ๋‹ค.
  • ์˜์กด์„ฑ ๋ฐฐ์—ด์ด ์—†๋Š” ๊ฒฝ์šฐ ๋งค ๋ Œ๋”๋ง ๋•Œ๋งˆ๋‹ค ์ƒˆ ๊ฐ’์„ ๊ณ„์‚ฐํ•œ๋‹ค.
  • ์œ ์˜์‚ฌํ•ญ: ๋ชจ๋“  ์ปดํฌ๋„ŒํŠธ๋ฅผ useMemo๋กœ ๊ฐ์‹ธ๊ฒŒ ๋˜๋ฉด ์ด ๋˜ํ•œ ๋ฆฌ์†Œ์Šค ๋‚ญ๋น„์ด๋ฏ€๋กœ, ํผํฌ๋จผ์Šค ์ตœ์ ํ™”๊ฐ€ ํ•„์š”ํ•œ ์—ฐ์ƒ๋Ÿ‰์ด ๋งŽ์€ ๊ณณ์— ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ์ข‹๋‹ค.
const memoizedValue = useMemo(() => computeExpensiveValue(a, b), [a, b]);

useCallback

  • ๋ฉ”๋ชจ์ด์ œ์ด์…˜๋œ ์ฝœ๋ฐฑ์„ ๋ฐ˜ํ™˜ํ•œ๋‹ค.
  • useMemo์™€ ์œ ์‚ฌํ•˜๊ฒŒ ์ด์šฉ๋˜๋ฉฐ, โ€˜ํ•จ์ˆ˜โ€™์— ์ ์šฉํ•ด์ค€๋‹ค.
  • ์˜์กด์„ฑ์ด ๋ณ€๊ฒฝ๋˜์—ˆ์„๋•Œ๋งŒ ๋ณ€๊ฒฝ๋œ๋‹ค. ๊ทธ๋ ‡๊ธฐ ๋•Œ๋ฌธ์— ํŠน์ • ํ•จ์ˆ˜๋ฅผ ์ƒˆ๋กœ ๋งŒ๋“ค์ง€ ์•Š๊ณ  ์žฌ์‚ฌ์šฉ๊ฐ€๋Šฅํ•˜๊ฒŒ ํ•œ๋‹ค.
const memoizedCallback = useCallback(() => {
  doSomething(a, b);
}, [a, b]);

useContext

  • Context API๋ฅผ ํ†ตํ•ด ๋งŒ๋“ค์–ด์ง„ Context์—์„œ ์ œ๊ณตํ•˜๋Š” Value๋ฅผ ๊ฐ€์ ธ์˜ฌ ์ˆ˜ ์žˆ๋‹ค.
  • ์ปดํฌ๋„ŒํŠธ์—์„œ ๊ฐ€์žฅ ๊ฐ€๊นŒ์šด <MyContext.Provider>๊ฐ€ ๊ฐฑ์‹ ๋˜๋ฉด ์ด Hook์€ ๊ทธ MyContext provider์—๊ฒŒ ์ „๋‹ฌ๋œ ๊ฐ€์žฅ ์ตœ์‹ ์˜ context value๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋ Œ๋”๋Ÿฌ๋ฅผ ํŠธ๋ฆฌ๊ฑฐ ํ•œ๋‹ค.
const value = useContext(MyContext);

useReducer

  • useState์˜ ๋Œ€์ฒด ํ•จ์ˆ˜๋กœ ์ปดํฌ๋„ŒํŠธ ์ƒํƒœ ์—…๋ฐ์ดํŠธ ๋กœ์ง์„ ์ปดํฌ๋„ŒํŠธ์—์„œ ๋ถ„๋ฆฌ์‹œํ‚ฌ ์ˆ˜ ์žˆ๋‹ค.
  • ์ปดํฌ๋„ŒํŠธ ๋ฐ”๊นฅ์— ๋กœ์ง์„ ์ž‘์„ฑํ•  ์ˆ˜ ๋„ ์žˆ๊ณ , ์‹ฌ์ง€์–ด ๋‹ค๋ฅธ ํŒŒ์ผ์— ์ž‘์„ฑํ•œ ํ›„ ๋ถˆ๋Ÿฌ์™€์„œ ์‚ฌ์šฉํ•  ์ˆ˜๋„ ์žˆ๋‹ค.
  • reducer๋ž€ ํ˜„์žฌ ์ƒํƒœ์™€ ์•ก์…˜ ๊ฐ์ฒด๋ฅผ ํŒŒ๋ผ๋ฏธํ„ฐ๋กœ ๋ฐ›์•„์™€์„œ ์ƒˆ๋กœ์šด ์ƒํƒœ๋ฅผ ๋ฐ˜ํ™˜ํ•ด์ฃผ๋Š” ํ•จ์ˆ˜์ด๋‹ค.
const [state, dispatch] = useReducer(reducer, initialArg, init);

์ฐธ๊ณ ๋งํฌ

React.Component - React

react: Hooks

๋ณ„์ฝ”๋”ฉ ํ›…์— ๋Œ€ํ•ด์„œ