React에서 setState 호출이 항상 비동기적으로 동작한다고 말할 수 있을까요? React 18 이전과 이후의 자동 배치(automatic batching) 동작 차이를 setTimeout이나 Promise 콜백 내부에서의 setState를 예로 들어 설명해주세요.
힌트 · React 18에서 배치가 이벤트 핸들러 밖으로 확장된 점과 그 이전의 동작 차이 관점에서 접근하세요.
모범답안
React에서 setState 호출이 항상 비동기적으로 동작한다고 단정하기는 어렵습니다. React 18 이전에는 이벤트 핸들러 내에서 호출된 setState만 비동기적으로 동작하여 여러 setState 호출을 묶어(batching) 한 번의 리렌더링으로 처리했습니다. 하지만 setTimeout이나 Promise 콜백과 같이 이벤트 핸들러 외부에서 호출된 setState는 각각 별도의 비동기 작업으로 처리되어 여러 번의 리렌더링을 유발했습니다.
React 18부터는 자동 배치(automatic batching)가 도입되어 이벤트 핸들러 외부의 setState 호출도 자동으로 배치됩니다. 즉, setTimeout이나 Promise 콜백 안에서 여러 번의 setState를 호출하더라도 React 18에서는 이를 묶어서 한 번의 리렌더링으로 처리합니다. 이는 성능 향상에 크게 기여합니다.
예를 들어, React 18 이전에는 setTimeout 안에서 setState를 두 번 호출하면 두 번의 리렌더링이 발생했지만, React 18에서는 한 번의 리렌더링만 발생합니다. 이처럼 React 18 이전과 이후의 자동 배치 동작 차이는 setState가 비동기적으로 처리되는 방식과 리렌더링 횟수에 직접적인 영향을 미칩니다.
읽었다면, 이제 직접 답해볼 차례예요
패스잇 앱에서 이 질문에 말로 답하면 AI가 꼬리질문까지 이어가며 1:1 코칭합니다.
함께 보는 React 면접 질문
- React Server Components란 무엇이며, 기존 SSR과의 차이점은?
- React의 Concurrent Mode와 useTransition, useDeferredValue에 대해 설명해주세요.
- React의 useImperativeHandle Hook의 용도와 사용법에 대해 설명해주세요.
- JSX는 결국 React.createElement(또는 jsx 런타임) 호출로 변환됩니다. 이 변환 결과인 element 객체가 어떤 구조를 가지며, 이것이 실제 DOM이 아니라 '설명(description)'에 불과하다는 점이 렌더링 파이프라인에서 어떤 의미를 갖는지 설명해주세요.
- 함수형 컴포넌트는 클로저를 기반으로 동작합니다. 이로 인해 발생하는 'stale closure(오래된 클로저)' 문제가 무엇이며, setInterval이나 이벤트 구독 안에서 state를 참조할 때 왜 의도치 않은 값이 보이는지, 그리고 이를 해결하는 방법을 설명해주세요.
- 단방향 데이터 흐름을 따르는 React에서, 부모-자식 간 상태를 끌어올리는(lifting state up) 패턴이 깊은 컴포넌트 트리에서 'prop drilling' 문제를 일으킵니다. 이 문제를 Context, composition(children 합성), 상태 관리 라이브러리 중 무엇으로 풀지 판단하는 기준을 설명해주세요.