๐Ÿ“‘ ๋ฆฌ์•กํŠธ ์˜ค๋ฅ˜ โ€œReact Hook useEffect has a missing dependencyโ€




๋…ธ๋งˆ๋“œ์ฝ”๋” #7.6 Parameters ๊นŒ์ง€ ๊ฐ•์˜๋ฅผ ๋“ค์—ˆ๋‹ค.
๋งˆ์ง€๋ง‰์— ๋‹ˆ๊ผฌ์Œค์ด ํ•ด๋ณด๋ผ๋Š”๊ฑฐ ํ•˜๋Š”๋ฐ ์Œ .. ? ์™œ ๋‚˜๋Š” ์•ˆ๋˜์ง€โ€ฆ?
useState์‚ฌ์šฉํ•ด์„œ ๋ฐฐ์—ด ํ• ๋‹นํ•˜๋Š” ์ž‘์—…์ด์—ˆ๋Š”๋ฐ,,
๊ทธ๋ƒฅ ์ฝ˜์†”์ฐฝ์— ์ฐ์œผ๋ฉด ๋ฐฐ์—ด์ด ๋‚˜์˜ค๋Š”๋ฐ setStateํ•ด์ฃผ๋ฉด ๋ฐฐ์—ด์ด state์— ์•ˆ๋“ค์–ด๊ฐ€๋Š”๊ฑฐ๋‹ค.
ํ•ด๋‹น ์ฝ”๋“œ๋Š” ์•„๋ž˜์™€ ๊ฐ™๋‹ค.



const [details, setDetails] = useState([]);
const { id } = useParams();
const getMovie = async () => {
  const json = await (
    await fetch(`https://yts.mx/api/v2/movie_details.json?movie_id=${id}`)
  ).json();
  console.log(json.data.movie);
  setDetails(json.data.movie);
  console.log(details);
};
useEffect(() => {
  getMovie();
}, []);



๊ทธ๋ฆฌ๊ณ  ์ฝ˜์†”์—์„œ ํ™•์ธํ•˜๋ฉด ์•„๋ž˜์ฒ˜๋Ÿผ ๋‚˜์˜จ๋‹ค.

image



๋Œ€์ฒด ์™œ ์ผ๊นŒ?
๋Œ€์ฒด ์™œ ๋‚ด๊ป€ ์•ˆ๋“ค์–ด๊ฐˆ๊นŒ?
๋‹ค๋ฅธ ์‚ฌ๋žŒ๋“ค์€ ์–ด๋–ป๊ฒŒ ๋„ฃ์—ˆ์„๊นŒ?
๊ฐ•์˜ ๋Œ“๊ธ€๋“ค๋„ ํ™•์ธํ•ด๋ดค์ง€๋งŒ ์•Œ ์ˆ˜ ์—†์—ˆ๋‹ค.
๊ทธ๋ฆฌ๊ณ  โ€˜์ด๋Ÿฐ ๋ฌธ์ œ์กฐ์ฐจ ํ•ด๊ฒฐํ•˜์ง€ ๋ชปํ•˜๋‹ค๋‹ˆ .. ๋‚˜๋Š” useState๋„ ์‚ฌ์šฉํ•˜์ง€ ๋ชปํ•˜๋Š” ๋ฐ”๋ณด์•ผโ€™
โ€˜์•„๋‹ˆ ์ด๋ ‡๊ฒŒ ์‚ฌ์šฉํ•˜๋Š”๊ฒŒ ๋งž๋Š”๋ฐ ์™œ ์•ˆ๋“ค์–ด๊ฐ€๋ƒ๊ณ  ์ด๊ฑฐ ๋‚ด ๋ฌธ์ œ๊ฐ€ ์•„๋‹ˆ์•ผ!โ€™
ํ•˜๋Š” ์ž์•„ ๋ถ„์—ด์˜ ์‚ฌ์ด์—์„œ ์˜์š•์„ ์žƒ๊ณ  ๋ฉฐ์น ๋™์•ˆ ๋„๋ถ€๋Ÿฌ์ ธ์žˆ๋‹ค๊ฐ€
๊ทธ๋ž˜ ๊ทธ๋ž˜๋„ ํ•ด๊ฒฐํ•ด์•ผ์ง€. ํ•ด๊ฒฐํ•˜์ง€ ๋ชปํ•˜๋Š” ๋ฌธ์ œ๋Š” ์—†์–ด.
ํ•˜๋Š” ์ƒ๊ฐ์œผ๋กœ npm start๋ฅผ ํ•˜๋Š” ๊ทธ ์ˆœ๊ฐ„.
ํ„ฐ๋ฏธ๋„์—์„œ ๊ฒฝ๊ณ ๋ฅผ ํ•˜๋‚˜ ๋ฐœ๊ฒฌํ–ˆ๋‹ค!
๋ฐ”๋กœ ๊ฒฝ๊ณ ๋ฅผ ๋ณต์‚ฌํ•ด์„œ ๊ตฌ๊ธ€๋งํ–ˆ๋‹ค.
๊ทธ ๊ฒฝ๊ณ ๋Š” ๋ฐ”๋กœ
React Hook useEffect has a missing dependency
์ด๊ฑฐ์˜€๋‹ค.


