Rails Deprecation 경고 추출: AST와 Tree-sitter 활용

Extracting Deprecation Warnings from the Rails Source Code

작성자
발행일
2025년 08월 14일

핵심 요약

  • 1 Rails 애플리케이션의 업그레이드 및 코드 분석을 위해 소스 코드에서 Deprecation 경고를 효과적으로 추출하는 방법을 제시합니다.
  • 2 정규 표현식 대신 추상 구문 트리(AST)와 `tree-sitter` 라이브러리를 활용하여 경고 메시지를 식별하고 분석합니다.
  • 3 heredoc, 문자열, 변수 할당 등 다양한 형태의 경고 메시지를 처리하는 상세한 AST 탐색 및 추출 로직을 설명합니다.

도입

FastRuby.io는 Rails 업그레이드 및 기술 부채 관리 서비스를 전문적으로 제공하며, 성공적인 업그레이드를 위해 코드베이스 내 Deprecation 경고를 사전에 처리하는 것을 중요하게 여깁니다. 본 문서는 Rails 2.3 버전부터 최신 버전에 이르기까지 Rails 소스 코드에서 발생하는 모든 Deprecation 경고를 체계적으로 추출하는 방법에 대해 상세히 다룹니다. 특히, `ActiveSupport::Deprecation.warn` 또는 `Class.deprecator.warn`와 같은 경고 발생 메커니즘을 이해하고, 이를 자동화된 방식으로 추출하기 위한 기술적 접근법, 즉 추상 구문 트리(AST)를 활용한 방법을 중점적으로 설명합니다.

Rails에서 Deprecation 경고는 버전별로 상이한 방식으로 처리됩니다. Rails 7.0까지는 ActiveSupport::Deprecation.warn 메서드를 사용하며, Rails 7.1부터는 ActiveSupport.deprecator.warn 또는 ActiveJob.deprecator.warn와 같이 Class.deprecator.warn를 통해 경고가 발생합니다. 경고 메시지는 heredoc, 단일 문자열, 이진 문자열, 연결된 문자열, 또는 변수에 할당된 형태 등 매우 다양하게 정의될 수 있습니다. 이러한 복잡성을 효과적으로 다루기 위해, 본 문서에서는 정규 표현식의 한계를 지적하고 추상 구문 트리(AST)와 tree-sitter 라이브러리를 활용하는 방안을 제안합니다.

경고 추출 과정은 ruby_tree_sitter 젬 설치와 tree-sitter-ruby 저장소 클론 및 문법 빌드로부터 시작됩니다. 이후 CustomParser 클래스를 구현하여 TreeSitter 파서를 초기화하고, 분석 대상 소스 코드의 AST를 생성합니다. 핵심 단계는 AST를 탐색하여 .warn 메서드 호출을 정확히 식별하는 것입니다. 이는 노드의 타입이 :call이고, method 필드 이름의 자식 노드가 “warn”인 경우를 확인하는 방식으로 이루어집니다. 더 나아가, 호출의 receiverDeprecation (Rails 7.0 이하) 또는 deprecator (Rails 7.1 이상)인지 검사하여 불필요한 호출을 필터링합니다. Node 객체는 직접 텍스트를 제공하지 않으므로, 바이트 범위를 활용하여 원본 소스 코드에서 텍스트를 추출하는 기법이 적용됩니다.

경고 메시지 추출 로직은 식별된 .warn 호출 노드를 기반으로 다양한 메시지 정의 방식을 처리합니다:

  • Heredoc: :call 노드의 부모가 :heredoc_body 타입의 자식을 가지는지 확인하고, :heredoc_content 노드에서 내용을 추출한 후 불필요한 공백과 줄바꿈을 정리합니다.
  • 직접 전달된 문자열: :call 노드가 arguments 필드 이름을 가진 자식을 가지는지 확인하며, 이 arg_node의 자식 노드 타입이 :string, :binary, :chained_string인지에 따라 처리합니다. :string 타입은 직접 텍스트를 추출하고, :binary 또는 :chained_string은 여러 :string 자식 노드의 내용을 연결하여 추출합니다. 이 과정에서 따옴표와 불필요한 공백을 제거하는 처리가 포함됩니다.
  • 변수에 할당된 메시지: :call 노드의 부모가 :assignment 타입의 자식을 가지는지 확인하고, 할당된 변수의 내용을 추출하는 방식으로 처리합니다.

이러한 개별 로직들은 traverse_ast 메서드에 통합되어 AST 전체를 재귀적으로 순회하며 모든 Deprecation 경고 메시지를 효율적으로 수집합니다.

결론

추상 구문 트리(AST)를 활용한 이 방법론은 Rails 소스 코드 내에 존재하는 모든 Deprecation 경고 메시지를 매우 효과적으로 추출할 수 있음을 입증합니다. 이는 코드베이스 분석 도구의 정확성과 기능을 크게 향상시키며, 결과적으로 Rails 애플리케이션의 업그레이드 프로세스를 더욱 효율적이고 안정적으로 만드는 데 기여합니다. 이 접근 방식을 통해 Rails 전체 코드베이스를 분석하여 경고를 추출하고, 이를 기반으로 한 업그레이드 로드맵 수립 및 기술 부채 해결에 실질적인 도움을 얻을 수 있습니다.

댓글 0

댓글 작성

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

아직 댓글이 없습니다

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