# [[리페인트(Repaint)]]

## 📌 Brief Summary
리페인트(Repaint)는 웹 페이지 요소의 레이아웃(크기나 위치)에는 영향을 주지 않지만 색상, 배경, 윤곽선, 가시성 등 시각적인 스타일(Skin)이 변경될 때 발생하는 렌더링 과정을 의미한다 [1, 2]. 요소의 시각적 변경이 일어날 때 브라우저는 DOM 트리 내 다른 노드들의 가시성까지 검증해야 하므로 상당한 성능 비용을 유발한다 [2]. 특히 CSS 애니메이션 실행 시 과도한 리페인트가 반복되면 프론트엔드 환경에서 렌더링 성능 저하를 일으키고 스크립트 실행을 느리게 할 수 있어 적절한 최적화가 필수적이다 [1, 3].

## 📖 Core Content
- **리페인트의 발생 원인:** 리페인트는 요소의 형태나 레이아웃을 직접적으로 건드리지 않고, `color`, `background-color`, `outline`, `visibility`와 같이 시각적 속성만 변경할 때 발생한다 [1, 2]. 
- **렌더링 비용과 성능 병목:** 최신 브라우저는 페이지 전체가 아닌 변경된 특정 영역만 리페인트하도록 최적화되어 동작하지만, 애니메이션 되는 영역이 크거나 여러 요소가 동시에 변경되면 여전히 높은 렌더링 비용이 발생한다 [4, 5]. 이로 인해 렌더링 과정(Paint cycle)이 반복적으로 발생하면 성능 병목 현상이 생길 수 있다 [1].
- **리페인트 최적화 및 유지보수 관리 기법:** 
  - CSS 애니메이션을 구현할 때는 가급적 리플로우나 리페인트를 유발하는 속성 대신, `transform`, `opacity`, `filter`와 같이 리페인트를 트리거하지 않는 속성을 사용하여 애니메이션을 작성해야 한다 [4, 6].
  - 애니메이션 대상 요소에 `position: fixed` 또는 `absolute`를 적용하면, 해당 요소가 다른 요소의 레이아웃에 영향을 주지 않아 무거운 리플로우(Reflow) 대신 리페인트만 발생하도록 제한할 수 있어 상대적으로 렌더링 비용을 크게 낮출 수 있다 [7, 8].
  - DOM 조작을 최소화하고, `documentFragment` 등을 활용하여 여러 번의 DOM 변경 사항을 묶어서(Batch) 한 번에 처리하는 것이 리페인트 횟수를 줄이는 데 유리하다 [9, 10].
  - 자바스크립트로 애니메이션을 다룰 경우 `requestAnimationFrame`을 사용하여 브라우저의 리페인트 주기와 동기화해야 한다 [11].
  - 자주 변경될 것으로 예상되는 요소에는 `will-change` 속성을 부여하여 브라우저가 미리 최적화 힌트를 얻고 렌더링을 준비할 수 있도록 돕는 것이 좋다 [11, 12].

## 🔗 Knowledge Connections
- **Related Topics:** [[리플로우(Reflow)]], [[CSS 성능 최적화(CSS Performance Optimization)]], CSS 애니메이션(CSS Animations)
- **Projects/Contexts:** 대규모 프론트엔드 성능 최적화 파이프라인(Rendering Pipeline Optimization), 실무 CSS 관리 및 아키텍처
- **Contradictions/Notes:** 소스 상에서 상충되는 주장은 발견되지 않는다. 다만 리페인트는 전체 레이아웃을 다시 계산하는 작업인 리플로우(Reflow)에 비해서는 상대적으로 적은 비용이 소모된다는 특징이 있다 [8]. 그럼에도 불구하고 불필요한 시각적 속성 변경 애니메이션이 많을 경우 결국 심각한 성능 저하의 원인이 되므로 두 과정 모두 최소화하는 방향으로 설계해야 한다 [1, 13].

---
*Last updated: 2026-04-26*