image




๐Ÿ‘‰์ฐธ๊ณ  ๋ธ”๋กœ๊ทธ

exhaustive-deps-warning ํ•ด๊ฒฐ๋ฒ•




๊ตฌ๊ธ€๋ง์„ํ•ด์„œ ์œ„์˜ ๋ธ”๋กœ๊ทธ๋ฅผ ์ฐธ๊ณ ํ•ด๋ณด์•˜๋‹ค.
ํ•ด๋‹น ์˜ค๋ฅ˜๋Š” react hook์„ ์‚ฌ์šฉํ•˜๋‹ค๋ณด๋ฉด ๋งŽ์ด ๋ณผ ์ˆ˜ ์žˆ๋Š” ๊ฒฝ๊ณ ๋ผ๊ณ  ํ•œ๋‹ค.
useEffect์•ˆ์— ์‚ฌ์šฉํ•˜๊ณ ์žˆ๋Š” state๋ฅผ ์ถ”๊ฐ€์‹œ์ผœ ๋‹ฌ๋ผ๋Š” ์˜๋ฏธ์ด๋‹ค.
ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•์€ ๋‘ ๊ฐ€์ง€๊ฐ€ ์žˆ๋‹ค.




โšก 1. useEffect์— state ๋„ฃ์–ด์ฃผ๊ธฐ.


useEffect(() => {
  getMovie();
}, [details]);


useEffect๋ฅผ ๋ฐฐ์šธ ๋•Œ ๋’ค์— ๋Œ€๊ด„ํ˜ธ ๋ถ€๋ถ„์„ ์ง€์ผœ๋ณด๋‹ค๊ฐ€ ํ•ด๋‹น ๋ณ€์ˆ˜๊ฐ€ ์—…๋ฐ์ดํŠธ๋˜๋ฉด useEffect์˜ ํ•จ์ˆ˜๊ฐ€ ์‹คํ–‰๋œ๋‹ค๊ณ  ๋ฐฐ์› ๋‹ค.
๊ทธ ์ „์— ๋‚ด ์ฝ”๋“œ์—์„œ๋Š” ๋Œ€๊ด„ํ˜ธ๋ถ€๋ถ„์ด ๋น„์–ด์žˆ์œผ๋‹ˆ ์ฒ˜์Œ ํ™”๋ฉด ๋กœ๋”ฉ์‹œ์—๋งŒ ์‹คํ–‰์ด ๋˜๊ณ  setDetails ๋์„ ๋•Œ ์‹คํ–‰์ด ์•ˆ๋œ๊ฑด๊ฐ€๋ณด๋‹ค.
์ฝ”๋“œ๋ฅผ ์œ„์™€ ๊ฐ™์ด ๋ฐ”๊พธ๊ณ  ๋‹ค์‹œ ์‹คํ–‰ํ•˜๋‹ˆ ๋‹ค์‹œ ๋ฌธ์ œ๊ฐ€ ์ƒ๊ฒผ๋‹คโ€ฆ



image


