1. Persona의 대규모 루비 애플리케이션 성능 최적화
Persona의 보안 엔지니어 Samuel은 초당 10,000건 이상의 요청을 처리하는 환경에서 발생하는 성능 저하 문제를 공유했습니다. 특히 특정 요청에서 수억 개의 객체가 할당되어 CPU 점유율이 100%에 도달하는 사례를 분석했습니다.
* 할당 최적화(Allocation Optimization): 루비의 세대별 가비지 컬렉터(GC)는 객체가 많을수록 성능이 저하됩니다. Samuel은 ‘Reduce, Reuse, Recycle’의 원칙을 강조하며, 불필요한 할당 자체를 줄이는 것이 가장 효과적임을 설명했습니다.
* 프로파일링 도구: Vernier(샘플링 프로파일러)와 Heap Profiler를 사용하여 메모리 할당의 주범을 찾아냈습니다. 분석 결과, underscore, 정규식 재생성, 환경 변수(ENV) 접근 시 발생하는 반복적인 문자열 할당이 주요 원인이었습니다.
* 해결책: 문자열을 상수로 정의하거나 freeze를 사용하고, 환경 변수 접근 시 동결된 문자열을 반환하는 Arctic 젬을 개발하여 성능을 개선했습니다.
2. Nil 객체와 자가 치유 시스템 (Breaking Nil)
Enrique Mogan은 루비 개발자들의 영원한 숙제인 Nil 처리 전략을 발표했습니다.
* Nil의 위험성: Rails의 find_by(nil)이 첫 번째 레코드를 반환하는 등의 예기치 못한 동작을 예로 들며, Nil로 인한 버그의 심각성을 경고했습니다.
* 실험적 접근: NilClass를 몽키 패치하여 메서드 호출 실패 시 상세한 스택 트레이스와 인자를 기록하는 기능을 구현했습니다. 더 나아가, 호출된 메서드를 동적으로 정의하여 예외를 방지하는 Walberneil 젬을 소개했습니다.
* AI의 활용: 2026년 현재는 Claude와 같은 AI 모델을 활용해 코드 작성 단계에서 fetch나 dig를 제안받아 Nil 관련 버그를 사전에 차단하는 것이 가장 권장되는 방식임을 강조했습니다.
3. Ruby 4.0의 혁신: ZJIT, Ruby Box, Ractor
행사의 후반부에는 30주년을 맞이한 Ruby 4.0의 주요 기능이 소개되었습니다. * ZJIT 컴파일러: Rust로 작성된 새로운 컴파일러로, SSA(Static Single Assignment)를 사용하여 공격적인 최적화를 수행합니다. 현재는 실험 단계이며 YJIT보다 느릴 수 있지만, 향후 루비 성능의 핵심이 될 전망입니다. * Ruby Box: 단일 프로세스 내에서 네임스페이스를 격리하는 기능입니다. 이를 통해 동일한 젬의 서로 다른 버전을 동시에 로드하거나, 멀티테넌트 환경에서 안전한 코드 실행이 가능해집니다. * Ractor의 발전: 진정한 병렬 처리를 지원하는 Ractor는 포트 기반 통신 API를 강화하여 CPU 집약적인 작업에서 최대 4배의 성능 향상을 보여주었습니다.
4. Rails 폼 빌더 및 태그 헬퍼 커스텀
Todd Kummer는 Rails의 폼 생성 메커니즘을 심층 분석했습니다.
* 구조적 이해: Form Builder가 글로벌 Form Helper를 호출하고, 최종적으로 Tag Helper가 HTML을 렌더링하는 흐름을 설명했습니다.
* 커스터마이징 전략: 특정 라이브러리(예: Stimulus 기반 데이트 피커)를 통합할 때, 애플리케이션 헬퍼를 사용하거나 커스텀 폼 빌더를 정의하여 코드의 일관성을 유지하는 방법을 제시했습니다.