정보기술 ·
가비지 컬렉션 이론, 문서 편집기 최적화에 활용...참조 카운팅으로 성능 개선
개발자 패트릭 듀브로이가 증분 파싱 최적화 문제 해결 과정 공개
[한국정보기술신문] 과거 자바 가상머신의 가비지 컬렉션 연구 경험이 실제 소프트웨어 개발 현장에서 어떻게 활용될 수 있는지 보여주는 사례가 공개됐다. 개발자 패트릭 듀브로이는 지난 14일 자신의 블로그를 통해 2004년 발표된 가비지 컬렉션 논문의 핵심 아이디어를 텍스트 편집기 최적화에 적용한 경험을 소개했다.
듀브로이는 과거 J9 자바 가상머신의 가비지 컬렉션 개발에 수년간 참여한 경력을 보유하고 있으며, 이후 상위 레벨 개발로 전환한 뒤에도 가비지 컬렉션에 대한 깊이 있는 지식이 지속적으로 유용하게 활용되고 있다고 밝혔다.
증분 파싱 활용한 양방향 문서 편집기 개발
듀브로이가 참여하고 있는 팀은 Ohm 파서를 사용해 텍스트 문서를 파싱하고 이를 ProseMirror 리치 텍스트 편집기로 렌더링하는 프로젝트를 진행 중이다. 이 프로젝트의 목표는 ProseMirror에서의 변경사항이 텍스트 버전으로 전파되고, 그 반대도 가능한 양방향 업데이트 시스템을 구축하는 것이다.
Ohm은 증분 파싱을 지원하는데, 이는 텍스트를 파싱한 후 작은 수정이 이뤄지면 이전 결과의 일부를 재사용해 빠르게 재파싱할 수 있는 기능이다. 또한 메모이제이션 방식의 속성을 정의할 수 있어, 편집이 해당 서브트리에 영향을 주지 않은 노드의 속성 값은 재계산할 필요가 없다.
트레이싱 방식의 한계와 문제 인식
듀브로이는 이러한 메커니즘을 활용해 입력에 대한 ProseMirror 문서를 생성하는 pmNodes 속성을 구현했다. 텍스트 문서가 편집될 때 이전 문서와 많은 노드를 공유하는 새로운 트리가 생성되며, 이를 바탕으로 이전 트리를 새 트리로 변환하는 ProseMirror 트랜잭션을 구성하는 것이 목표였다.
이 과정에서 이전 문서에는 있었지만 새 문서에는 없는 노드를 파악하는 것이 중요했다. 그의 첫 구현은 트레이싱 가비지 컬렉션과 동일한 방식이었다. 매 편집 후 전체 문서를 순회하며 모든 노드를 집합에 기록하고, 집합 간의 차이를 통해 사라진 노드를 찾아냈다.
하지만 이 방식은 증분 처리의 목적을 무색하게 만들었다. 긴 문서에서 작은 수정이 이뤄졌을 때도 문서의 모든 노드를 방문해야 했기 때문이다.
참조 카운팅으로 전환, 성능 대폭 향상
이때 듀브로이는 과거 동료들이 2004년 OOPSLA에서 발표한 논문 'A Unified Theory of Garbage Collection'을 떠올렸다. 이 논문은 트레이싱과 참조 카운팅이 서로 쌍대 관계에 있음을 증명했다. 직관적으로 설명하면, 트레이싱은 살아있는 객체에 대해 작동하는 반면 참조 카운팅은 죽은 객체에 대해 작동한다는 것이다.
이것이 바로 그가 필요로 했던 해답이었다. 살아있는 모든 객체를 방문하는 대신 죽은 객체만 방문하고 싶었고, 참조 카운팅이 이를 가능하게 했다. 그는 문서의 모든 노드에 대한 참조 카운트를 유지하는 방식을 추가했다. 새 문서가 생성될 때 이전 루트 노드의 참조 카운트를 감소시키고, 이는 항상 0이 된 후 재귀적으로 자식 노드들의 참조 카운트를 감소시킨다.
이 방식은 정확히 원하던 결과를 제공했다. 문서의 대부분 노드를 방문하지 않고도 재사용되지 않은 모든 노드를 찾아낼 수 있게 된 것이다.
이번 사례는 이론적 연구와 실무 개발 사이의 간극을 좁히는 좋은 예시로 평가받고 있다. 십여 년 전의 학술 논문이 현재의 실제 소프트웨어 개발 문제를 해결하는 데 직접적인 영감을 제공했다는 점에서 기초 연구의 중요성을 다시 한번 확인시켜 주고 있다.
한국정보기술신문 정보기술분과 김지원 기자 news@kitpa.org