[FRONT]
- [FRONT] 프론트엔드 쿠키 이슈 해결하기
- [FRONT] Nuxt Proxy 설정과 활용
- [FRONT] 웹 캐시 전략과 구현
- [FRONT] Next.js와 Nuxt.js 비교 분석
- [FRONT] Monorepo vs Multi-repo vs Monolith 아키텍처
- [FRONT] mitmproxy를 활용한 디버깅
- [FRONT] Storybook 활용 가이드
- [FRONT] Vercel Turbopack 소개
- [FRONT] 캐시와 캐싱 전략
- [FRONT] SWC 컴파일러 이해하기
- [FRONT] 인터섹션 옵저버로 인터섹션 여부 감지하기
- [FRONT] BroadcastChannel 사용해서 같은 도메인 브라우저 간 통신하기
- [FRONT] DOM이벤트 버블링(Bubbling)과 캡처링(Capturing)
- [FRONT] XSS와 CSRF
- [FRONT] 웹 성능 최적화
- [FRONT] 브라우저 렌더링 과정
- [FRONT] 웹 접근성
- [FRONT] URL과 Domain 정확히 이해하자 (url구조)
- [FRONT] HTTP 헤더 이해하기
브라우저 렌더링 과정 완벽 가이드 🎨
1. Critical Rendering Path (중요 렌더링 경로)
렌더링 단계
- DOM 트리 생성 (HTML → DOM)
- CSSOM 트리 생성 (CSS → CSSOM)
- 렌더 트리 생성 (DOM + CSSOM)
- 레이아웃 (요소 위치와 크기 계산)
- 페인트 (화면에 그리기)
1
2
3
4
5
6
7
8
9
10
11
12
13
| <!-- 1. HTML 파싱 -->
<div class="container">
<p>안녕하세요!</p>
</div>
<!-- 2. CSS 파싱 -->
<style>
.container {
width: 100px;
height: 100px;
background: red;
}
</style>
|
2. Reflow(리플로우)와 Repaint(리페인트)
Reflow가 발생하는 경우
- 요소의 크기나 위치가 변경될 때
- 윈도우 리사이징
- 폰트 변경
- 내용 변경
1
2
3
4
5
6
7
8
9
| // 나쁜 예시 (❌) - 여러번의 리플로우 발생
const box = document.getElementById("box");
box.style.width = "100px"; // 리플로우 발생
box.style.height = "200px"; // 리플로우 발생
box.style.margin = "10px"; // 리플로우 발생
// 좋은 예시 (✅) - 한 번의 리플로우
const box = document.getElementById("box");
box.classList.add("box-style"); // 한 번에 스타일 적용
|
Repaint가 발생하는 경우
- 배경색 변경
- 텍스트 색상 변경
- 그림자 등 시각적 요소 변경
1
2
3
| // Repaint만 발생 (위치나 크기 변경 없음)
element.style.backgroundColor = "red";
element.style.color = "blue";
|
3. 성능 최적화 방법
1) 리플로우 최소화
1
2
3
4
5
6
7
8
| // 1. CSS 클래스 활용
// 나쁜 예시 (❌)
element.style.width = "100px";
element.style.height = "100px";
element.style.backgroundColor = "red";
// 좋은 예시 (✅)
element.classList.add("box-styles");
|
2) 애니메이션 최적화
1
2
3
4
5
6
7
8
9
10
11
| /* 나쁜 예시 (❌) - left 변경은 리플로우 발생 */
.box {
left: 0;
transition: left 0.3s;
}
/* 좋은 예시 (✅) - transform은 리플로우 없음 */
.box {
transform: translateX(0);
transition: transform 0.3s;
}
|
3) 프래그먼트 활용
1
2
3
4
5
6
7
| // 여러 요소 추가 시 프래그먼트 사용
const fragment = document.createDocumentFragment();
for (let i = 0; i < 10; i++) {
const el = document.createElement("div");
fragment.appendChild(el);
}
document.body.appendChild(fragment); // 한 번에 DOM 업데이트
|
4. 실제 최적화 예시
1) 스크롤 이벤트 최적화
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
| // 스크롤 성능 최적화
class 스크롤최적화 {
constructor() {
this.ticking = false;
window.addEventListener("scroll", () => this.onScroll());
}
onScroll() {
if (!this.ticking) {
requestAnimationFrame(() => {
this.업데이트();
this.ticking = false;
});
this.ticking = true;
}
}
업데이트() {
// 실제 업데이트 로직
}
}
|
2) 리스트 렌더링 최적화
1
2
3
4
5
6
7
8
9
10
11
12
13
14
| class 리스트최적화 {
렌더링(items) {
const fragment = document.createDocumentFragment();
// 오프스크린에서 요소 생성
items.forEach((item) => {
const el = this.요소생성(item);
fragment.appendChild(el);
});
// 한 번에 DOM 업데이트
this.컨테이너.appendChild(fragment);
}
}
|
5. 성능 체크 포인트 ✅
-
레이아웃 스래싱 방지
- 한 번에 스타일 변경하기
- CSS 클래스 활용하기
- position: absolute/fixed 활용
-
애니메이션 최적화
- transform/opacity 사용
- will-change 속성 활용
- requestAnimationFrame 사용
-
DOM 조작 최적화
- 프래그먼트 사용
- 오프스크린 렌더링
- 불필요한 DOM 접근 줄이기
-
CSS 최적화
- 복잡한 선택자 피하기
- 불필요한 규칙 제거
- CSS 상속 활용
이러한 최적화 기법들을 적용하면 더 부드럽고 빠른 웹 페이지를 만들 수 있습니다! 😊