걸음마부터 달리기
[24/10/10] 리액트 본문
- 브라우저 렌더링과 Virtual DOM
https://jeong-pro.tistory.com/210
https://velog.io/@bebrain/%EC%9B%B9%ED%8E%98%EC%9D%B4%EC%A7%80-%EB%A1%9C%EB%94%A9-%EA%B3%BC%EC%A0%95
브라우저는 서버의 요청이 오면 HTML을 응답함과 동시에 클라이언트 브라우저의 일이 시작된다.
받은 HTML은 브라우저에서 DOM 구조로 만들기 전에는 단순 텍스트 형식에 그친다.
파싱을 통해 DOM 트리 형태로 만들어야 비로소 브라우저가 이해할 수 있는 구문이 되고, CSS도 마찬가지로 파싱과정을 거쳐 CSSOM이라는 DOM과 비슷한 CSS Object (Tree) Model을 만든다.
이제 이 둘을 합쳐서 전체적인 렌더트리를 만들고 렌더링 해야된다.
이 과정 속에서 왜 React 같은 Front 단 기술들을 써야 하는지 알 수 있다.
(1) 모든 변경사항을 반영하기엔 Cost가 크다.
부분적인 변경사항 하나가 생겼다고 모든 DOM을 처음부터 다시 생성하는건 아니다. 변경사항만 브라우저가 DOM 객체에서 업데이트 시켜주는건 똑같은데 해당변경사항을 DOM의 찾기위한 트리 탐색 과정에서 Cost가 꽤 크다는 것이다.
(2) 결국 렌더링은 해야된다.
(동적으로) 100번의 DOM 수정이 가해졌다고 가정해보자. 이 경우 변경사항을 DOM에 반영하는 것뿐만 아니라 렌더링까지 해야되는데 이때 브라우저 내부적으로 100번의 렌더링을 모두 하진 않겠지만 (Batched) 다수의 렌더링 과정이 필요한건 사실이다. 따라서 React 코드들이 우선적으로 Virtual DOM을 통해 변경사항을 한번에 메모리에 반영을 해주고 실제 렌더링은 한번만 하게되면 렌더링 과정을 최소화 할 수 있다.
- 리액트가 브라우저로 띄워지기 까지의 과정
https://reactjs.winterlood.com/5fe9b24e-69c9-4062-8f6e-68dc35f830f1
- 번들링
브라우저가 JS 엔진을 가지고 있다는것을 잊지말자.
index.html을 서버로부터 클라이언트 브라우저가 받으면
이거처럼 budle.js 의 JS 파일을 가져오게 된다. 여기서 bundle이란 CSS, JS , HTML, 정적 리소스(이미지 등등) 를 하나로 번들링하여 묶어서 클라이언트 브라우저에게 보내게 된다.
이러면 이제부터 위에서 언급했던 브라우저가 해당 JS를 실행하여 DOM 을 정적으로 바꾸던, 바로 실행을 하던 등등의 행위를 거쳐 최종적으로 렌더링하게 된다. 따라서 React의 import 나 export, 파일 url 등등은 모두 이 budle.js에서 번들링되어 넘겨주면 클라이언트쪽이 실행하게 된다.
- state
일반 변수는 바꿨을 경우 자동으로 재랜더링 되지 않는다. 그러면 특정 값에 따라 렌더링을 다르게 해줘야하는 경우에는 state를 써줘야한다.
이는 일종의 변수처럼 사용되지만 값을 변경했을 경우 자동으로 다시 렌더링이 되기 때문에 값에 따라 렌더링을 변화해야한다면 state를 사용해야한다.
- hook
Component는 2가지 방식인 function Component와 Class Component가 있었다. 근데 state 같은 경우만 봐도 Class는 상속받은 React.component의 멤버필드로 정의하면 됐지만 function은 그러하질 못한다. 따라서 Function Component에서도 이러한 State를 쓰거나 / LifeCycle에 따른 여러 메서드를 호출하기 위해서는 Hooks 라는 기능이 필요하다.
LifeCycle에 따라 기존 Class Component에서 수행되었던 LifeCycle methods인 렌더링시(ComponentDidMount) , state 변화로 재렌더링시(componentDidUpdate) , 해당 컴포넌트가 DOM에서 이탈했을시 (componentWillUnmount) 의 메서드들을 Function Component 에서도 Hooks 를 이용하여 구현 가능하다는 것이다.
useEffect(이펙트함수,의존성 배열)
// 의존성 배열이 변화했을때 이펙트 함수가 수행됨.
// 의존성 배열이 없다면 렌더링될때마다(mount, update)
// 빈 의존성 배열이면 mount, unmount에만 수행됨
flex 크기 변화
https://heewon26.tistory.com/275