React Hook useEffect has a missing dependency: 'fetchMovieData'. Either include it or remove the dependency array.
이전처럼 netflix clone사이트를 작업하던 중 표시된 경고문.
음.. 이건 무슨 경고일까???? 찾아보았다.
저어~기 14번째 줄
에 보면 노란 밑줄이 보인다. 저 위치에서 경고가 뜬건데 경고문 내용을 검색해보니 초반에 보이는건 일단 저 경고가 뜬 부분을 기능적으로 block해서 일시적으로 해결하는 방법이 있었다.
아래 코드를 문제가 되는 위치에 넣어주면 된다.
// eslint-disable-next-line react-hooks/exhaustive-deps
useEffect(() => {
expresstion
// eslint-disable-next-line react-hooks/exhaustive-deps
}, [])
위에서 일시적인 해결방법을 찾아내긴 했지만 이건 말 그대로 '일시적' 해결이다. 경고가 뜨는 코드를 block하는 것이기 때문에 원하는 기능을 구현할 수가 없다.
그래서 근본적인 해결책을 더 찾으려 했다. 다행히 검색해보니 금방 찾을 수 있었다.
검색결과를 보니,
오류의 원인은 작성한 'useEffect
내부에서 실행된 함수 ' 에서 사용되는 변수를 useEffect의 배열안에 넣어주지 않았기 때문이라고 한다.
말로는 어려우니 예시를 보자.
위가 내가 경고가 뜬 부분이다. 보면 fetchMovieData()
라는 함수가 useEffect함수 내에서 실행되었으나 이 함수는 useEffect 외부에서 선언되어있다. 물론 실행에는 문제가 없지만 보다시피 useEffect의 배열란에 경고가 떴다. 이는 fetchMovieData함수에서 사용하고 있는 fetchUrl
이 배열란에 들어가야 한다는 뜻이다.
그럼 이것을 올바르게 바꿔보자.
보이다시피 함수의 선언을 useEffect 내부로 옮겼고, 이 함수에서 사용하던 fetchUrl
이라는 변수를 useEffect의 배열 내에 작성해주었다.
이렇게 하면 더 이상 경고문이 뜨지 않는다.
위에서 함수에서 사용한 변수를 배열에 넣어주며 문제를 해결했는데, useCallback
을 이용해서 해결하는 방법도 있다.
const fetchMovieData = useCallback(async () => {
const request = await axios.get(fetchUrl);
setMovies(request.data.results);
}, [fetchUrl]);
useEffect(() => {
fetchMovieData();
}, []);
이렇게하면 원래 useCallback이 없을 땐 리렌더링을 할 때마다 함수를 새롭게 만들고, 새롭게 실행되었던 것에 반해,
useCallback
을 사용하므로써 fetchUrl
이 변화될 때만 함수가 실행되어 불필요한 함수의 생성 및 실행을 막을 수 있다고 한다.
본인은 전자의 방법으로 해결했는데 이 방법이 더 효율적인 것 같다.
잘못된 부분에 대한 지적은 얼마든지 환영입니다.
감사합니다.