๊ณ„์†๊ณ„์† ์•ˆ๋ฉˆ์ถ”๊ณ  ์ฝ˜์†”์— ์ฐํžˆ๊ณ  ์žˆ๋‹ค.
๊ทธ๋Ÿฌ๋ฉด์„œ ๋ฆฌ์•กํŠธ ๋””๋ฒจ๋กœํผํˆด๋กœ ํ•ด๋‹น ๋ถ€๋ถ„์ด ๊ณ„์†๊ณ„์† ๋ฆฌ๋ Œ๋”๋ง ํ•˜๊ณ  ์žˆ๋Š” ๊ฒƒ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ์—ˆ๋‹คโ€ฆ
๋”์ฐํ•˜๋‹คโ€ฆ




โšก 2. useEffect ๋‚ด๋ถ€์— ํ•จ์ˆ˜๋ฅผ ์ •์˜ํ•œ ๊ฒฝ์šฐ.


๋ธ”๋กœ๊ทธ ๊ธ€์„ ์ฐธ๊ณ ํ•ด์„œ ์œ ์ถ”ํ•ด๋ณด์ž๋ฉด
useEffect ์•ˆ์—์„œ ์‚ฌ์šฉํ•˜๊ณ ์žˆ๋Š” getMovie๊ฐ€ ๋ณ€์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜๊ณ ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ํ•ด๋‹น ๊ฐ’์„ ๋„ฃ์–ด์ค˜์•ผ ๊ฒฝ๊ณ ๊ฐ€ ๋‚˜์˜ค์ง€ ์•Š๋Š”๋‹ค.


useEffect(() => {
  getMovie();
}, [getMovie, id]);


useEffect๋ถ€๋ถ„์„ ์œ„์ฒ˜๋Ÿผ ๋ฐ”๊พธ๊ณ  ์‹คํ–‰ํ•ด๋ดค์ง€๋งŒ ์ฒซ ๋ฒˆ์งธ ์ˆ˜์ •๊ณผ ๊ฐ™์€ ๋ฐ˜๋ณต๋˜๋Š” ๊ฒฐ๊ณผ๊ฐ€ ๋‚˜์™”๋‹ค..ใ… 
์ œ๋ฐœ ํ•ด๊ฒฐ์ฑ…์ด ๋” ๋‚˜์™€์žˆ๊ธฐ๋ฅผโ€ฆ ํ•˜๋ฉฐ ์Šคํฌ๋กค์„ ๋‚ด๋ ธ๋Š”๋ฐ useCallback์„ ์ด์šฉํ•˜๋Š” ๋ฐฉ๋ฒ•์ด ๋‚˜์™”๋‹ค.





โšก 2-2. useCallback.


useCallback์„ ์‚ฌ์šฉํ•˜์ง€ ์•Š์œผ๋ฉด ์ปดํฌ๋„ŒํŠธ๊ฐ€ ๋ฆฌ๋ Œ๋”๋ง ๋  ๋•Œ๋งˆ๋‹ค ๊ณ„์†ํ•ด์„œ ํ•จ์ˆ˜๋ฅผ ๋งŒ๋“ค๊ฒŒ ๋˜๊ณ , ์ƒˆ๋กœ์šด ์ฐธ์กฐ๊ฐ’์„ ๋ฐ›๊ธฐ ๋•Œ๋ฌธ์— ๋ฐ˜๋ณต์ ์œผ๋กœ ํ•จ์ˆ˜๋ฅผ ์‹คํ–‰ํ•˜๊ฒŒ ๋œ๋‹ค๊ณ  ํ•œ๋‹ค.
ํ•˜์ง€๋งŒ useCallback์„ ์ •์˜ํ•˜๋ฉด params๊ฐ€ ๋ฐ”๋€”๋•Œ ๋งŒ ํ•จ์ˆ˜๊ฐ€ ์‹คํ–‰๋˜์–ด์„œ ๋ถˆํ•„์š”ํ•œ ํ•จ์ˆ˜ ์ƒ์„ฑ๊ณผ ์‹คํ–‰์„ ๋ง‰์„ ์ˆ˜ ์žˆ๋‹ค.


const [details, setDetails] = useState([]);
const { id } = useParams();
const getMovie = useCallback(async () => {
  const json = await (
    await fetch(`https://yts.mx/api/v2/movie_details.json?movie_id=${id}`)
  ).json();
  console.log(json.data.movie);
  setDetails(json.data.movie);
  console.log(details);
}, [id]);
useEffect(() => {
  getMovie();
}, [getMovie]);


