RubyKaigi 2023: DepreWriter를 활용한 Ruby 코드 자동 리팩토링 제안

[JA] On-the-fly Suggestions of Rewriting Method Deprecations / Masato Ohba @ohbarye

작성자
RubyKaigi
발행일
2025년 05월 27일

핵심 요약

  • 1 본 발표는 프로그래밍 언어의 보편적인 문제인 Deprecation 대응의 어려움을 다룹니다.
  • 2 Pharo 언어의 DepreWriter에서 영감을 받아 Ruby 코드를 런타임에 자동으로 변환하거나 패치 파일을 생성하는 DepreWriter Gem을 소개합니다.
  • 3 이를 통해 개발자가 Deprecation 대응에 드는 노력을 줄여 Ruby 생태계의 발전을 가속화하는 방안을 모색합니다.

도입

Deprecation은 프로그래밍 언어 및 라이브러리 기능의 점진적 폐지를 알리는 과정으로, 코드베이스 건전성 유지에 필수적이나 사용자 및 개발자에게는 전환 비용을 발생시킵니다. 본 발표는 이러한 Deprecation 문제에 효과적으로 대응하기 위한 'DepreWriter'의 Ruby 구현을 제안하며, 런타임 코드 변환을 통해 Deprecation 대응의 고통을 경감하고 Ruby 생태계 발전을 지원하고자 합니다.

현재 Ruby 생태계에서는 Deprecation 대응을 위해 문서화, 런타임 경고, 정적/동적 분석 도구가 활용되지만, 수동 작업의 필요성이나 불완전한 자동화라는 한계가 있습니다. 발표자는 Pharo 언어의 ‘DepreWriter’에서 영감을 받아, Ruby에서 런타임에 Deprecated 된 메서드 호출을 감지하고 자동으로 코드를 변환하는 아이디어를 구체화했습니다. Ruby용 DepreWriter는 depri_write 메서드를 통해 대상 메서드와 변환 규칙을 정의하며, Synvert 젬과 Prism 파서를 활용하여 AST(추상 구문 트리) 기반의 코드 변환을 수행합니다. 런타임에 호출 스택을 분석하여 정확한 호출 위치를 특정하고 해당 코드 파일을 읽어 변환을 적용합니다. DepreWriter는 직접 파일 쓰기(rewrite), 패치 파일 생성(diff), 로그 출력(log)의 세 가지 모드를 제공하며, 프로덕션 환경에서의 런타임 코드 직접 변경은 안전하지 않으므로 주로 테스트 및 로컬 환경에서의 활용을 권장합니다. 현재 구현은 기본적인 Deprecation 패턴에 대응하지만, 복잡한 시나리오에는 한계가 있으며, 성능 최적화와 외부 젬 의존성 해소 또한 향후 과제로 제시되었습니다.

결론

DepreWriter는 Ruby 개발자들이 Deprecation 대응에 드는 노력을 획기적으로 줄여줄 잠재력을 가집니다. 동적 타입 언어에서 정적 분석의 한계를 런타임 분석으로 극복하려는 시도는 의미 있습니다. 비록 해결할 과제가 많지만, 이러한 자동화된 메커니즘이 Ruby 언어 자체나 주요 라이브러리에 내장된다면, 개발자들은 고통 없이 최신 기능을 도입하고 Ruby의 발전 속도를 가속화하는 데 크게 기여할 것입니다. 본 발표는 Deprecation 문제에 대한 새로운 시각을 제시하며, Ruby 커뮤니티 내에서의 지속적인 논의와 협력을 촉구합니다.

댓글 0

댓글 작성

0/1000
정중하고 건설적인 댓글을 작성해 주세요.

아직 댓글이 없습니다

첫 번째 댓글을 작성해보세요!