인프런 커뮤니티 질문&답변
10.3 TodoItem 부모 재랜더링
해결된 질문
작성
·
25
·
수정됨
0
강의 10.3에서 TodoItem.jsx의 onchange 이벤트가 발생할때마다 부모도 같이 재랜더링 되는것 같아서요. 제가 짠 소스도 참고해보시면 부모 태그들에 각각 재랜더링이 될때마다 로그를 찍어봤는데 다 찍혀서
로그 찍는 시점이 잘못된건지
React dev tool이 이상한건지
제가 코드를 잘못 친건지
모르겠어서 질문 드립니다.

https://github.com/Joonsby/one-bite-react/tree/master/section10
코드는 위에 링크에 올려놨으니 참고해주시면 될것 같습니다.
답변 2
0
안녕하세요 flamewizkey님 이정환입니다.
TodoItem의 체크박스를 클릭했을 때, TodoItem의 부모 컴포넌트들(TodoList, App 등)이 리렌더링 되는 현상은 버그가 아닌 자연스러운 현상입니다. 아래는 강의 화면 캡쳐인데요 아래 화면에서도 부모 컴포넌트들은 리렌더링 되고 있는것을 확인하실 수 있습니다.

본 챕터의 핵심 포인트는 특정 TodoItem 컴포넌트의 체크박스가 클릭되었을 때, 다른 TodoItem 컴포넌트가 불 필요하게 리렌더링 되지 않도록 최적화 하는 작업입니다. 따라서 다른 TodoItem이 아닌 부모 컴포넌트의 리렌더링 여부는 핵심이 아닙니다.
참고로 부모 컴포넌트들이 렌더링 되는 이유는 간단합니다. TodoItem의 체크박스가 클릭이 되면 App 컴포넌트의 todos State 값에 변화가 발생하게 되고 이로 인해 App 컴포넌트가 리렌더링 되어 App 아래의 모든 컴포넌트가 리렌더링 되기 때문입니다.
0
안녕하세요, 인프런 AI 인턴입니다. flamewizkey님께서 겪고 계신 TodoItem 컴포넌트의 리렌더링 문제에 대해 설명드리겠습니다.
리액트에서 컴포넌트가 리렌더링되는 주된 이유는 다음과 같은 경우입니다:
부모 컴포넌트의 리렌더링: 부모 컴포넌트가 리렌더링되면 해당 부모의 자식 컴포넌트들도 함께 리렌더링될 수 있습니다.
컴포넌트의 상태 변경: 자체 상태(state)가 변경될 때마다 관련 컴포넌트는 리렌더링됩니다.
Props 변화: 부모로부터 받은 props가 변경될 때마다 자식 컴포넌트는 리렌더링됩니다.
flamewizkey님이 링크해주신 GitHub 리포지토리를 기반으로, 여러 번의 리렌더링이 발생하는 원인을 알아보겠습니다.
리렌더링 및 해결 방안
상태 관리 확인: 컴포넌트 내에서 사용하는
state가 어떻게 변하는지 확인하세요. 상태 변화는 항상 리렌더링을 유발합니다.React.memo 사용 고려: 자식 컴포넌트가 props에 따라 리렌더링되는 것을 방지하기 위해
React.memo를 사용하여 메모이제이션을 적용할 수 있습니다. 이를 통해 특정 props가 변할 때만 리렌더링되도록 설정할 수 있습니다.
import React, { memo } from 'react';
const TodoItem = memo(({ todo, onChange }) => {
// TodoItem 컴포넌트 코드
});
export default TodoItem;
- useCallback 사용 검토:
onChange와 같은 함수 props가 부모로부터 전달될 때,useCallback을 활용하여 함수가 새로운 객체로 생성되지 않도록 해보세요. 이렇게 해야 함수를 통해 자식 컴포넌트가 불필요하게 리렌더링되는 것을 방지할 수 있습니다.
참고할 수 있는 유사한 문제 해결 사례
-
- 설명: React의 상태 초기화 과정에서의 State 업데이트와 관련한 리렌더링 이슈를 분석하고 강조합니다.
- 설명: React의 상태 초기화 과정에서의 State 업데이트와 관련한 리렌더링 이슈를 분석하고 강조합니다.
Checkbox를 누르는데 왜 Editor가 리렌더링되나요?
- 설명: 특정 이벤트가 다른 컴포넌트의 리렌더링을 유발하는지에 대한 분석과 솔루션을 제공합니다.
- 설명: 특정 이벤트가 다른 컴포넌트의 리렌더링을 유발하는지에 대한 분석과 솔루션을 제공합니다.
위 질문과 답변을 통해 useCallback, React.memo 및 상태 관리에 대한 좀 더 심화된 이해를 얻을 수 있습니다.
저는 질문자님의 이해를 돕고자 지식공유자님의 기존 답변을 참고하여 유사한 답변 링크를 추천해드리고 있습니다. 현재 베타 기능으로 답변이 만족스럽지 않을 수 있는 점 양해 부탁드립니다. 🙏 추가적으로 궁금한 점이 있으시면, 이어서 질문해 주세요. 곧 지식공유자께서 답변해 주실 것입니다.





아 네네 이해했습니다. 부모들의 리랜더링을 막는게 아니고 부모 안에 있는 컴포넌트들의 불필요한 리랜더링을 막는게 맞다는 말씀이신군요. 덕분에 도움 됐습니다. 감사합니다!