useEffect(() => {
  getMovie();
}, [getMovie, id]);


์ด๊ฑฐ๋‹ค..! ํ•˜๋Š” ๋งˆ์Œ์œผ๋กœ ์œ„์ฒ˜๋Ÿผ ์ฝ”๋“œ๋ฅผ ์ˆ˜์ •ํ•ด์„œ ๋‹ค์‹œ ์‹คํ–‰ํ•ด๋ณด์•˜๋‹ค.
ํ•˜์ง€๋งŒโ€ฆ ๋‹ค์‹œ ์ฒ˜์Œ์œผ๋กœ ๋Œ์•„๊ฐ”๋‹ค..ใ… ใ… 
details๋Š” ๋น„์–ด์žˆ๋‹คโ€ฆ
์•„๋ž˜ useEffect๋ถ€๋ถ„์„ ๋‘ ๋ฒˆ์งธ ์ฒ˜๋Ÿผ ๋ฐ”๊ฟ”์„œ๋„ ํ•ด๋ดค์ง€๋งŒ ์•ˆ๋œ๋‹น..ํ—ˆํ—ˆ





image





์ด๊ฒƒ ์ €๊ฒƒ ๋ฐ”๊ฟ”๊ฐ€๋ฉฐ ์ž์„ธํžˆ ๋ณด๋‹ˆ useEffect์•ˆ์˜ console.log๊ฐ€ ๋จผ์ € ์ฐํžˆ๊ณ  ๋‚˜์„œ getMovie์˜ console.log๊ฐ€ ์ฐํžŒ๊ฑธ ํ™•์ธํ–ˆ๋‹ค..
๊ทธ๋ ‡๋‹ค๋Š” ๋ง์€ useEffect๊ฐ€ ์‹คํ–‰๋˜๊ณ  ๊ทธ ๋‹ค์Œ์— getMovie๊ฐ€ ์‹คํ–‰๋˜๋‹ˆ๊นŒ useParams๋กœ ๋ฐ›์€ id๊ฐ€ ๋ฐ”๋€”๋•Œ ์ฝ˜์†”์— ์ฐํž ์ˆ˜ ์žˆ๋„๋ก ์ˆœ์„œ๋ฅผ ์กฐ๊ธˆ ๋ฐ”๊ฟ”์„œ ๋‹ค์‹œ ์‹คํ–‰ํ•ด๋ดค๋‹ค.



function Detail() {
  const [loading, setLoading] = useState(true);
  const [details, setDetails] = useState([]);
  const { id } = useParams();

  console.log(details);

  useEffect(() => {
    const getMovie = async () => {
      const json = await (
        await fetch(`https://yts.mx/api/v2/movie_details.json?movie_id=${id}`)
      ).json();
      console.log(json.data.movie);
      setDetails(json.data.movie);
      setLoading(false);
    };
    getMovie();
  }, [id]);
  return null;
}



image



์ด๋ ‡๊ฒŒ ํ•˜๊ณ  ๋‚˜๋‹ˆ๊นŒ ๋จผ์ € ์•„๋ฌด๊ฒƒ๋„ ์—†๋˜ ๋นˆ ๋ฐฐ์—ด์ด ๋จผ์ € ์ถœ๋ ฅ๋˜๊ณ  ๊ทธ ๋‹ค์Œ์— ์ฝ˜์†”์— ์ถœ๋ ฅ๋œ ๊ฐ€์ ธ์˜จ api์˜ ๋ฐฐ์—ด, ๊ทธ ๋‹ค์Œ์— setDetails์— ๋„ฃ์–ด์ฃผ๊ณ  ๋‹ค์‹œ console.log(details) ๊ฐ€ ์‹คํ–‰๋๋‹ค.


์‚ฌ์‹ค? ์–ด๋–ป๊ฒŒ ๋œ ์˜๋ฌธ์ธ์ง€๋Š” ์ž˜ ๋ชจ๋ฅด๊ฒ ์Šต๋‹ˆ๋‹ค๋งŒ?
์ด๊ฒŒ ๋ฌธ์ œ๊ฐ€ ํ•ด๊ฒฐ๋œ ๊ฒƒ์ธ์ง€..?
์˜ ์ฐ์ฐํ•˜๋‹ค.





Categories:

Updated:

Leave a comment