1. 웹 페이지가 렌더링 되는 과정
1. 네트워크 요청
- 사용자가 https://naver.com과 같은 웹사이트에 접속하면 DNS 조회를 통해 IP 주로를 찾는다.
- IP 주소를 찾은 후, 브라우저는 HTTP(S) 요청을 보내서 HTML, CSS, JavaScript, 이미지 등의 리소스를 가져온다.
2. HTML 파싱 및 DOM 생성
- 브라우저는 HTML 파일을 다운로드하고, 이를 파싱하여 DOM 트리를 생성한다.
- DOM(Document Object Model)은 HTML 태그를 트리 구조로 변환한 것이며, 각 태그는 노드가 된다.
<!DOCTYPE html>
<html>
<head>
<title>Example</title>
</head>
<body>
<h1>Hello, World!</h1>
</body>
</html>
위 HTML이 DOM 트리로 변환되면
Document
├─ <html>
│ ├─ <head>
│ │ ├─ <title>Example</title>
│ ├─ <body>
│ ├─ <h1>Hello, World!</h1>
3. CSS 파싱 및 CSSOM 생성
- 브라우저는 CSS 파일을 파싱하여 CSSOM(CSS Object Model) 트리를 생성한다.
- CSSOM은 각 요소가 어떤 스타일을 가지는지 구조화된 트리이다.
h1 {
color: red;
font-size: 24px;
}
위 CSS가 CSSOM 트리로 변환되면
CSSOM
├─ h1
│ ├─ color: red
│ ├─ font-size: 24px
4. DOM & CSSOM 결합 -> 렌더 트리 생성
- DOM + CSSOM을 결합하여 렌더 트리를 생성한다.
- 렌더 트리는 화면에 표시할 요소들만 포함하며, display: none같은 보이지 않은 요소는 제외된다.
Render Tree
├─ <h1 class="title">안녕하세요!</h1> (color: blue, font-size: 24px)
├─ <section class="content"> (display: flex, padding: 20px)
│ ├─ <p class="description">이것은 예제 문장입니다.</p> (color: gray, font-size: 18px)
│ ├─ <img class="thumbnail"> (width: 100px, height: 100px)
5. 레이아웃 단계
- 브라우저는 렌더 트리를 기반으로 각 요소의 위치와 크기(좌표, 너비, 높이 등)를 계산한다.
- 이 과정은 Flow, Flextbox, Grid 등의 CSS 규칙을 따른다.
6. 페인팅
- 브라우저가 각 요소를 픽셀로 변환하고 화면에 표시하는 과정
- CSS 스타일(색상, 배경, 그림자 등)을 적용하여 최종적인 픽셀을 만든다.
7. 합성
- 브라우저는 화면을 빠르게 갱신하기 위해 페이지를 여러 개의 Layer로 나눈다.
- GPU 가속을 사용하여 효율적으로 화면을 갱신한다.
2. 주요 웹 브러우저의 특징 & 렌더링 엔진
각 브라우저는 자체 렌더링 엔진을 사용하여 HTML, CSS, JavaScript를 해석하고 화면에 표시한다.
브라우저 | 렌더링 엔진 | 특징 |
Chrome | Blink | Chromiun 기반, 빠른 성능, V8 엔진 사용 |
Firefox | Gecko | 강력한 개발자 도구, 오픈소스 |
Safari | WebKit | 애플 생태계 최적화, 빠른 성능 |
Edge | Blink | Chromiun 기반으로 변경됨(2019년 이후) |
Opera | Blink | 가벼운 브라우저, VPN 기능 포함 |
3. 렌더링 엔진의 역사
- Webkit (2001~)
- Apple이 개발한 렌더링 엔진으로, Safari와 초기 Chrome에서 사용
- 2013년 Google이 Webkit을 포크하여 Blink 엔진을 개발
- Blink (2013~)
- Google이 Webkit을 기반으로 개선한 렌더링 엔진
- Chrom, Edge, Opera에서 사용
- 성능 최적화, 빠른 업데이트 주기
- Gecko (1998~)
- Mozilla가 개발한 오픈소스 렌더링 엔진.
- Firefox에서 사용됨.
- 표준을 잘 준수하지만, Chrome보다 속도가 느릴 수 있다.
4. 최적화 기법
- Critical Rendering Path 최적화
- CSSOM과 DOM을 빠르게 생성하기 위해 불필요한 CSS 및 JS 최소화
- CSS & JavaScript 비동기 로딩
- <link rel="stylesheet" async> 또는 defer 속성을 사용하여 렌더링 차단 최소화
- Lazy Loading
- loading="lazy" 속성을 사용하여 필요한 이미지/리소스만 로드
- GPU 가속 사용
- will-change, transform, opacity 속성을 활용하여 애니메이션 성능 향상
- 리플로우(reflow) 최소화
- CSS 변경이 ㅁ낳으면 레이아웃 재계산이 발생 -> 가능하면 클래스를 한 번에 변경
- CDN(Content Delivery Network) 활용
- 전 세계 서버에서 빠르게 리소스를 로드