0Pricing
React Academy · 강의

순수 구성 요소 및 렌더링 부작용 피하기

변경과 외부 읽기가 없는 렌더링 함수를 작성합니다.

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

환영합니다

이 레슨에서는 React에서 순수 컴포넌트가 무엇을 의미하는지, 렌더링 함수에 부작용이 없어야 하는 이유, 일반적인 순수성 위반을 발견하고 해결하는 방법을 배웁니다.

순수 함수란 무엇인가요

순수 함수는 동일한 입력에 항상 동일한 출력을 반환하며 관찰 가능한 부작용을 일으키지 않습니다. React는 컴포넌트 함수가 순수하기를 기대합니다. 동일한 프롭과 상태가 주어지면 항상 동일한 JSX를 반환해야 합니다.

React에서 순수성이 중요한 이유

React는 컴포넌트를 여러 번 호출할 수 있습니다(StrictMode, 동시성 기능, 서버 렌더링). 렌더링에 API 호출, DOM 변경, 전역 변수에 쓰기와 같은 부작용이 있으면 이러한 효과가 예측할 수 없이 여러 번 실행됩니다.

일반적인 순수성 위반: 외부 상태 변경

렌더링 중에 컴포넌트 외부에서 정의된 변수를 변경하지 마십시오. 이벤트 처리기나 useEffect 안에서는 변경해도 되지만 렌더링 중에는 변경하면 안 됩니다.
let totalRenders = 0; // external
function Counter() {
  totalRenders++; // BAD: side effect in render
  return <p>{totalRenders}</p>;
}

일반적인 순수성 위반: 프롭 변경

컴포넌트 안에서 프롭 객체를 변경하지 마십시오. 프롭은 읽기 전용입니다. 수정된 버전이 필요하다면 새 변수를 만드십시오.
// Bad
function Badge({ user }) {
  user.name = user.name.toUpperCase(); // mutates prop!
  return <p>{user.name}</p>;
}

// Good
function Badge({ user }) {
  const displayName = user.name.toUpperCase();
  return <p>{displayName}</p>;
}

일반적인 순수성 위반: 렌더링에서 무작위 값 또는 날짜 사용

렌더링에서 `Math.random()` 또는 `Date.now()`를 직접 호출하면 호출할 때마다 다른 값이 생성되어 순수성이 깨집니다. 이러한 호출을 상태 초기화 함수나 useEffect로 옮기십시오.
// Bad
function Token() {
  const id = Math.random(); // different every render!
  return <p>{id}</p>;
}

// Good
function Token() {
  const [id] = useState(() => Math.random());
  return <p>{id}</p>;
}

API 호출은 useEffect에서 수행하기

컴포넌트 함수 본문에서 직접 데이터를 가져오는 것(useEffect 안이 아닌 경우)은 렌더링마다 실행되므로 순수성 위반입니다. 데이터 요청은 항상 적절한 종속성과 함께 useEffect 안으로 옮기십시오.
// Bad
function Profile({ id }) {
  fetch('/api/user/' + id); // runs on every render!
  return <div />;
}

// Good
useEffect(() => {
  fetch('/api/user/' + id).then(/*...*/);
}, [id]);

로컬 변경은 괜찮습니다

동일한 렌더링 호출 안에서 생성한 객체나 배열을 만들고 변경하는 것은 완전히 괜찮습니다. 다른 어떤 코드도 이를 관찰할 수 없기 때문입니다. 이를 로컬 변경이라고 합니다.
function List({ items }) {
  const sorted = [...items]; // new array
  sorted.sort();             // mutating a local copy: OK
  return sorted.map(i => <li key={i}>{i}</li>);
}

StrictMode로 순수성 위반 찾기

React StrictMode는 개발 환경에서 컴포넌트를 두 번 호출합니다. 두 호출 사이에서 UI가 일관되지 않거나 부작용이 중복되어 나타난다면 렌더링이 순수하지 않은 것입니다. 이중 호출이 문제가 되지 않을 때까지 순수성 위반을 해결하십시오.

순수 컴포넌트와 React.memo

컴포넌트가 순수하다면(동일한 프롭 → 동일한 출력) `React.memo`로 감싸 React에 프롭이 변경되지 않은 경우 다시 렌더링을 건너뛸 수 있다고 알릴 수 있습니다. 이렇게 하면 성능이 향상됩니다.
const Pure = React.memo(function Pure({ value }) {
  return <p>{value}</p>;
});

빠른 확인

다음 중 React 컴포넌트의 렌더링 함수 안에서 직접 수행해도 되는 부작용은 무엇인가요?

복습

순수 컴포넌트는 동일한 입력에 항상 동일한 JSX를 반환합니다. 렌더링 중 프롭이나 외부 변수를 변경하지 말고, 부작용에는 useEffect를 사용하며, StrictMode로 위반을 찾으십시오.

다음 학습

다음 레슨: **키 및 참조 사용 모범 사례** — 안정적인 키를 올바르게 사용하고, 인덱스를 키로 사용하는 문제를 피하며, 콜백 참조를 다루는 방법을 배웁니다.

자주 묻는 질문

“순수 구성 요소 및 렌더링 부작용 피하기” 강의는 무료인가요?

네 — “순수 구성 요소 및 렌더링 부작용 피하기” 전체 내용을 이 웹사이트에서 무료로 읽을 수 있습니다. 인터랙티브하게 실습하려면(내장 코드 에디터와 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. StrictMode의 역할
  2. 순수 구성 요소 및 렌더링 부작용 피하기
  3. Key 및 Ref 모범 사례
  4. 폴더 구조 및 이름 지정 규칙
← React Academy(으)로 돌아가기