Context API 리랜더링 방지를 위한 Memoization에 대한 질문
63
작성한 질문수 3
계속해서 학습을 진행중인데, 함수값을 넘길때에는 useCallback을 사용해야한다는 것으로 알고있었는데,
>>밑에는 실제 강의 중 공유해 주신 ContextProvider 안에 함수들
const increment = () => {
setCount((count) => count + 1);
};
const decrement = () => {
setCount((count) => count - 1);
};
const reset = () => {
setCount(0);
};
const memoization = useMemo(()=>({
increment, decrement, reset
}),[]);>>제가 생각했던 방식
const increment = useCallback(() => {
setCount((count) => count + 1);
},[]);
const decrement = useCallback(() => {
setCount((count) => count - 1);
},[]);
const reset = useCallback(() => {
setCount(0);
},[]);
const memoization = useMemo(()=>({
increment, decrement, reset
}),[increment, decrement, reset]);저는 밑에 memoization 변수를 빼고 바로 useCallback을 이용해서 객체값으로 넘겨주는 식으로 작성해야 한다고 생각을 했었습니다. 코드를 작성하는 방법에는 정답은 없지만, 당장은 기본에 입각한 학습을 해야하기에 어떤 방법이 조금 더 효율적인지 여쭤보고 싶습니다.
답변 2
1
안녕하세요.
메모이제이션의 핵심은 “전달되는 데이터를 캐싱한다”는 점입니다.
예를 들어, 어떤 함수를 다른 컴포넌트로 넘겨주면서 매번 새로 생성되지 않도록 하고 싶다면, useCallback을 사용해 함수를 메모이제이션해야 합니다.
반면 Context API는 결국 value={{...}} 형태로 객체를 다른 컴포넌트에 전달합니다. 이때 전달하는 객체를 메모이제이션하고 싶다면 useMemo를 사용해야 합니다. 객체는 참조값이므로 함수가 포함되어 있더라도 상관없이 객체 자체를 메모이제이션하는 것이 중요합니다.
즉, 전달하려는 값이 무엇이든 “그 값 자체를 메모이제이션한다”는 것이 핵심 원리입니다. 🙂
0
안녕하세요, 인프런 AI 인턴입니다. songso96님.
Context API 사용 시, 함수형 컴포넌트를 전달하기 위해 useCallback과 useMemo를 활용하여 리렌더링을 방지하는 방법에 대해 질문을 주셨는데요. 각 방식이 언제 더 효과적인지 궁금하신 것 같습니다.
두 방법의 차이점과 추천 방식:
useCallback사용:useCallback은 특정 함수가 호출되는 빈도를 줄이기 위해 사용됩니다. 즉, 의존성 배열이 변경되지 않는 한, 이미 생성된 함수를 재사용함으로써 불필요한 함수 재생성을 방지할 수 있습니다.
- 이는 함수가 콜백으로 사용되거나, 자주 변경되어서는 안 되는 상황에서 유용합니다.
useMemo사용:- 함수들을 객체로 묶어 한꺼번에 전달하는 경우,
useMemo를 사용하는 접근 방식도 효율적입니다. 이 방법은 함수들을 그룹화하여 객체로 일관되게 관리할 수 있습니다.
useMemo는 생성된 객체가 의존성 배열에 의해 데이터 변화를 감지해야 하는 상황에서 특히 효과적입니다.
- 함수들을 객체로 묶어 한꺼번에 전달하는 경우,
효율적 사용:
- 함수가 개별적으로 필요하다면
useCallback을 사용하여 필요할 때만 함수 인스턴스를 생성하도록 하는 것이 좋습니다.
- 여러 개의 함수를 객체로 묶어 전달해야 하거나, 객체 전체가 자주 업데이트되지 않아야 한다면
useMemo를 활용하여 묶음 객체를 캐싱하는 전략이 유용합니다.
이와 관련된 추가적인 학습을 도와드릴 수 있는 참고 링크를 아래에 추천드립니다:
저는 질문자님의 이해를 돕고자 지식공유자님의 기존 답변을 참고하여 유사한 답변 링크를 추천해드리고 있습니다.
현재 베타 기능으로 답변이 만족스럽지 않을 수 있는 점 양해 부탁드립니다. 🙏
추가적으로 궁금한 점이 있으시면, 이어서 질문해 주세요. 곧 지식공유자께서 답변해 주실 것입니다.
상태(State) 가 "시간이 지남~" 에 대해 질문 있습니다.
0
34
2
import {} 중괄호 차이점
0
38
2
[ 문의]몽고DB connect 의 건
0
47
2
제공되는 react_code.zip 중에 ..
0
47
2
커리큘럼 비활성화
0
46
2
설명하시는 개념들을 잘 모르겠습니다.
0
43
2
이해가 절반 정도 되는데요.
0
56
1
styled-components(전역)
0
56
1
cloudinary 관련
0
71
3
useOptimistic 실전-1 useState
0
87
2
discord 초대장 갱신이 필요한거같습니다.
0
83
1
할일 관리 앱(메모이제이션)
0
99
2
Web 플랫폼 등록
0
140
2
함수 정의 기준
0
87
2
fetch는 사용되는가
0
88
2
전역상태 관리 선택 기준
0
109
2
tailwind css는 언제 사용되는가 또 다른 css와의 차이
0
210
2
카카오 web플랫폼 등록
0
193
2
컴포넌트 그리고 폴더 구조에 대해
0
78
2
152강 보는중입니다. 초시계부분이구요. 넘버가 timeout을 받을수없다는 에러가 나오고 있어요
0
52
1
폼테그 다른 태그를 하나의 상태 객체로 묶기
0
55
2
class를 className으로 전부 수정하실 때
0
49
2
JWT에 대한 개념도 학습할 수 있나요?
0
74
2
수업자료 다운로드
0
61
2





