Sorbet을 위한 RBS 인라인 주석 지원

Inline RBS comments support for Sorbet | Rails at Scale

3줄 요약

  • Shopify는 Sorbet의 장황한 문법 문제를 해결하고자 RBS 인라인 주석 지원을 도입했습니다.
  • 새로운 `#:` 기반 문법은 코드 가독성을 높이고 개발 경험을 개선하며, Sorbet의 강력한 타입 검사 기능은 그대로 유지됩니다.
  • 메서드 시그니처, 속성, 변수 타입 정의 및 타입 캐스팅/어설션을 인라인 주석으로 간결하게 표현할 수 있습니다.

Shopify에서 Sorbet은 코드의 가독성, 이해 및 유지보수성을 크게 향상시키는 핵심 도구입니다. Sorbet은 Ruby 코드에 점진적으로 정적 타입 애너테이션을 추가하여 코드 안정성을 높이고 오류를 조기에 발견하는 데 기여합니다. 하지만 때로는 Sorbet의 DSL 기반 문법이 장황하게 느껴져 코드 복잡성을 증가시키기도 합니다. 이 글은 Shopify가 Sorbet에 RBS(Ruby Signature) 인라인 주석 지원을 추가하여 개발자들이 보다 간결하고 읽기 쉬운 문법으로 타입 정보를 표현할 수 있게 된 과정을 설명합니다. 이는 Sorbet의 강력한 타입 안정성과 검사 속도를 유지하면서도 개발자 경험을 개선하는 중요한 발전입니다.

Shopify는 대규모 코드베이스(약 75,000개 파일, 150만 개 메서드)에 Sorbet을 광범위하게 적용하여 99%의 파일과 71%의 메서드에 타입 시그니처를 적용했습니다. 이는 프로덕션 오류 감소에 크게 기여했습니다. 개발자 경험 팀은 Ruby LSP, Tapioca, Spoom과 같은 도구를 개발하며 Ruby 개발 환경 개선에 힘쓰고 있습니다. 개발자 설문 결과, 80%가 타입 코드 확대를 원하고 71%가 다른 코드베이스에 Sorbet 적용을 지지하는 반면, 75%는 더 사용자 친화적인 문법을 희망했습니다. 기존 Sorbet 문법은 sig {}, T.let 등을 사용하며 Ruby DSL의 제약으로 인해 복잡해질 수 있습니다. 또한 sorbet-runtime 의존성은 런타임 오버헤드를 발생시켜 프로덕션에서는 타입 검사를 비활성화하기도 합니다. 이러한 배경에서 Ruby 3.0에 도입된 RBS가 주목받았습니다. RBS는 .rbs 파일에 타입 정의를 분리하여 보다 간결한 문법을 제공하지만, 코드와 타입 정의 파일이 분리되어 관리 부담이 있고 로컬 변수 타입 지원이 부족했습니다. Shopify는 Sorbet과 RBS의 강점을 결합하기 위해 RBS 인라인 주석 방식을 고안했습니다. 이는 코드 내에 #: 또는 #| 주석 형태로 RBS 문법을 사용하여 타입 정보를 직접 기술하는 방식입니다. 예를 들어, 메서드 시그니처는 #: 다음에 RBS 문법으로, 변수나 속성은 해당 라인 끝에 #:로 타입을 명시합니다. 구현은 Sorbet의 타입 검사 파이프라인에 새로운 단계를 추가하는 방식으로 이루어졌습니다. 파서(parser)와 비문법적 요소 제거기(desugarer) 사이에 RBS 파싱 및 재작성 단계를 삽입하여, RBS 주석을 Sorbet 내부의 sigT.let과 동등한 AST 노드로 변환합니다. 이를 통해 나머지 파이프라인은 수정 없이 작동합니다. 현재 지원되는 RBS 주석 기능에는 인스턴스/싱글톤 메서드 시그니처, 속성 타입, 로컬/글로벌/인스턴스/클래스 변수 및 상수 타입 정의, 그리고 T.cast, T.must에 해당하는 타입 캐스팅/어설션(#: as, #: as !nil)이 포함됩니다. 이 기능은 현재 실험 단계이며 --enable-experimental-rbs-signatures, --enable-experimental-rbs-assertions 옵션으로 활성화할 수 있습니다. 기존 Sorbet 문법에서 RBS 주석으로의 마이그레이션을 돕기 위해 Spoom 도구에 자동 번역 기능(spoom srb sigs translate, spoom srb assertions translate)이 추가되었습니다. Sorbet은 두 문법을 모두 지원하므로 점진적인 전환이 가능합니다.

결론적으로, Sorbet에 RBS 인라인 주석 지원을 추가한 것은 Ruby 개발자 경험을 크게 개선하는 중요한 진전입니다. 이 새로운 문법은 Sorbet의 강력한 정적 분석 기능을 그대로 활용하면서도 코드의 가독성과 간결성을 높여 유지보수성을 향상시킵니다. 개발자 피드백을 반영하여 문법적 장벽을 낮춘 이번 작업은 Shopify 규모의 대규모 코드베이스에서 타입 시스템을 더욱 효과적으로 활용할 수 있는 기반을 마련했습니다. 이 기능은 점진적으로 개선될 것이며, 개발자들은 Spoom과 같은 도구를 활용하여 기존 코드를 새로운 문법으로 쉽게 마이그레이션할 수 있습니다. 앞으로도 Ruby 생태계의 발전에 기여하기 위한 Shopify의 노력은 계속될 것입니다.