Rails Deprecation 경고 추출하기

Extracting Deprecation Warnings from the Rails Source Code

작성자
발행일
2025년 07월 23일

핵심 요약

  • 1 이 글은 Rails 애플리케이션 업그레이드와 코드베이스 분석을 위해 Rails 소스 코드에서 Deprecation 경고를 효율적으로 추출하는 방법을 설명합니다.
  • 2 정규 표현식의 한계를 극복하고자 추상 구문 트리(AST)와 `tree-sitter` 라이브러리를 활용하여 Ruby 코드를 분석하는 접근 방식을 제시합니다.
  • 3 `.warn` 메서드 호출을 식별하고, heredoc, 문자열, 변수 할당 등 다양한 형태의 경고 메시지를 AST 탐색을 통해 추출하는 구체적인 Ruby 코드 구현을 다룹니다.

도입

FastRuby.io는 Rails 업그레이드, 유지보수 및 기술 부채 해결 서비스를 전문으로 제공하며, Rails 업그레이드 전 코드베이스의 정적 분석을 통해 Deprecation 경고를 처리하는 것을 매우 중요하게 여깁니다. 이 글은 Rails 2.3 버전부터 최신 버전까지 모든 Rails 소스 코드에서 Deprecation 경고 메시지를 추출하는 방법에 중점을 둡니다. 경고 메시지가 다양한 방식으로 정의될 수 있음을 고려하여, 이러한 복잡성을 효과적으로 해결하기 위해 정규 표현식 대신 추상 구문 트리(AST)를 활용하는 접근 방식을 제안합니다.

Deprecation 경고를 추출하기 위해서는 먼저 경고가 발생하는 방식을 이해해야 합니다. Rails 7.0까지는 ActiveSupport::Deprecation.warn 메서드가 사용되었고, Rails 7.1부터는 ActiveSupport.deprecator.warn과 같이 Class.deprecator.warn 형태가 사용됩니다. 추출 과정의 첫 번째 단계는 .warn 메서드 호출을 식별하되, 호출의 수신자가 Deprecation 또는 deprecator인지 확인하여 logger.warn과 같은 오탐을 방지하는 것입니다. 이 과정에서 tree-sitter 라이브러리와 Ruby tree-sitter 바인딩을 사용하여 Ruby 코드를 파싱하고 AST를 생성합니다. 이를 통해 각 노드의 타입과 필드 이름을 활용하여 .warn 호출 지점을 정확하게 찾아낼 수 있습니다.

경고 메시지는 다양한 형태로 정의될 수 있으므로, 모든 경우를 처리할 수 있는 추출 로직이 필요합니다. 주요 메시지 정의 방식은 다음과 같습니다:

  • Heredoc: <<~MSG와 같은 heredoc 구문을 사용하는 경우, AST에서 :heredoc_body 노드를 찾아 :heredoc_content 노드에서 실제 메시지를 추출하고 불필요한 공백과 줄바꿈을 제거합니다.
  • 문자열: 리터럴 문자열, 이진 문자열(예: "part() is deprecated" << "Please pass a block"), 연결된 문자열(예: "preload_associations is deprecated." \ "Use ActiveRecord::Associations::Preloader.new") 등 직접 문자열로 전달되는 경우, AST의 :string, :binary, :chained_string 노드를 통해 내용을 추출합니다.
  • 변수 할당: 메시지가 변수에 할당된 후 해당 변수가 .warn 메서드에 인수로 전달되는 경우, AST에서 :assignment 노드를 찾아 변수에 할당된 문자열을 추출합니다.

이러한 다양한 메시지 정의 방식을 처리하기 위해 CustomParser 클래스를 구현합니다. 이 클래스는 tree-sitter 파서를 초기화하고, extract_deprecation_warnings 메서드를 통해 AST를 파싱하여 루트 노드부터 재귀적으로 탐색합니다. is_warn_call? 메서드는 특정 노드가 올바른 .warn 호출인지 확인하며, extract_warning_messages 메서드는 식별된 호출 노드로부터 위에서 설명한 방식에 따라 실제 경고 메시지를 추출합니다. 이 모든 구성 요소를 통합함으로써 Rails 소스 코드 전체에서 Deprecation 경고를 효과적으로 추출할 수 있는 견고한 솔루션을 완성합니다.

결론

추상 구문 트리(AST)를 효과적으로 탐색함으로써, Rails 코드베이스 내에 존재하는 모든 Deprecation 경고 메시지를 정확하고 체계적으로 추출하는 것이 가능합니다. 이렇게 추출된 경고 정보는 코드베이스의 정적 분석 도구의 기능을 강화하고, 복잡한 Rails 업그레이드 프로세스를 더욱 간소화하는 데 필수적인 기반을 제공합니다. FastRuby.io는 이러한 전문적인 접근 방식을 통해 Rails 업그레이드 과정에서 직면하는 어려움을 해결하는 데 기여하고 있습니다.

댓글 0

댓글 작성

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

아직 댓글이 없습니다

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