코드 한 줄이 부르는 대참사: 리플로우(Reflow)와 리페인트(Repaint) 완벽 가이드
웹 사이트를 만들다 보면 기능은 완벽한데 왠지 모르게 화면이 버벅거리거나, 스크롤이 매끄럽지 않은 경험을 해보셨을 겁니다. 10년 차 개발자로서 신입 사원들의 코드를 리뷰할 때 가장 먼저 확인하는 것 중 하나가 바로 "브라우저를 얼마나 괴롭히고 있는가"입니다. 단순히 document.getElementById 로 스타일을 바꾸는 행위가 브라우저 내부에서는 얼마나 거대한 연산 과정을 유도하는지, 그리고 이를 어떻게 스마트하게 피할 수 있는지 실무적인 관점에서 상세히 풀어보겠습니다. 브라우저가 화면을 다시 그리는 두 가지 방식 우리가 자바스크립트로 DOM을 조작하면 브라우저는 바뀐 내용을 반영하기 위해 다시 계산을 시작합니다. 이때 발생하는 현상이 바로 **리플로우(Reflow)**와 **리페인트(Repaint)**입니다. 이 둘의 차이를 명확히 아는 것이 최적화의 시작입니다. 1. 리플로우(Reflow): 레이아웃의 재구성 리플로우는 문서 내 요소들의 위치와 크기를 다시 계산하는 과정입니다. 가장 비용이 많이 드는 작업이죠. 예를 들어, 어떤 요소의 width 가 바뀌면 그 옆에 있던 요소, 그 아래에 있던 요소들의 위치까지 연쇄적으로 영향을 받습니다. 마치 도미노처럼 페이지 전체의 레이아웃을 다시 짜야 하는 상황이 벌어지는 것입니다. 2. 리페인트(Repaint): 색칠 공부의 재시작 리플로우가 끝난 뒤, 혹은 레이아웃(위치/크기)은 변하지 않고 시각적 요소(배경색, 글자색 등)만 바뀌었을 때 발생합니다. 리플로우보다는 가볍지만, 여전히 브라우저의 자원을 소모하는 작업임에는 틀림없습니다. 실무에서 무심코 저지르는 성능 저하 사례 "그냥 스타일 하나 바꿨을 뿐인데 왜 느려지죠?"라고 묻는 분들을 위해, 실제 프로젝트에서 서비스 장애에 가까운 성능 저하를 일으켰던 사례를 소개합니다. 루프 안에서의 스타일 수정 (강제 동기 레이아웃) 가장 흔한 실수입니다. 수백 개의 리스트 아이템의 너비를 자바스크립트 반복문 안에서 하나씩 변경...