Reactμ flushSync APIλ₯Ό νμνκ³ , λκΈ°μ μ λ°μ΄νΈλ₯Ό κ°μ νλ μ¬μ© μ¬λ‘λ₯Ό μ΄ν΄νλ©°, μ μ¬μ μΈ μ±λ₯ λ¬Έμ λ₯Ό νΌνλ λ°©λ²μ μμ보μΈμ. κ³ κΈ React κ°λ°μμκ² μ ν©ν©λλ€.
React flushSync: μμΈ‘ κ°λ₯ν UIλ₯Ό μν λκΈ° μ λ°μ΄νΈ μ 볡νκΈ°
Reactμ λΉλκΈ°μ νΉμ±μ μΌλ°μ μΌλ‘ μ±λ₯μ μ΄μ μ μ£Όλ©°, μ
λ°μ΄νΈλ₯Ό μΌκ΄ μ²λ¦¬νκ³ λ λλ§μ μ΅μ νν μ μκ² ν΄μ€λλ€. νμ§λ§ UI μ
λ°μ΄νΈκ° λκΈ°μ μΌλ‘ λ°μν΄μΌ νλ μν©λ μμ΅λλ€. λ°λ‘ μ΄λ΄ λ flushSync
κ° μ¬μ©λ©λλ€.
flushSyncλ 무μμΈκ°?
flushSync
λ μ½λ°± λ΄μ μ
λ°μ΄νΈλ₯Ό λκΈ°μ μΌλ‘ κ°μ μ€ννλ React APIμ
λλ€. λ³Έμ§μ μΌλ‘ Reactμκ² "λ€μ μμ
μ μ§ννκΈ° μ μ μ΄ μ
λ°μ΄νΈλ₯Ό μ¦μ μ€νν΄"λΌκ³ λ§νλ κ²κ³Ό κ°μ΅λλ€. μ΄λ Reactμ μΌλ°μ μΈ μ§μ° μ
λ°μ΄νΈ μ λ΅κ³Όλ λ€λ¦
λλ€.
React 곡μ λ¬Έμμμλ flushSync
λ₯Ό λ€μκ³Ό κ°μ΄ μ€λͺ
ν©λλ€:
"flushSync
λ₯Ό μ¬μ©νλ©΄ Reactκ° λ³΄λ₯ μ€μΈ μ
λ°μ΄νΈλ₯Ό κ°μ λ‘ νλ¬μνκ³ DOMμ λκΈ°μ μΌλ‘ μ μ©νλλ‘ ν μ μμ΅λλ€."
κ°λ¨ν λ§ν΄, Reactμκ² λ μ μ ν μμ μ κΈ°λ€λ¦¬μ§ λ§κ³ μ§κΈ λΉμ₯ μ¬μ©μ μΈν°νμ΄μ€μ μ μ©νλ €λ λ³κ²½ μ¬νμ "μλλ¬" μ μ©νλΌκ³ μ§μνλ κ²μ λλ€.
μ flushSyncλ₯Ό μ¬μ©ν΄μΌ ν κΉ? λκΈ° μ λ°μ΄νΈμ νμμ± μ΄ν΄νκΈ°
λΉλκΈ° μ λ°μ΄νΈκ° μΌλ°μ μΌλ‘ μ νΈλμ§λ§, νΉμ μλ리μ€μμλ μ¦κ°μ μΈ UI λ°μμ΄ νμν©λλ€. λͺ κ°μ§ μΌλ°μ μΈ μ¬μ© μ¬λ‘λ λ€μκ³Ό κ°μ΅λλ€:
1. μλνν° λΌμ΄λΈλ¬λ¦¬μμ ν΅ν©
λ§μ μλνν° λΌμ΄λΈλ¬λ¦¬(νΉν DOM μ‘°μμ΄λ μ΄λ²€νΈ μ²λ¦¬λ₯Ό λ€λ£¨λ λΌμ΄λΈλ¬λ¦¬)λ μμ
μ§νμ DOMμ΄ μΌκ΄λ μνμ μμ κ²μΌλ‘ μμν©λλ€. flushSync
λ λΌμ΄λΈλ¬λ¦¬κ° DOMκ³Ό μνΈμμ©νκΈ° μ μ React μ
λ°μ΄νΈκ° μ μ©λλλ‘ λ³΄μ₯νμ¬ μκΈ°μΉ μμ λμμ΄λ μ€λ₯λ₯Ό λ°©μ§ν©λλ€.
μμ: μ°¨νΈ λ λλ§μ μν΄ μ»¨ν
μ΄λμ ν¬κΈ°λ₯Ό κ²°μ νκ³ μ DOMμ μ§μ 쿼리νλ μ°¨νΈ λΌμ΄λΈλ¬λ¦¬λ₯Ό μ¬μ©νλ€κ³ μμν΄ λ³΄μΈμ. λ§μ½ React μ
λ°μ΄νΈκ° μμ§ μ μ©λμ§ μμλ€λ©΄, λΌμ΄λΈλ¬λ¦¬λ μλͺ»λ ν¬κΈ° κ°μ μ»κ² λμ΄ μ°¨νΈκ° κΉ¨μ§ μ μμ΅λλ€. μ
λ°μ΄νΈ λ‘μ§μ flushSync
λ‘ κ°μΈλ©΄ μ°¨νΈ λΌμ΄λΈλ¬λ¦¬κ° μ€νλκΈ° μ μ DOMμ΄ μ΅μ μνλ‘ μ μ§λ©λλ€.
import Chart from 'chart.js/auto';
import { flushSync } from 'react-dom';
function MyChartComponent() {
const chartRef = useRef(null);
const [data, setData] = useState([10, 20, 30]);
useEffect(() => {
if (chartRef.current) {
flushSync(() => {
setData([Math.random() * 40, Math.random() * 40, Math.random() * 40]);
});
// Re-render the chart with the updated data
new Chart(chartRef.current, {
type: 'bar',
data: {
labels: ['Red', 'Blue', 'Yellow'],
datasets: [{
label: 'My First Dataset',
data: data,
backgroundColor: [
'rgba(255, 99, 132, 0.2)',
'rgba(54, 162, 235, 0.2)',
'rgba(255, 206, 86, 0.2)'
],
borderColor: [
'rgba(255, 99, 132, 1)',
'rgba(54, 162, 235, 1)',
'rgba(255, 206, 86, 1)'
],
borderWidth: 1
}]
},
options: {
scales: {
y: {
beginAtZero: true
}
}
}
});
}
}, [data]);
return ;
}
2. μ μ΄ μ»΄ν¬λνΈμ ν¬μ»€μ€ κ΄λ¦¬
μ μ΄ μ»΄ν¬λνΈ(Reactκ° μ
λ ₯ κ°μ κ΄λ¦¬νλ κ²½μ°)λ₯Ό λ€λ£° λ, μ νν ν¬μ»€μ€ λμμ μ μ§νκΈ° μν΄ μνλ₯Ό λκΈ°μ μΌλ‘ μ
λ°μ΄νΈν΄μΌ ν μ μμ΅λλ€. μλ₯Ό λ€μ΄, νΉμ μμ λ¬Έμκ° μ
λ ₯λ ν μλμΌλ‘ λ€μ νλλ‘ ν¬μ»€μ€λ₯Ό μ΄λμν€λ μ¬μ©μ μ μ μ
λ ₯ μ»΄ν¬λνΈλ₯Ό ꡬννλ κ²½μ°, flushSync
λ μν μ
λ°μ΄νΈ(κ·Έλ¦¬κ³ κ·Έμ λ°λ₯Έ ν¬μ»€μ€ λ³κ²½)κ° μ¦μ λ°μνλλ‘ λ³΄μ₯ν μ μμ΅λλ€.
μμ: μ¬λ¬ μ
λ ₯ νλκ° μλ νΌμ μκ°ν΄ 보μΈμ. μ¬μ©μκ° ν νλμ νΉμ μμ λ¬Έμλ₯Ό μ
λ ₯νλ©΄ ν¬μ»€μ€κ° μλμΌλ‘ λ€μ νλλ‘ μ΄λν΄μΌ ν©λλ€. flushSync
κ° μμΌλ©΄ μ½κ°μ μ§μ°μ΄ λ°μνμ¬ μ¬μ©μ κ²½νμ΄ μ νλ μ μμ΅λλ€.
import React, { useState, useRef, useEffect } from 'react';
import { flushSync } from 'react-dom';
function ControlledInput() {
const [value, setValue] = useState('');
const nextInputRef = useRef(null);
const handleChange = (event) => {
const newValue = event.target.value;
flushSync(() => {
setValue(newValue);
});
if (newValue.length === 5 && nextInputRef.current) {
nextInputRef.current.focus();
}
};
return (
);
}
3. μ¬λ¬ μ»΄ν¬λνΈμ κ±ΈμΉ μ λ°μ΄νΈ μ‘°μ
볡μ‘ν μ ν리μΌμ΄μ
μμλ μλ‘μ μνμ μμ‘΄νλ μ»΄ν¬λνΈλ€μ΄ μμ μ μμ΅λλ€. flushSync
λ ν μ»΄ν¬λνΈμ μ
λ°μ΄νΈκ° λ€λ₯Έ μ»΄ν¬λνΈμ μ¦μ λ°μλλλ‘ νμ¬ λΆμΌμΉλ κ²½μ μν(race condition)λ₯Ό λ°©μ§νλ λ° μ¬μ©λ μ μμ΅λλ€.
μμ: μμ μ»΄ν¬λνΈμμ μ
λ ₯λ λ°μ΄ν°μ μμ½μ νμνλ λΆλͺ¨ μ»΄ν¬λνΈκ° μμ΅λλ€. μμ μ»΄ν¬λνΈμμ μν λ³κ²½ ν flushSync
λ₯Ό μ¬μ©νλ©΄ λΆλͺ¨ μ»΄ν¬λνΈκ° μ
λ°μ΄νΈλ μ΄ν©μΌλ‘ μ¦μ λ€μ λ λλ§λλ κ²μ 보μ₯ν©λλ€.
4. λΈλΌμ°μ μ΄λ²€νΈ μ λ°νκ² μ²λ¦¬νκΈ°
λλ‘λ λΈλΌμ°μ μ μ΄λ²€νΈ 루νμ λ§€μ° νΉμ ν λ°©μμΌλ‘ μνΈμμ©ν΄μΌ ν λκ° μμ΅λλ€. flushSync
λ λΈλΌμ°μ μ΄λ²€νΈμ κ΄λ ¨νμ¬ React μ
λ°μ΄νΈκ° μ μ©λλ μμ μ λ μΈλ°νκ² μ μ΄ν μ μκ² ν΄μ€λλ€. μ΄λ μ¬μ©μ μ μ λλκ·Έ μ€ λλ‘ κ΅¬νμ΄λ μ λλ©μ΄μ
κ³Ό κ°μ κ³ κΈ μλ리μ€μμ νΉν μ€μν©λλ€.
μμ: μ¬μ©μ μ μ μ¬λΌμ΄λ μ»΄ν¬λνΈλ₯Ό λ§λ λ€κ³ μμν΄ λ³΄μΈμ. μ¬μ©μκ° νΈλ€μ λλκ·Έν λ μ¬λΌμ΄λμ μμΉλ₯Ό μ¦μ μ
λ°μ΄νΈν΄μΌ ν©λλ€. onMouseMove
μ΄λ²€νΈ νΈλ€λ¬ λ΄μμ flushSync
λ₯Ό μ¬μ©νλ©΄ UI μ
λ°μ΄νΈκ° λ§μ°μ€ μμ§μκ³Ό λκΈ°νλμ΄ λΆλλ½κ³ λ°μμ±μ΄ μ’μ μ¬λΌμ΄λλ₯Ό λ§λ€ μ μμ΅λλ€.
flushSync μ¬μ©λ²: μ€μ© κ°μ΄λ
flushSync
μ¬μ©λ²μ κ°λ¨ν©λλ€. μνλ₯Ό μ
λ°μ΄νΈνλ μ½λλ₯Ό flushSync
ν¨μλ‘ κ°μΈκΈ°λ§ νλ©΄ λ©λλ€:
import { flushSync } from 'react-dom';
function handleClick() {
flushSync(() => {
setState(newValue);
});
}
μ£Όμ μμλ λ€μκ³Ό κ°μ΅λλ€:
- κ°μ Έμ€κΈ°(Import):
react-dom
ν¨ν€μ§μμflushSync
λ₯Ό κ°μ ΈμμΌ ν©λλ€. - μ½λ°±(Callback):
flushSync
λ μ½λ°± ν¨μλ₯Ό μΈμλ‘ λ°μ΅λλ€. μ΄ μ½λ°±μλ λκΈ°μ μΌλ‘ μ€ννλ €λ μν μ λ°μ΄νΈκ° ν¬ν¨λ©λλ€. - μν μ
λ°μ΄νΈ(State Updates): μ½λ°± λ΄λΆμμ
useState
μsetState
ν¨μλ λ€λ₯Έ μν κ΄λ¦¬ λ©μ»€λμ¦(μ: Redux, Zustand)μ μ¬μ©νμ¬ νμν μν μ λ°μ΄νΈλ₯Ό μνν©λλ€.
flushSyncλ₯Ό νΌν΄μΌ ν λ: μ μ¬μ μ±λ₯ λ¬Έμ
flushSync
λ μ μ©ν μ μμ§λ§, μ μ€νκ² μ¬μ©νλ κ²μ΄ μ€μν©λλ€. κ³Όλνκ² μ¬μ©νλ©΄ μ ν리μΌμ΄μ
μ μ±λ₯μ΄ ν¬κ² μ νλ μ μμ΅λλ€.
1. λ©μΈ μ€λ λ μ°¨λ¨
flushSync
λ Reactκ° μ¦μ DOMμ μ
λ°μ΄νΈνλλ‘ κ°μ νλ―λ‘, λ©μΈ μ€λ λλ₯Ό μ°¨λ¨νμ¬ μ ν리μΌμ΄μ
μ λ°μμ±μ λ¨μ΄λ¨λ¦΄ μ μμ΅λλ€. λ¬΄κ±°μ΄ κ³μ°μ΄λ 볡μ‘ν λ λλ§μ΄ ν¬ν¨λ μ
λ°μ΄νΈμλ μ¬μ©νμ§ λ§μΈμ.
2. λΆνμν λκΈ° μ λ°μ΄νΈ
λλΆλΆμ UI μ
λ°μ΄νΈλ λκΈ° μ€νμ΄ νμνμ§ μμ΅λλ€. Reactμ κΈ°λ³Έ λΉλκΈ° λμμ΄ μΌλ°μ μΌλ‘ μΆ©λΆνλ©° μ±λ₯λ λ μ’μ΅λλ€. μ¦κ°μ μΈ μ
λ°μ΄νΈλ₯Ό κ°μ ν΄μΌ ν νΉλ³ν μ΄μ κ° μμ λλ§ flushSync
λ₯Ό μ¬μ©νμΈμ.
3. μ±λ₯ λ³λͺ© νμ
μ±λ₯ λ¬Έμ λ₯Ό κ²ͺκ³ μλ€λ©΄ flushSync
κ° μμΈμΌ μ μμ΅λλ€. μ ν리μΌμ΄μ
μ νλ‘νμΌλ§νμ¬ λκΈ° μ
λ°μ΄νΈκ° λ³λͺ© νμμ μΌμΌν€λ λΆλΆμ μλ³νκ³ , λλ°μ΄μ±μ΄λ μ€λ‘νλ§κ³Ό κ°μ λμμ μΈ μ κ·Ό λ°©μμ κ³ λ €νμΈμ.
flushSyncμ λμ: λ€λ₯Έ μ΅μ νμνκΈ°
flushSync
μ μμ‘΄νκΈ° μ μ, μ±λ₯μ ν¬μνμ§ μκ³ μνλ κ²°κ³Όλ₯Ό μ»μ μ μλ λμμ μΈ μ κ·Ό λ°©μμ νμν΄ λ³΄μΈμ:
1. λλ°μ΄μ±κ³Ό μ€λ‘νλ§
μ΄ κΈ°μ λ€μ ν¨μκ° μ€νλλ λΉλλ₯Ό μ νν©λλ€. λλ°μ΄μ±μ μΌμ κΈ°κ° λμ νλμ΄ μμ λκΉμ§ μ€νμ μ§μ°μν€λ λ°λ©΄, μ€λ‘νλ§μ μ§μ λ μκ° κ°κ²© λ΄μ ν¨μλ₯Ό μ΅λ ν λ²λ§ μ€νν©λλ€. μ΄λ λͺ¨λ μ λ°μ΄νΈκ° μ¦μ UIμ λ°μλ νμκ° μλ μ¬μ©μ μ λ ₯ μλ리μ€μ μ’μ μ νμ λλ€.
2. requestAnimationFrame
requestAnimationFrame
μ λ€μ λΈλΌμ°μ 리νμΈνΈ(repaint) μ§μ μ ν¨μκ° μ€νλλλ‘ μμ½ν©λλ€. μ΄λ λΈλΌμ°μ μ λ λλ§ νμ΄νλΌμΈκ³Ό λκΈ°νλμ΄μΌ νλ μ λλ©μ΄μ
μ΄λ UI μ
λ°μ΄νΈμ μ μ©ν μ μμ΅λλ€. μμ ν λκΈ°μ μ΄μ§λ μμ§λ§, flushSync
μ μ°¨λ¨ νΉμ± μμ΄ λΉλκΈ° μ
λ°μ΄νΈλ³΄λ€ λ λΆλλ¬μ΄ μκ°μ κ²½νμ μ 곡ν©λλ€.
3. μμ‘΄μ± λ°°μ΄μ μ¬μ©ν useEffect
useEffect
ν
μ μμ‘΄μ± λ°°μ΄μ μ μ€νκ² κ³ λ €νμΈμ. μ΄ννΈκ° νμν λλ§ μ€νλλλ‘ λ³΄μ₯ν¨μΌλ‘μ¨ λΆνμν 리λ λλ§μ μ΅μννκ³ μ±λ₯μ ν₯μμν¬ μ μμ΅λλ€. μ΄λ λ§μ κ²½μ°μ flushSync
μ νμμ±μ μ€μΌ μ μμ΅λλ€.
4. μν κ΄λ¦¬ λΌμ΄λΈλ¬λ¦¬
Redux, Zustand, Jotaiμ κ°μ μν κ΄λ¦¬ λΌμ΄λΈλ¬λ¦¬λ μ’
μ’
μ
λ°μ΄νΈλ₯Ό μΌκ΄ μ²λ¦¬νκ±°λ μν λ³κ²½ νμ΄λ°μ μ μ΄νλ λ©μ»€λμ¦μ μ 곡ν©λλ€. μ΄λ¬ν κΈ°λ₯μ νμ©νλ©΄ flushSync
μ νμμ±μ νΌν μ μμ΅λλ€.
μ€μ© μμ : μ€μ μλ리μ€
flushSync
κ° μ€μ μλ리μ€μμ μ΄λ»κ² μ¬μ©λ μ μλμ§ λͺ κ°μ§ λ μμΈν μμ λ₯Ό μ΄ν΄λ³΄κ² μ΅λλ€:
1. μ¬μ©μ μ μ μλ μμ± μ»΄ν¬λνΈ κ΅¬ν
μ¬μ©μ μ μ μλ μμ± μ»΄ν¬λνΈλ₯Ό λ§λ€ λ, μ¬μ©μκ° μ
λ ₯νλ μ¦μ μ μ λͺ©λ‘μ΄ μ
λ°μ΄νΈλλλ‘ ν΄μΌ ν μ μμ΅λλ€. flushSync
λ₯Ό μ¬μ©νμ¬ μ
λ ₯ κ°κ³Ό νμλλ μ μμ λκΈ°νν μ μμ΅λλ€.
2. μ€μκ° νμ νΈμ§κΈ° μ μ
μ€μκ° νμ
νΈμ§κΈ°μμλ ν μ¬μ©μκ° λ³κ²½ν λ΄μ©μ΄ λ€λ₯Έ μ¬μ©μμ μΈν°νμ΄μ€μ μ¦μ λ°μλμ΄μΌ ν©λλ€. flushSync
λ₯Ό μ¬μ©νμ¬ μ¬λ¬ ν΄λΌμ΄μΈνΈ κ°μ μν μ
λ°μ΄νΈλ₯Ό λκΈ°νν μ μμ΅λλ€.
3. μ‘°κ±΄λΆ λ‘μ§μ΄ μλ 볡μ‘ν νΌ κ΅¬μΆ
μ‘°κ±΄λΆ λ‘μ§μ΄ μλ 볡μ‘ν νΌμμλ νΉμ νλμ κ°μμ±μ΄λ λμμ΄ λ€λ₯Έ νλμ κ°μ λ°λΌ λ¬λΌμ§ μ μμ΅λλ€. flushSync
λ₯Ό μ¬μ©νμ¬ μ‘°κ±΄μ΄ μΆ©μ‘±λ λ νΌμ΄ μ¦μ μ
λ°μ΄νΈλλλ‘ ν μ μμ΅λλ€.
flushSync μ¬μ©μ μν λͺ¨λ² μ¬λ‘
flushSync
λ₯Ό ν¨κ³Όμ μ΄κ³ μμ νκ² μ¬μ©νλ €λ©΄ λ€μ λͺ¨λ² μ¬λ‘λ₯Ό λ°λ₯΄μΈμ:
- μκ»΄μ μ¬μ©νκΈ°: μ λ§λ‘ νμν λλ§
flushSync
λ₯Ό μ¬μ©νμΈμ. - μ±λ₯ μΈ‘μ νκΈ°: μ ν리μΌμ΄μ μ νλ‘νμΌλ§νμ¬ μ μ¬μ μΈ μ±λ₯ λ³λͺ© νμμ μλ³νμΈμ.
- λμ κ³ λ €νκΈ°:
flushSync
μ μμ‘΄νκΈ° μ μ λ€λ₯Έ μ΅μ μ νμνμΈμ. - μ¬μ©λ² λ¬ΈμννκΈ°: μ
flushSync
λ₯Ό μ¬μ©νλμ§, κ·Έλ¦¬κ³ κΈ°λλλ μ΄μ μ λͺ ννκ² λ¬ΈμννμΈμ. - μ² μ ν ν
μ€νΈνκΈ°:
flushSync
κ° μκΈ°μΉ μμ λμμ μΌμΌν€μ§ μλμ§ νμΈνκΈ° μν΄ μ ν리μΌμ΄μ μ μ² μ ν ν μ€νΈνμΈμ.
κ²°λ‘ : flushSyncλ‘ λκΈ° μ λ°μ΄νΈ λ§μ€ν°νκΈ°
flushSync
λ Reactμμ λκΈ° μ
λ°μ΄νΈλ₯Ό κ°μ νλ κ°λ ₯ν λꡬμ
λλ€. νμ§λ§ μ±λ₯μ λΆμ μ μΈ μν₯μ λ―ΈμΉ μ μμΌλ―λ‘ μ£Όμν΄μ μ¬μ©ν΄μΌ ν©λλ€. μ¬μ© μ¬λ‘, μ μ¬μ μν λ° λμμ μ΄ν΄ν¨μΌλ‘μ¨ flushSync
λ₯Ό ν¨κ³Όμ μΌλ‘ νμ©νμ¬ λ μμΈ‘ κ°λ₯νκ³ λ°μμ±μ΄ μ’μ μ¬μ©μ μΈν°νμ΄μ€λ₯Ό λ§λ€ μ μμ΅λλ€.
νμ μ±λ₯μ μ°μ μνκ³ λκΈ° μ
λ°μ΄νΈμ μμ‘΄νκΈ° μ μ λμμ μΈ μ κ·Ό λ°©μμ νμνλ κ²μ μμ§ λ§μΈμ. μ΄ κ°μ΄λμ μμ½λ λͺ¨λ² μ¬λ‘λ₯Ό λ°λ₯΄λ©΄ flushSync
λ₯Ό λ§μ€ν°νκ³ κ²¬κ³ νκ³ ν¨μ¨μ μΈ React μ ν리μΌμ΄μ
μ ꡬμΆν μ μμ΅λλ€.