나는 현재 2025 OSSCA에서 Githru라는, git의 시각적 분석을 위한 VSCode 익스텐션 팀에서 활동하고 있다. 현재 약 한 달 가량의 챌린지 기간은 종료된 상태이고, 이제 본격적으로 기여를 해야 하는 마스터 기간이 시작됐다.
Githru 안에서는 총 3팀으로 나누어 활동을 진행하고 있다. view와 관련된 기능을 맡는 core, d3를 활용한 시각화를 맡는 newviz, mcp 등과 같은 ai를 다루는 vibe로, 나는 core 팀에 속해 특히 performance tuning과 관련된 작업을 하고 있다.
이 글에서 내가 진행한 성능 최적화 과정을 기록해보고자 한다!
D3란?
"Data-Driven-Documents"의 약자로, 동적인 데이터 시각화를 구현하기 위한 자바스크립트 라이브러리이다. 웹 표준(HTML, SVG, CSS)을 사용해 복잡한 시각화를 구현하고, 데이터를 DOM에 바인딩하여 동적인 그래프나 차트를 쉽게 구현할 수 있도록 해준다.
Githru의 한 컴포넌트에서는 이 d3 라이브러리를 사용하여 아래와 같은 기능을 제공한다.
d3.scaleLinear()와 d3.scaleBand()가 이 역할을 수행한다.transition() 함수를 사용해 막대의 높이와 위치가 변할 때 애니메이션 효과를 추가한다.위 함수들은 데이터와 DOM 요소를 연결하여 동적인 시각화를 관리하는 데 사용되는 핵심적인 selection 메서드이다.
[enter()] : 데이터가 추가되어 새로운 시각화 요소를 그려야 할 때
selection.enter().append("rect")와 같이 사용하면, 새로운 데이터 수만큼 <rect> 요소를 생성하여 문서에 추가한다.[update()] : 데이터에도 존재하고 DOM에도 이미 있는 요소를 나타낼 때
[exit()] : DOM에는 존재하지만 더 이상 데이터에 없는 요소를 나타낼 때
selection.exit().remove()와 같이 사용하면, 더 이상 데이터에 없는 막대 요소를 문서에서 삭제할 수 있다.[join()] : 위 세 함수를 하나로 통합한 함수
.join(enter => ..., update => ..., exit => ...) 함수는 내부적으로 enter(), update(), exit()를 모두 처리하며, 개발자가 제공하는 함수에 따라 각 그룹의 요소를 자동으로 생성, 수정, 삭제가 가능하다.