Chapter 2. Adding Interactivity
#5 여러 state 업데이트를 큐에 담기
학습 목차
1. state 업데이트 일괄처리
2. 다음 렌더링 전에 동일한 state 변수를 여러 번 업데이트하기
1. state 업데이트 일괄처리
import { useState } from 'react';
export default function Counter() {
const [number, setNumber] = useState(0);
return (
<>
<h1>{number}</h1>
<button onClick={() => {
setNumber(number + 1);
setNumber(number + 1);
setNumber(number + 1);
}}>+3</button>
</>
)
}
- 각 렌더링의 state 값은 고정되어 있으므로, 첫번째 렌더링의 이벤트 핸들러의
number
값은 setNumber(1)
을 몇 번 호출하든 항상 0
이다.
- 여기에는 논의 되어야 할 또 다른 요인이 있습니다.
- React는 state 업데이트를 하기 전에 이벤트 핸들러의 모든 코드가 실행될 때까지 기다린다.
이 때문에 리렌더링은 모든 setNumber()
호출이 완료된 이후에만 일어난다.
- 이는 음식점에서 주문을 받는 웨이터를 생각해 볼 수 있다.
- 웨이터는 첫번째 요리를 말하자마자 주방으로 달려가지 않는다.
- 대신 주문이 끝날 때까지 기다렸다가 주문을 변경하고, 심지어 테이블에 있는 다른 사람의 주문도 받는다.

Illustrated by Rachel Lee Nabors
- 이렇게 하면 너무 많은 리렌더링을 촉발하지 않고도 여러 컴포넌트에서 나온 다수의 state 변수를 업데이트할 수 있다.
하지만 이는 이벤트 핸들러와 그 안에 있는 코드가 완료될 때까지 UI가 업데이트되지 않는다는 의미이기도 한다.
- 일괄처리(배칭, batching)라고도 하는 이 동작은 React 앱을 훨씬 빠르게 실행할 수 있게 해준다.
또한 일부 변수만 업데이트된 “반쯤 완성된” 혼란스러운 렌더링을 처리하지 않아도 된다.
- React는 클릭과 같은 여러 의도적인 이벤트에 대해 일괄 처리하지 않으며, 각 클릭은 개별적으로 처리된다.
- React는 일반적으로 안전한 경우에만 일괄 처리를 수행하니 안심하라.
예를 들어, 첫 번째 버튼 클릭으로 양식이 비활성화되면 두 번째 클릭으로 양식이 다시 제출되지 않도록 보장한다.
2. 다음 렌더링 전에 동일한 state 변수를 여러 번 업데이트하기
- 흔한 사례는 아니지만, 다음 렌더링 전에 동일한 state 변수를 여러 번 업데이트 하고 싶다면
setNumber(number + 1)
와 같은 다음 state 값을 전달하는 대신, setNumber(n => n + 1)
와 같이 큐의 이전 state를 기반으로 다음 state를 계산하는 함수를 전달할 수 있다.
- 이는 단순히 state 값을 대체하는 것이 아니라 React에게 “state 값으로 무언가를 하라”고 지시하는 방법이다.
2-1. 업데이트 후 state를 바꾸면 어떻게 될까?
- 이벤트 핸들러가 완료되면 React는 리렌더링을 실행한다.
- 리렌더링하는 동안 React는 큐를 처리합니다.
- 업데이터 함수는 렌더링 중에 실행되므로, 업데이터 함수는 순수해야 하며 결과만 반환해야 한다.
- 업데이터 함수 내부에서 state를 변경하거나 다른 사이드 이팩트를 실행하려고 하지 말자.
- Strict 모드에서 React는 각 업데이터 함수를 두 번 실행(두 번째 결과는 버림)하여 실수를 찾을 수 있도록 도와준다.
2-2. 명명 규칙
- 업데이터 함수 인수의 이름은 해당 state 변수의 첫 글자로 지정하는 것이 일반적이다
setEnabled(e => !e);
setLastName(ln => ln.reverse());
setFriendCount(fc => fc * 2);
좀 더 자세한 코드를 선호하는 경우 setEnabled(enabled => !enabled)
와 같이 전체 state 변수 이름을 반복하거나, setEnabled(prevEnabled => !prevEnabled)
와 같은 접두사(prefix “prev”)를 사용하는 것이 일반적인 규칙입니다.
요약
- state를 설정하더라도 기존 렌더링의 변수는 변경되지 않으며, 대신 새로운 렌더링을 요청한다.
- React는 이벤트 핸들러가 실행을 마친 후 state 업데이트를 처리합니다. 이를 일괄처리(배칭, batching)라고 한다.
- 하나의 이벤트에서 일부 state를 여러 번 업데이트하려면
setNumber(n => n + 1)
업데이터 함수를 사용할 수 있다.
React 공식 문서
https://react.dev/
React 비공식 번역 문서
https://react-ko.dev/
MDN
https://developer.mozilla.org/ko/
Wikipedia
https://ko.wikipedia.org/wiki/