0Pricing
Frontend Academy · 강의

useState 훅: 상태와 다시 렌더링

useState를 호출해 컴포넌트에 로컬 상태를 추가하고, setter 함수로 상태를 업데이트하며, React가 언제 왜 다시 렌더링하는지 이해합니다.

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

상태란 무엇입니까?

상태는 시간이 지나면서 변하고, 변할 때 사용자 인터페이스를 업데이트해야 하는 데이터입니다. 일반 변수와 달리 상태가 바뀌면 React가 새 값으로 컴포넌트를 다시 렌더링합니다.

useState 구문

useState(initialValue)는 튜플을 반환합니다. 튜플에는 현재 값과 설정 함수가 들어 있습니다. 즉시 구조 분해하십시오.

import { useState } from 'react';

function Counter() {
  const [count, setCount] = useState(0); // initial value: 0

  return (
    <div>
      <p>Count: {count}</p>
      <button onClick={() => setCount(count + 1)}>+</button>
      <button onClick={() => setCount(count - 1)}>-</button>
    </div>
  );
}

TypeScript: useState 타입 지정

TypeScript는 초기값에서 타입을 추론합니다. 초기값이 모호한 경우(null이나 빈 배열 등)에는 명시적인 타입 매개변수를 추가하십시오.

const [count, setCount] = useState(0);           // inferred: number
const [name, setName]  = useState('');            // inferred: string
const [user, setUser]  = useState<User | null>(null); // explicit
const [items, setItems] = useState<string[]>([]); // explicit

상태 변경에 따른 재렌더링

설정 함수를 호출하면 재렌더링이 예약됩니다. React는 새 상태 값으로 컴포넌트 함수를 다시 호출합니다. 반환된 JSX가 가상 DOM에서 이전 렌더링 결과를 대체합니다.

상태 업데이트는 비동기적으로 처리됩니다

상태 업데이트는 즉시 적용되지 않고 일괄 처리되어 다음 렌더링 전에 적용됩니다. 같은 이벤트 처리기에서 업데이트된 상태를 읽지 마십시오. 새 값은 다음 렌더링 전까지 사용할 수 없습니다.

const [count, setCount] = useState(0);

function handleClick() {
  setCount(count + 1);
  console.log(count); // still 0 — update hasn't applied yet
}

함수형 업데이트

새 상태가 이전 상태에 따라 결정될 때는 설정 함수의 함수형 형식을 사용하십시오. 이렇게 하면 오래된 클로저로 인한 오류를 피할 수 있습니다.

// Risky (stale closure in async callbacks):
setCount(count + 1);

// Safe (functional update):
setCount(prev => prev + 1);

// Important for buttons that fire rapidly:
function increment() {
  setCount(c => c + 1); // always uses the latest value
}

객체를 사용한 상태

상태가 객체라면 항상 새 객체를 만드십시오. 기존 객체를 변경하지 마십시오. React는 참조로 비교하므로 객체를 직접 변경해도 재렌더링이 발생하지 않습니다.

const [user, setUser] = useState({ name: 'Alice', age: 30 });

// WRONG: mutates state — React won't re-render
user.age = 31;
setUser(user); // same reference!

// CORRECT: new object
setUser({ ...user, age: 31 });

여러 상태 변수

서로 독립적인 상태 변수에는 useState를 여러 번 호출하십시오. 값이 함께 변경되지 않는다면 하나의 큰 상태 객체를 사용하는 것보다 코드가 더 깔끔합니다.

const [name, setName]   = useState('');
const [email, setEmail] = useState('');
const [error, setError] = useState<string | null>(null);
const [loading, setLoading] = useState(false);

지연 초기화

초기 상태를 계산하는 데 많은 비용이 든다면 useState에 함수를 전달하십시오. 이 함수는 모든 재렌더링이 아니라 첫 번째 렌더링에서만 실행됩니다.

// Runs getInitialState() on every render (bad if expensive):
const [state, setState] = useState(getInitialState());

// Lazy init: only runs once:
const [state, setState] = useState(() => getInitialState());

상태를 사용하지 않아야 할 때

모든 변수에 상태가 필요한 것은 아닙니다. 파생 값(total = items.reduce(…))은 상태에 저장하지 말고 렌더링 중에 계산해야 합니다. 속성에서 파생한 상태는 대개 과도한 설계의 신호입니다.

상태 끌어올리기

두 형제 컴포넌트가 상태를 공유해야 한다면 상태를 공통 조상으로 끌어올리고 속성으로 전달하십시오. 이는 컨텍스트나 저장소를 사용하기 전에 적용하는 기본적인 React 상태 관리 패턴입니다.

빠른 확인

setCount(count + 1) 대신 함수형 형식인 setCount(prev => prev + 1)을 사용해야 하는 이유는 무엇입니까?

복습: useState

useState는 [value, setter]를 반환합니다. 초기값이 타입을 설정하며, 필요하면 명시적인 제네릭을 사용합니다. 설정 함수는 재렌더링을 발생시킵니다. 새 상태가 이전 상태에 의존하면 함수형 업데이트를 사용합니다. 객체는 항상 전개하여 새 객체를 만들고 절대 직접 변경하지 않습니다. 비용이 큰 계산에는 지연 초기화를 사용합니다. 형제 컴포넌트가 상태를 공유해야 하면 상태를 공통 조상으로 끌어올립니다.

자주 묻는 질문

“useState 훅: 상태와 다시 렌더링” 강의는 무료인가요?

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

“useState 훅: 상태와 다시 렌더링”에서 뭘 배우나요?

useState를 호출해 컴포넌트에 로컬 상태를 추가하고, setter 함수로 상태를 업데이트하며, React가 언제 왜 다시 렌더링하는지 이해합니다. 브라우저에서 직접 실행하는 실습 코드로 Frontend Academy을(를) 배우며, 24/7 AI 튜터가 강의를 진행하면서 질문에 답변해줍니다.

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

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

“useState 훅: 상태와 다시 렌더링” 강의는 얼마나 걸리나요?

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

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

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

이 강의의 모든 강의

  1. JSX: 문법과 트랜스파일링
  2. 함수형 컴포넌트와 Props
  3. useState 훅: 상태와 다시 렌더링
  4. 목록, 키, 조건부 렌더링
← Frontend Academy(으)로 돌아가기