Rails World 2024 키노트: Rails 라우터의 역사와 성능 최적화

Aaron Patterson - Rails World 2024 Closing Keynote - YouTube

3줄 요약

  • Aaron Patterson은 Rails 라우터의 부팅 시간 성능을 개선하기 위한 기술적 여정을 공유합니다.
  • 그는 객체 할당을 줄이기 위해 재귀 하향 파서와 최적화된 토크나이저를 사용하는 방법을 상세히 설명합니다.
  • 이러한 노력은 Rails 8의 'Lambo Routes'로 이어져 라우터의 부팅 시간을 약 10% 단축하는 성과를 가져왔습니다.

Shopify의 시니어 스태프 엔지니어인 Aaron Patterson(온라인 활동명 Tender Love)은 Rails World 2024 키노트에서 Ruby on Rails 라우터의 성능 최적화에 대한 심도 깊은 강연을 진행했습니다. 본 강연은 강연자의 유머러스한 개인적 경험과 철저한 기술적 분석을 결합하여, 특히 Rails 애플리케이션의 부팅 시간 동안 발생하는 객체 할당을 줄이는 데 초점을 맞추었습니다. 강연자는 자신의 '실패한' 사업 아이템들(Analog Terminal Bell, Initial V, Comini)을 재치 있게 소개하며, 자신이 기업가보다는 엔지니어로서 강점을 가지고 있음을 역설하고, 이러한 엔지니어링 역량이 Rails 커뮤니티에 어떻게 기여할 수 있는지를 보여주었습니다.

강연은 Rails의 초기 역사에 대한 흥미로운 탐구로 이어졌습니다. Aaron Patterson은 Rails의 공식 출시일(2005년 12월)과 Wikipedia에 언급된 2004년 7월 사이의 불일치를 파고들며, David DHH의 초기 MySpace 및 LiveJournal 계정(‘Webster132’) 추적을 통해 ‘Webster Web’이라는 Rails의 훨씬 더 초기 버전(2002년)을 발견한 과정을 공개했습니다. ‘Webster Web’은 현재 Rails에는 포함되지 않은 독특한 기능들을 담고 있었습니다. 예를 들어, CSS가 보편화되기 전 테이블 기반 레이아웃을 위한 DSL인 ‘Action Table’, 공백 처리를 위한 ‘Active Spacer’, 그리고 Ruby 코드를 JavaScript로 변환하여 클라이언트에서 실행하는 ‘RJS’ 등이 있었습니다. 이러한 기능들은 당시의 웹 개발 환경을 반영하며, ‘Webster Web’이 매우 빠른 부팅 시간을 가졌음을 강조했습니다.

강연의 핵심은 Rails 라우터의 성능 최적화에 대한 기술적 논의였습니다. 기존 Rails 라우터는 토크나이징을 위해 StringScanner를, 파싱을 위해 RAC(Yet Another Compiler Compiler와 유사한 Ruby용 파서 생성기)를 사용했는데, 이 과정에서 많은 객체 할당이 발생하여 부팅 시간이 지연되는 문제가 있었습니다. 특히 RAC는 C 기반 런타임을 사용하여 Ruby와 C 코드 간의 빈번한 전환 오버헤드를 야기했습니다. Aaron Patterson은 이러한 문제를 해결하기 위한 두 가지 주요 전략을 제시했습니다.

첫째, 파서를 RAC 대신 직접 작성한 ‘재귀 하향 파서(handwritten recursive descent parser)’로 교체하는 것입니다. 이는 Ruby-Ruby 호출만으로 파싱을 수행하게 하여 JIT 컴파일러의 효율성을 극대화하고, 파서의 이해도를 높이며, 토큰 형식에 대한 명시적인 제어를 가능하게 합니다. 이는 Ruby의 새로운 파서인 Prism이 채택한 방식과도 일치합니다.

둘째, 토크나이저를 최적화하는 것입니다. 기존 토크나이저가 배열을 반환하며 불필요한 객체 할당을 유발하는 문제를 해결하기 위해, 심볼(Symbol)을 반환하도록 변경했습니다. 또한, 단일 바이트 매칭에 대한 선형 스캔(linear scan)을 개선하기 위해 바이트 값을 인덱스로 사용하는 룩업 테이블(배열)을 도입하여 더 빠른 토큰 조회를 가능하게 했습니다. 문자열 할당을 피하기 위해 StringScanner의 scan 메서드 대신 skip 메서드를 사용하고, 필요한 경우에만 Value 메서드를 통해 문자열 값을 지연(lazy) 추출하도록 변경하여 객체 할당을 최소화했습니다. 이러한 최적화는 Rails 라우터의 객체 할당을 약 10% 감소시키고 부팅 시간을 단축하는 실질적인 성과를 가져왔습니다.

강연 중에는 슬라이드 제작 과정에서 구문 강조 코드를 삽입하기 위해 Vim-to-RTF 도구와 제로 할당 RTF 파서를 직접 개발한 ‘메타’ 경험을 공유하기도 했습니다. 이는 강연자가 단순히 기술을 설명하는 것을 넘어, 자신의 엔지니어링 원칙을 실제 문제 해결에 적용하는 모습을 보여주며 청중에게 깊은 인상을 남겼습니다. 마지막으로, 개선된 라우터 기능을 Rails 8에서 ‘Lambo Routes’라는 유머러스한 이름으로 발표하며 강연을 마무리했습니다.

Aaron Patterson의 강연은 Ruby on Rails 라우터의 성능을 최적화하기 위한 심도 있는 기술적 통찰력을 제공하는 동시에, 강연자의 재치와 유머로 청중의 몰입을 유도했습니다. 그는 자신의 실패한 사업 경험을 통해 엔지니어링 역량의 가치를 강조하고, Rails의 숨겨진 역사를 탐구하며 기술적 호기심을 자극했습니다. 특히, 객체 할당을 줄이기 위한 재귀 하향 파서와 최적화된 토크나이저 구현에 대한 상세한 설명은 실제 Rails 애플리케이션의 성능 개선에 적용할 수 있는 실용적인 지식을 제공했습니다. 본 강연은 단순히 기술적 해결책을 제시하는 것을 넘어, 문제 해결에 대한 엔지니어의 접근 방식과 커뮤니티 기여의 중요성을 강조하며, Ruby on Rails 개발자들에게 영감과 유익함을 동시에 선사했습니다.