๐จ๐ปโ๐ป React Hook?
๋ฆฌ์กํธ ํ
์ React 16.8 ๋ฒ์
์์ ์๋กญ๊ฒ ๋์
๋ ๊ธฐ๋ฅ์ด๋ค. ๊ธฐ์กด์ ํด๋์ค ์ปดํฌ๋ํธ์๋ ์ํ ๊ด๋ฆฌ๋ ๋ผ์ดํ์ฌ์ดํด์ ๊ธฐ๋ฅ์ด ์์์ง๋ง, ํจ์ํ ์ปดํฌ๋ํธ์๋ ๊ทธ๋ฐ ๊ธฐ๋ฅ๋ค์ด ์กด์ฌํ์ง ์์๋ค. ํ์ง๋ง Hook์ด ๋์
๋๋ฉด์ ํจ์ํ ์ปดํฌ๋ํธ์์๋ ์ํ ๊ด๋ฆฌ
ํ ์ ์๋ useState๋ ๋ ๋๋ง ์งํ ์์
์ ์ค์ ํ ์ ์๋ useEffect ๋ฑ์ ๊ธฐ๋ฅ๋ค์ ์ฌ์ฉํ ์ ์๊ฒ ๋ฌ๋ค.
๋ฆฌ์กํธ ํ
์ด ๋์
๋์ ํด๋์ค ๊ธฐ๋ฐ ์ปดํฌ๋ํธ, ๋ผ์ดํ ์ฌ์ดํด ๋ฉ์๋, this์ ํ์์ฑ์ด ์ฌ๋ผ์ก๋ค. ๋ํ, ๊ณตํต ๊ธฐ๋ฅ์ ์ปค์คํ
hook์ผ๋ก ๋ง๋ค์ด์ ๋ก์ง์ ์ฌ์ฌ์ฉํ๊ธฐ ์ฌ์์ก๋ค. ๋ง์ง๋ง์ผ๋ก ์ปดํฌ๋ํธ ์์ฒด์์ ๋ก์ง์ ๋ถ๋ฆฌํ ์ ์์ด์ ์ฝ๊ธฐ ์ฝ๊ณ ํ
์คํธํ๊ธฐ ์ฌ์ด ์ฝ๋๋ฅผ ์์ฑํ ์ ์๋ค.
๐จ๐ปโ๐ป React Hook ์ข
๋ฅ
import React , { useState } from "react" ;
const [ data , setData ] = useState ( "" ) ;
๋ํ์ ์ธ Hook์ด๋ค. ํจ์ํ ์ปดํฌ๋ํธ์์๋ ๊ฐ๋ณ์ ์ธ ์ํ
๋ฅผ ์ง๋ ์ ์๊ฒ ํด์ฃผ๋ฉฐ, ํจ์ํ ์ปดํฌ๋ํธ์์ ์ํ๋ฅผ ๊ด๋ฆฌ
ํด์ผ ํ ๋ ์ฌ์ฉํ๋ค.
useState()๋ผ๋ ํจ์๋ ๋ฐฐ์ด
์ ๋ฆฌํดํ๋๋ก ๋์ด์๋ค. ๋ฐ๋ผ์ ๊ตฌ์กฐ๋ถํด ํ ๋น ๋ฐฉ์์ผ๋ก ํ ๋น ํ ์ ์์ผ๋ฉฐ, ์ฒซ ๋ฒ์งธ๋ State์ ๊ฐ
, ๋ ๋ฒ์งธ๋ State ๋ณ๊ฒฝ ํจ์
์ด๋ค.
์ํ๊ด๋ฆฌ๋?
์ผ๋ฐ์ ์ผ๋ก ์ํ๊ด๋ฆฌ๋ผ ํจ์๋ณํํ๋ ๋ฐ์ดํฐ๋ค์ ๊ด๋ฆฌํ๋ ๊ฒ์ธ๋ฐ, ์ํ์ ์ด๊ธฐ ๊ฐ์ ์ ์ฅํ๊ฑฐ๋,
ํ์ฌ ์ํ์ ๊ฐ์ ์ฝ๊ฑฐ๋, ์๋ก์ด ๋ฐ์ดํฐ๋ก ์ํ๋ฅผ ์
๋ฐ์ดํธ ํ๋ ๋ฑ์ ํ์๋ฅผ ๋ปํ๋ค.
import React , { useEffect } from "react" ;
useEffect ( ( ) => {
// ...
} , [ ] ) ;
useEffect๋ ๋ผ์ดํ ์ฌ์ดํด ๋ฉ์๋์ ๊ด๋ ค์ด ์๋ค. ๊ธฐ์กด ํด๋์คํ ์ปดํฌ๋ํธ์ ๋ผ์ดํ ์ฌ์ดํด ๋ฉ์๋ ์ค componentDidMount
์ componentDidUpdate
, componentWillUnmount
๋ฅผ ํฉ์น ํํ๋ผ๊ณ ์๊ฐํ๋ฉด ๋๋ค.
์ฒ์ ์ปดํฌ๋ํธ๊ฐ ๋ง์ดํธ
๋ ๋ ํ ๋ฒ ๋์ํ๋ค. โ componentDidMount
useEffect์ ๋๋ฒ์งธ ์ธ์์ธ ์์กด์ฑ ๋ฐฐ์ด
๋ก ์ง์ ํ state์ ๊ฐ์ด ๋ณํํ ๋๋ง๋ค ๋์ํ๋ค. โ componentDidUpdate
useEffect ๋ด๋ถ์์ return์ ํตํด componentWillUnmount
๋ฉ์๋๋ ์ฌ์ฉํ ์ ์๋ค. ์ด๋ฅผ ๋ท์ ๋ฆฌ ํจ์
๋ผ๊ณ ๋ ํ๋ค.
๋ง์ฝ, useEffect์ ๋๋ฒ์งธ ์ธ์์ธ ์์กด์ฑ ๋ฐฐ์ด์ ์์ ์
๋ ฅํ์ง ์์ผ๋ฉด state๊ฐ ๋ฐ๋ ๋๋ง๋ค ๋์ํ๊ธฐ ๋๋ฌธ์ ๋นํจ์จ์ ์ด๋ค.
๋ํ, ์์กด์ฑ ๋ฐฐ์ด์ ๋น ๋ฐฐ์ด
๋ก ๋ฃ๋ ๊ฒฝ์ฐ์๋ ๋ง์ดํธ๊ฐ ๋ ํ ๋ฑ! ํ๋ฒ๋ง
์๋ํ๋ค.
import React , { useEffect } from "react" ;
useLayoutEffect ( ( ) => {
// ...
} , [ ] ) ;
useLayoutEffect๋ useEffect์ ๋น๊ตํด์ ์ดํดํ๋ฉด ํธ๋ฆฌํ๋ค.
useEffect๋ ์ปดํฌ๋ํธ๋ค์ด render๋๊ณ , paint ํ์ ์ฆ, Mount(๋ง์ดํธ)
๋ ๋ ๋น๋๊ธฐ์ ์ผ๋ก ์คํ
๋๋ค. paint๋ ํ์ ์คํ๋๊ธฐ ๋๋ฌธ์ useEffect์์ DOM์ ์ํฅ์ ์ฃผ๋ ์ฝ๋๊ฐ ์์ผ๋ฉด ์ฌ์ฉ์ ์
์ฅ์์๋ ๊น๋นก์ด๋ ํ์
์ ๊ฒฝํํ๋ค.
๊ทธ์ ๋ฐํด, useLayoutEffect๋ ์ปดํฌ๋ํธ๋ค์ด render๋ ํ์ ์คํ๋๊ณ ๊ทธ ํ์ paintํ๋ค. ๋ํ ์ด๋ฐ ๊ณผ์ ์ด ๋๊ธฐ์
์ผ๋ก ์คํ๋๋ค. ๋ฐ๋ผ์ paint ๋๊ธฐ์ ์ ์คํ๋๊ธฐ ๋๋ฌธ์ dom ์ ์กฐ์ํ๋ ์ฝ๋๊ฐ ์กด์ฌํ๋๋ผ๋ ์ฌ์ฉ์๋ ๊น๋นก์์ ๊ฒฝํํ์ง ์์ต๋๋ค.
์ด๋ ๊ฒ๋ง๋ณด๋ฉด useLayoutEffect๊ฐ useEffect๋ณด๋ค ๋ ์ข๊ฒ ๋๊ปด์ง ์ ์๊ฒ ์ง๋ง, ๋ฐ๋๋ก useLayoutEffect์ ๋ด๋ถ ๋ก์ง์ด ๋ณต์กํ๋ฉด ์ฌ์ฉ์ ์
์ฅ์์๋ ํ๋ฉด์ ๋ณด๋๋ฐ๊น์ง ์๊ฐ์ด ์ค๋๊ฑธ๋ฆฐ๋ค๋ ๋จ์ ์ด ์๋ค.
๊ฒฐ๋ก ์, ๊ธฐ๋ณธ์ ์ผ๋ก๋ useEffect๋ฅผ ์ฌ์ฉํ๋ ๊ฒ์ ๊ถ์ฅํ๊ณ , ํ๋ฉด์ด ๊น๋นก์ด๋ ์ํฉ์ผ ๋ ์ด๋ฅผ ๋ฐฉ์งํ๊ธฐ์ํด์๋ useLayoutEffect๋ฅผ ์ฌ์ฉํ๋ฉด ์ข์ ๊ฒ ๊ฐ๋ค.
import React , { useRef } from "react" ;
const ref = useRef ( null ) ;
๋ฆฌ์กํธ๋ก ์์
ํ๋ค ๋ณด๋ฉด DOM ์์์ ์ง์ ์ ๊ทผ
ํด์ผ ํ ๋๊ฐ ์๋ค. ์๋ฅผ ๋ค์ด ํน์ DOM ์์์ focus๋ฅผ ์ฃผ๊ฑฐ๋ DOM ์์์ ํฌ๊ธฐ๋ ์คํฌ๋กค ์์น๋ฅผ ์๊ณ ์ถ์ ๊ฒฝ์ฐ์ด๋ค. ์ด๋ ref ์์ฑ์ ์ด์ฉํ๋ฉด DOM ์์์ ์ง์ ์ ๊ทผํ ์ ์๋ค.
ref.current ์์ฑ์ ํตํด์ ์ง์ ์ ๊ทผ์ด ๊ฐ๋ฅํ๋ค.
์ด์ธ์๋, ๊ฐ์ด ๋ณํด๋ ๋ฆฌ๋ ๋๋งํ์ง ์๋ ๋ณ์
๋ฅผ ๊ด๋ฆฌํ๋ ์ฉ๋๋ก๋ ์ฌ์ฉํ ์ ์๋ค.
import React , { useCallback } from "react" ;
const func = useCallback ( ( ) => {
//...
} , [ ] ) ;
์ปดํฌ๋ํธ๊ฐ ๋ ๋๋ง ๋ ๋๋ง๋ค ํจ์
๋ฅผ ์๋ก ์์ฑํ์ง ์๊ณ ์ฌ์ฌ์ฉ
ํ๊ณ , ๋ ๋ฒ์งธ ์ธ์์ธ ์์กด์ฑ ๋ฐฐ์ด์ State ๊ฐ
์ด ๋ณ๊ฒฝ๋์์ ๋๋ง ์๋ก ์์ฑํ๋๋ก ํด์ ์ต์ ํํ ์ ์๋ Hook์ด๋ค.
๋ฉ๋ชจ์ด์ ์ด์
ํ
์ด๋ค. ๋ฉ๋ชจ์ด์ ์ด์
์ด๋ ๊ณ์ฐ ๋ ๊ฐ์ ์๋ฃ ๊ตฌ์กฐ์ ์ ์ฅํ๊ณ ์ดํ ๊ฐ์ ๊ณ์ฐ์ ๋ฐ๋ณตํ์ง ์๊ณ ์๋ฃ ๊ตฌ์กฐ์์ ๊บผ๋ด ์ฌ์ฌ์ฉํ๋ ๊ฒ์ ๋งํ๋ค.
import React , { useMemo } from "react" ;
const value = useMemo ( ( ) => {
//...
} , [ ] ) ;
ํน์ ๊ฒฐ๊ณผ ๊ฐ
์ ์ฌ์ฌ์ฉํ ๋ ์ฌ์ฉํ๋ Hook์ด๋ค. ๋ ๋ฒ์งธ ์ธ์์ธ ์์กด์ฑ ๋ฐฐ์ด์ State ๊ฐ์ด ๋ณ๊ฒฝ๋์์ ๋๋ง ์ฐ์ฐํ๋ฏ๋ก ์ต์ ํ๊ฐ ๊ฐ์ ๋๋ค.
useCallback๊ณผ ๋ง์ฐฌ๊ฐ์ง๋ก ๋ฉ๋ชจ์ด์ ์ด์
ํ
์ด๋ค. ๋์ ์ฐจ์ด๋ ํน์ ๊ฒฐ๊ณผ์ ๊ฐ
์ ์ฌ์ฌ์ฉํ๋, ํจ์
๋ฅผ ์ฌ์ฌ์ฉํ๋ ์ฐจ์ด๊ฐ ์๋ค.
๊ธฐ์กด์ React์ ์กด์ฌํ๋ Context API๋ฅผ ํธํ๊ฒ ์ฌ์ฉํ ์ ์๊ฒ ํด์ฃผ๋ Hook์ด๋ค.
์ปดํฌ๋ํธ์ ์ํ๊ฐ์ ๋ฆฌ๋์ค์ ๋ฆฌ๋์
์ฒ๋ผ ๊ด๋ฆฌํ ์ ์๊ฒ ํด์ฃผ๋ Hook์ด๋ค.
useReducer๋ฅผ ์ฌ์ฉํ๋ฉด ์ปดํฌ๋ํธ์ ์ํ ์
๋ฐ์ดํธ ๋ก์ง
์ ์ปดํฌ๋ํธ์์ ๋ถ๋ฆฌ
์ํฌ ์ ์๋ค. ์ํ ์
๋ฐ์ดํธ ๋ก์ง์ ์ปดํฌ๋ํธ ๋ฐ๊นฅ
์ ์์ฑํ ์๋ ์๊ณ , ์ฌ์ง์ด ๋ค๋ฅธ ํ์ผ์ ์์ฑ ํ ๋ถ๋ฌ์์ ์ฌ์ฉํ ์๋ ์๋ค.
https://www.notion.so/a42647e064864e469b66acacfe69652b