React Academy · 강의

선택기와 불필요한 다시 렌더링 방지

선택기로 필요한 상태 조각만 추출해 필요할 때만 컴포넌트가 다시 렌더링되도록 합니다.

레슨 2/413개 단계

선택기와 불필요한 다시 렌더링 방지은(는) CoddyKit의 무료 React Academy 강의입니다. 이것은 4개 중 2번째 강의입니다. 아래에서 전체 강의를 무료로 읽을 수 있으며, 내장 코드 에디터와 24/7 AI 튜터와 함께 브라우저에서 직접 실습할 수 있습니다. 이 강의는 React Academy 학습 경로의 일부이며, 진행 상황이 웹과 CoddyKit 앱에 동기화됩니다. React Academy 강의에는 총 4개의 강의가 포함되어 있습니다.

환영합니다

이 레슨에서는 Zustand 선택자를 사용하여 컴포넌트가 필요한 상태 조각만 구독하도록 만들고, store의 다른 부분이 변경될 때 발생하는 불필요한 다시 렌더링을 방지합니다.

기본 선택자의 문제

선택자 없이 store 훅을 호출하면 전체 store 객체가 반환됩니다. 관련 없는 상태의 변경을 포함하여 store가 변경될 때마다 컴포넌트가 EVERY 다시 렌더링됩니다.
// Bad: re-renders on every store change
const store = useAppStore();
return <p>{store.user.name}</p>;

선택자 사용하기

store 훅에 선택자 함수를 전달합니다. 선택자의 반환 값이 변경될 때만 컴포넌트가 다시 렌더링됩니다.
// Good: re-renders only when user.name changes
const name = useAppStore(s => s.user.name);
return <p>{name}</p>;

참조 동등성 확인

Zustand는 기본적으로 엄격한 동등성(===)을 사용합니다. 선택자가 호출될 때마다 새 객체나 배열을 반환하면 내용이 같더라도 컴포넌트가 다시 렌더링됩니다.
// Creates a new object every time — always re-renders!
const info = useStore(s => ({ id: s.id, name: s.name }));

얕은 동등성으로 수정하기

zustand에서 `shallow`를 가져와 동등성 함수로 전달하면 객체의 내용이 같을 때 다시 렌더링되는 것을 방지할 수 있습니다.
import { shallow } from 'zustand/shallow';

const info = useAppStore(
  s => ({ id: s.id, name: s.name }),
  shallow // compare by content, not reference
);

여러 값 선택하기

얕은 동등성 패턴을 사용하면 불필요한 다시 렌더링을 만들지 않고 여러 값을 한 번에 선택할 수 있습니다.
const { items, loading } = useCartStore(
  s => ({ items: s.items, loading: s.loading }),
  shallow
);

안정적인 동작 참조

Zustand의 동작(함수)은 안정적인 참조를 가집니다. 상태가 업데이트되어도 변경되지 않습니다. 따라서 얕은 동등성 없이 선택해도 다시 렌더링을 일으키지 않습니다.
// Actions are always stable — no shallow needed
const addToCart = useCartStore(s => s.addToCart);

useShallow 도우미(Zustand v5 이상)

Zustand v5는 선택자를 얕은 동등성으로 자동으로 감싸는 useShallow 유틸리티를 제공하므로 코드가 더 깔끔해집니다.
import { useShallow } from 'zustand/react/shallow';

const { items, loading } = useCartStore(
  useShallow(s => ({ items: s.items, loading: s.loading }))
);

선택자 조합하기

store에 파생 상태를 저장하지 않도록 선택자 내부에서 계산된 값을 도출합니다. 선택자에서 합계, 필터링된 목록 또는 서식이 적용된 문자열을 계산합니다.
const totalPrice = useCartStore(
  s => s.items.reduce((sum, item) => sum + item.price, 0)
);

Zustand 다시 렌더링 프로파일링

React DevTools 프로파일러를 사용하여 선택자가 제대로 작동하는지 확인합니다. store에 관련 없는 항목을 추가한 후 이름 선택자만 사용하는 컴포넌트가 커밋 불꽃 그래프에 NOT 나타나는지 확인합니다.

간단한 확인

Zustand 선택자가 객체를 반환할 때 얕은 동등성을 사용해야 하는 이유는 무엇인가요?

복습

항상 구체적인 선택자를 사용합니다. 객체로 여러 값을 선택할 때는 얕은 동등성을 사용합니다. 선택자 내부에서 계산된 값을 도출합니다. 동작은 안정적인 참조를 가지므로 얕은 동등성이 필요하지 않습니다.

다음 학습 내용

다음 레슨: **persist 미들웨어로 상태 저장하기** — persist 미들웨어를 사용하여 Zustand 상태를 localStorage와 동기화합니다.
무료로 시작

AI 튜터와 함께 React을(를) 배우세요 — 무료

브라우저에서 실제 코드를 작성하고 실행하며, 24/7 AI 튜터로부터 즉각적인 도움을 받고, 웹이나 앱에서 중단한 부분부터 계속 학습하세요.

코스
88
레슨
324

자주 묻는 질문

“선택기와 불필요한 다시 렌더링 방지” 강의는 무료인가요?

네 — “선택기와 불필요한 다시 렌더링 방지” 전체 내용을 이 웹사이트에서 무료로 읽을 수 있습니다. 인터랙티브하게 실습하려면(내장 코드 에디터와 24/7 AI 튜터), CoddyKit PRO로 업그레이드하면 React Academy 강의 전체를 잠금 해제할 수 있습니다. React Academy 강의에는 총 4개의 강의가 포함되어 있습니다.

“선택기와 불필요한 다시 렌더링 방지”에서 뭘 배우나요?

선택기로 필요한 상태 조각만 추출해 필요할 때만 컴포넌트가 다시 렌더링되도록 합니다. 브라우저에서 직접 실행하는 실습 코드로 React Academy을(를) 배우며, 24/7 AI 튜터가 강의를 진행하면서 질문에 답변해줍니다.

React Academy을(를) 시작하는 데 경험이 필요한가요?

사전 경험은 필요하지 않습니다. CoddyKit의 React Academy은(는) 초급자부터 고급 학습자까지를 위해 구성되어 있으므로, 여기서 시작하거나 처음부터 시작할 수 있으며 자신의 속도대로 진행할 수 있습니다. 이것은 4개 중 2번째 강의입니다.

“선택기와 불필요한 다시 렌더링 방지” 강의는 얼마나 걸리나요?

대부분의 CoddyKit 강의는 약 5~10분이 소요됩니다. 각 강의는 간결하고 인터랙티브하여 꾸준한 진행이 가능하며, 웹과 앱에서 중단한 부분부터 바로 시작할 수 있습니다.

이 React Academy 강의에서 코드를 작성하고 실행할 수 있나요?

네. 모든 React Academy 강의에는 내장 코드 에디터가 포함되어 있으므로, 브라우저에서 바로 실제 코드를 작성하고 실행한 후 즉시 AI 피드백을 받을 수 있습니다 — 로컬 설정이 필요 없습니다.

이 강의의 모든 강의

  1. 첫 Zustand 스토어 만들기
  2. 선택기와 불필요한 다시 렌더링 방지
  3. Persist 미들웨어로 상태 유지하기
  4. Zustand DevTools와 스토어 테스트
← React Academy(으)로 돌아가기