min

react concurrent mode에 대하여... 본문

리엑트/컴퓨터 과학

react concurrent mode에 대하여...

minprogramming 2023. 8. 20. 22:25

<회고록>

오늘은  react concurrent mode 에 대해서 알아볼려고 한다.

 

1.  react concurrent mode의 등장 배경

 :  react concurrent mode는 사실상 리엑트 아니 자바스크립트의 고유적인 성질로 인해서 나오게 되었다. 자바스크립트의 경우에는 싱글 스래드 기반으로 로직이 흘러간다. 이 말은 하나의 작업을 하고 있을 때 다른 작업을 중단 시킨다는 의미이다. 그리고 리엑트 역시 싱글 스래드 기반으로 로직이 흘러간다. 만약 이런 코드가 있다면 어떻게 작동할까?

import { useState } from "react";

const TECOBLE = ["프", "론", "트", "엔", "드", "화", "이", "팅"];

function App() {
  const [input, setInput] = useState("");
  const [array, setArray] = useState([...Array(5000)]);

  const handleChange = (event) => {
    setInput(event.target.value);
    setArray(
      array.map((_, index) => TECOBLE[index % TECOBLE.length] + Math.random())
    );
  };

  return (
    <div>
      <input
        placeholder="아무 값이나 입력해보세요!"
        value={input}
        onChange={handleChange}
      />
      {array.map((item, index) => (
        <div key={index}>{item}</div>
      ))}
    </div>
  );
}

export default App;
  • 인풋의 값을 넣었을 때 상태가 업데이트 된다.
  • 상태가 업데이트 되었기에 리렌더링이 이루어진다.
  • virtual DOM과 기존의 DOM의 차이점이 발생했음으로 차이점을 개선한 DOM을 업데이트한다.
  • 업데이트된 DOM을 페인팅한다.
  • 위 과정에서 인풋의 값이 바뀌어도 해당 로직은 실행시키지 않는다 ( 이유 : 싱글스래드)

따라서 만약 내가 인풋을 굉장히 빠른 속도로 치게 된다면 해당 인풋의 값이 변해도 그 변한 값이 적용이 되지 않는 것을 알 수 있다.

이는 성능적인 측면에서 보았을 때 사용자에게 수정되는 부분들을 즉각적으로 보여줄 수 없기 때문에 안좋은 성능이라고 볼 수 있다.

그래서 이런 점을 해결하기 위해서  react concurrent mode가 나오게 되었다. 

 

2.  react concurrent mode란 무엇일까?

 :  react concurrent mode의 탄생 배경을 보게 된다면 사실상 자바스크립트에서의 싱글 스래드 문제를 해결하기 위해서 나왔다고 봐도 무방하다. 즉 동시성을 확보하기 위해서 나온 기술이  react concurrent mode이다. 즉  react concurrent mode는 동시성을 구현하는 기술이라고 볼 수 있다.

 

3.  react concurrent mode의 동작 원리

 :  react concurrent mode의 동작 원리를 한 문장을 표현하자면 다음과 같다. 특정 state가 변경되었을 때 현 ui를 유지하면서 동시에 변경된 ui를 준비하고 이 준비된 ui의 렌더링 단계가 특정 조건에 부합할 경우 변경된 ui를 랜더링한다

'리엑트 > 컴퓨터 과학' 카테고리의 다른 글

Throttle, Debounce에 대하여...  (0) 2023.08.20
virtual dom에 대하여...  (0) 2023.08.17
전역상태관리에 대하여...  (0) 2023.08.17
상태 관리에 대하여...  (0) 2023.08.14
XSS , CSRF에 대하여 ...  (0) 2023.06.30