언어 및 도구들 공부/React

의존성 배열을 받는 hook들

Dr.Mlem 2024. 12. 5. 15:19

 

Q1.
React에서 useEffect같은 경우에는, 2번째 파라미터로 의존성(혹은 종속성)배열을 넣어서, 그 배열 안에 계속 지켜볼 상태변수를 넣어두면, 해당 배열에 들어간 상태 변수들 중 하나라도 값이 바뀌면 useEffect에 들어간 콜백함수를 실행하게 되는데,

 

이때 궁금한 것이,

이 의존생 배열을 파라미터로 받는 hook은, React에서 useEffect 말고도 어떤 hook있는지야.

 

1. 어떤 hook들이 2번째 파라미터로 의존성 배열을 받는거야?

2. 또, 2번째 파라미터로 의존성 배열을 받는 다른 hook들이 있다면, 해당 hook들도 의존성 배열 안에 상태변수만을 받는지,

3. 그리고 배열에 들어간 값들을 useEffect 처럼 모니터링하다가 변화를 감지하면 hook에 들어온 콜백함수를 실행하는지,

 

이렇게 3개에 대해서 설명해줘.

 

내가 질문한 내용에 대해서 부족한 점이 있다면 보충해주고, 그 보충해준 부분에 대해서도 설명해야할 내용이 있다면 설명 부탁해.

 
 
 
A1.

ChatGPT의 말:

 

React에서 useEffect와 같이 의존성 배열을 두 번째 파라미터로 받는 Hook에 대한 질문은 매우 중요한 React의 동작 원리를 다루고 있습니다. 질문의 세 가지 포인트를 기준으로 정리하며, 필요한 보충 설명도 추가하겠습니다.


1. React에서 2번째 파라미터로 의존성 배열을 받는 Hook들

React에는 useEffect 외에도 두 번째 파라미터로 의존성 배열을 받는 Hook들이 있습니다:

  • useEffect
  • useMemo
  • useCallback

2. 다른 Hook들도 의존성 배열 안에 상태변수만을 받는지

의존성 배열의 역할

의존성 배열은 "Hook에서 사용하는 값 중 변경을 감지해야 하는 값"을 정의합니다. 이 배열에 들어갈 수 있는 값은 상태 변수, props, 혹은 컴포넌트 외부에서 참조된 값(예: 상수, 객체, 함수) 등이 포함됩니다. 즉, 의존성 배열에는 상태 변수뿐만 아니라, 현재 스코프에서 참조된 모든 React 관련 값이 들어갈 수 있습니다.


3. 의존성 배열을 모니터링하고 변화 감지 시 Hook을 실행하는지

각 Hook의 동작 방식을 설명합니다.

useEffect

  • 의존성 배열의 값 변경을 감지하여, 콜백 함수를 재실행합니다.
  • 의존성 배열이 비어 있으면 [], 마운트 시 한 번만 실행합니다.
  • 의존성 배열이 없으면(생략) 매번 렌더링될 때 실행됩니다.

useMemo

  • useMemo는 비용이 큰 계산을 최적화하기 위해 사용합니다.
  • 의존성 배열의 값이 변경될 때만 콜백 함수가 실행되고, 그 결과가 재계산됩니다.
  • 의존성 배열의 값이 변경되지 않으면 이전 계산 결과를 재사용합니다.
const memoizedValue = useMemo(() => expensiveCalculation(a, b), [a, b]);

useCallback

  • useCallback은 함수를 메모이제이션하기 위해 사용됩니다.
  • 의존성 배열의 값이 변경될 때만 새 함수 인스턴스를 생성합니다.
  • 의존성 배열의 값이 동일하면 이전 함수 참조를 반환합니다.
const memoizedCallback = useCallback(() => {
  doSomething(dependency);
}, [dependency]);

추가 보충 설명

1. 의존성 배열에서 주의할 점

  • React는 의존성 배열을 통해 **클로저 문제(Closure Issue)**를 방지하려고 합니다. 그렇기 때문에 의존성 배열에 포함된 값들이 최신 값을 참조하도록 보장해야 합니다.
  • ESLint의 react-hooks/exhaustive-deps 규칙을 따르면 의존성 배열을 자동으로 관리할 수 있습니다.

2. 의존성 배열이 없는 경우의 문제점

  • useEffect에서 의존성 배열을 생략하면, 모든 렌더링에서 콜백 함수가 실행되어 성능 문제가 발생할 수 있습니다.
  • useMemo나 useCallback에서 의존성 배열을 생략하면 메모이제이션의 이점이 사라져, 매번 새 값을 계산하거나 새로운 함수가 생성됩니다.

3. 사용 사례 비교

  • useEffect: 비동기 데이터 가져오기(fetch), DOM 조작, 구독 설정 등 부수 효과(Side Effect) 처리.
  • useMemo: 계산량이 큰 작업이나 렌더링 최적화.
  • useCallback: 자식 컴포넌트에 props로 전달할 때 함수를 메모이제이션하여 불필요한 리렌더링 방지.

정리

  1. 의존성 배열을 받는 Hook은 useEffect, useMemo, useCallback입니다.
  2. 의존성 배열에는 상태 변수뿐 아니라, 현재 스코프에서 참조한 모든 값이 들어갈 수 있습니다.
  3. 이 Hook들은 의존성 배열 내 값의 변경을 감지하여 실행하거나 메모이제이션 결과를 반환합니다.

추가적으로 궁금한 점이 있거나 각 Hook에 대한 코드 예제를 보고 싶다면 말씀해주세요!

 

 

 

Q2.

나의 말:

해당 3개 훅 말고는 의존성 배열을 파라미터로 받지 않는거야?
맞으면 예 만 답해주고, 아니라면 어떤 훅들이 더 있는지 알려줘.
 
 
 
A2.

ChatGPT의 말:

 

아니요.

의존성 배열을 파라미터로 받을 수 있는 추가적인 Hook은 없습니다. useEffect, useMemo, useCallback 이 세 가지가 유일합니다.