브라우저의 렌더링 과정과 React의 최적화 기법
웹 애플리케이션이 사용자에게 화면을 제공하는 과정은 여러 단계로 이루어진다. 특히 브라우저가 HTML, CSS, JavaScript를 처리하여 화면을 그리는 과정은 성능 최적화와 직결되며, React와 같은 라이브러리는 이러한 과정을 최적화하는 다양한 기법을 제공한다.
1. 브라우저의 렌더링 과정
웹페이지를 불러오는 과정에서 브라우저는 다음과 같은 순서로 리소스를 처리한다.
- HTTP(S) 요청 및 리소스 다운로드
사용자가 특정 URL을 입력하면, 브라우저는 해당 서버와 HTTP(S) 프로토콜을 통해 통신하고 필요한 HTML, CSS, JavaScript, 이미지 등의 리소스를 다운로드한다. - HTML 파싱 및 DOM(Document Object Model) 생성
브라우저는 HTML 파일을 분석하여 DOM을 생성한다. DOM은 HTML 문서의 계층 구조를 표현하는 트리 형태의 데이터 구조다. - CSS 파싱 및 CSSOM(CSS Object Model) 생성
CSS 파일을 다운로드한 후, 브라우저는 이를 파싱하여 CSSOM을 만든다. CSSOM은 CSS 스타일 규칙을 트리 구조로 표현한 객체 모델이다. - 렌더링 트리(Render Tree) 생성
브라우저는 DOM과 CSSOM을 결합하여 렌더링 트리(Render Tree) 를 생성한다.
이 과정에서는 화면에 실제로 표시될 요소들만 포함되며, display: none 등의 스타일이 적용된 요소는 제외된다. - 레이아웃(Layout, Reflow) 계산
렌더링 트리를 기반으로 각 요소의 위치와 크기를 결정하는 레이아웃(Layout) 과정이 진행된다.
이 과정에서 브라우저는 화면에 표시될 각 요소의 정확한 위치를 계산한다. - 페인팅(Paint) 및 화면 출력
브라우저는 계산된 레이아웃 정보를 기반으로 각 요소를 픽셀 단위로 변환하는 페인팅(Paint) 과정을 수행한다.
이후 GPU를 이용하여 최종적으로 화면에 합성(Compositing) 한다.
2. JavaScript와 브라우저 렌더링 성능
JavaScript는 실행 과정에서 DOM을 직접 수정할 수 있다. 그러나 DOM을 변경하는 작업은 성능 비용이 크기 때문에 주의가 필요하다.
- DOM 변경 시 리플로우(Reflow) 발생
DOM이 변경되면 브라우저는 다시 레이아웃 계산을 수행해야 한다.
예를 들어, element.style.width = "100px"; 과 같이 요소의 크기를 변경하면 브라우저는 레이아웃(Layout) 과정을 다시 수행해야 한다. - 리페인트(Repaint) 과정
레이아웃이 변경되거나 스타일이 수정되면 브라우저는 화면을 다시 그려야 한다. 이 과정이 리페인트(Repaint) 이다.
리페인트는 레이아웃 변경보다 상대적으로 비용이 적지만, 빈번하게 발생하면 성능 저하를 초래할 수 있다.
3. React의 가상 DOM(Virtual DOM) 최적화
React는 브라우저 렌더링 과정에서 발생하는 불필요한 Reflow 및 Repaint를 최소화하기 위해 **가상 DOM(Virtual DOM)**을 활용한다.
- 가상 DOM의 역할
React는 UI의 상태 변경이 발생하면, 변경된 부분을 직접 DOM에 반영하는 것이 아니라 가상 DOM에서 먼저 변경 사항을 적용한다.
이후 변경된 부분을 비교(diffing)하여 실제 DOM에서 수정이 필요한 부분만 업데이트하는 방식으로 렌더링 성능을 최적화한다. - 불필요한 렌더링 방지 기법
React는 추가적으로 컴포넌트의 불필요한 렌더링을 방지하는 기법을 제공한다.- shouldComponentUpdate (클래스 컴포넌트)
특정 조건이 충족되지 않으면 리렌더링을 방지할 수 있다. - React.memo (함수형 컴포넌트)
props가 변경되지 않으면 리렌더링을 하지 않도록 최적화할 수 있다. - useMemo, useCallback (React Hooks)
값이나 함수를 메모이제이션하여, 불필요한 재계산 및 리렌더링을 방지한다.
- shouldComponentUpdate (클래스 컴포넌트)
4. 성능 최적화를 위한 Best Practices
최적의 성능을 유지하기 위해, 다음과 같은 최적화 방법을 고려해야 한다.
- DOM 조작 최소화
- 가능하면 React의 상태(state) 변경을 활용하여 UI 업데이트를 수행한다.
- 직접적인 DOM 조작(document.querySelector, innerHTML 등)은 지양한다.
- 스타일 변경 최소화
- CSS 클래스를 변경하는 방식으로 스타일을 조정하고, style 속성을 직접 수정하는 것은 피한다.
- 애니메이션을 적용할 때는 transform, opacity 속성을 활용하면 Reflow 없이 Repaint만 발생하므로 성능을 개선할 수 있다.
- 컴포넌트 리렌더링 최적화
- React.memo 및 useMemo, useCallback을 활용하여 불필요한 렌더링을 줄인다.
- key 속성을 적절히 설정하여 리스트 렌더링을 최적화한다.
결론
웹 애플리케이션에서 렌더링 성능 최적화는 사용자 경험을 향상시키는 핵심 요소이다.
브라우저의 렌더링 과정에서 발생하는 Reflow 및 Repaint를 최소화하는 전략이 중요하며, React는 가상 DOM과 최적화 기법을 활용하여 불필요한 DOM 조작을 방지한다.
React를 사용할 때는 최적의 성능을 유지할 수 있도록 컴포넌트 구조를 설계하고, 불필요한 렌더링을 방지하는 기법을 적극적으로 활용해야 한다.
반응형
'Frontend > React' 카테고리의 다른 글
리액트 useEffect 제대로 이해하고 똑똑하게 사용하기 - useEffect의 정의 (1) | 2024.04.03 |
---|---|
리액트 useState 똑똑하게 쓰기 - lazy Initialization (게으른 초기화) (0) | 2024.03.27 |
댓글