Rails 컨트롤러 콜백 실행 순서 검사 트릭

How to Inspect the Sequence of Controller Callbacks in Rails

발행일
2025년 06월 17일

핵심 요약

  • 1 Rails 컨트롤러의 before, after, around 콜백 실행 순서를 정확히 파악하는 디버깅 트릭을 소개합니다.
  • 2 config/initializers에 커스텀 코드를 추가하여 before_actions, after_actions, around_actions 메서드를 동적으로 생성합니다.
  • 3 이 트릭은 _process_action_callbacks 내부 메서드를 활용하여 콜백 메타데이터를 추출하며, 복잡한 컨트롤러 디버깅에 유용합니다.

도입

Rails 애플리케이션을 디버깅할 때, 컨트롤러 액션 전후 또는 주변에 실행되도록 설정된 콜백의 전체 목록과 정확한 실행 순서를 아는 것은 매우 유용합니다. 특히 컨트롤러 상속 계층이 깊거나 조건부 콜백을 사용하는 컨선(concern)이 많은 애플리케이션에서 이러한 정보는 복잡한 콜백 시퀀스를 이해하는 데 필수적입니다. 본 글은 이러한 콜백의 전체 목록을 검사할 수 있는 간단하면서도 효과적인 트릭을 소개합니다.

Rails 컨트롤러의 콜백 실행 순서를 확인하는 방법은 다음과 같습니다.

1. 이니셜라이저 추가

config/initializers/callbacks.rb 파일에 다음 코드를 추가하여 ActionController::Base 클래스에 before_actions, after_actions, around_actions 세 가지 메서드를 동적으로 정의합니다.

ruby # config/initializers/callbacks.rb class ActionController::Base class << self CALLBACK_KINDS = [:before, :after, :around].freeze CALLBACK_KINDS.each do |kind| define_method("#{kind}_actions") do _process_action_callbacks.select { |c| c.kind == kind }.map(&:filter) end end end end

2. 메서드 동작 원리

위 코드는 :before, :after, :around 각 콜백 종류에 대해 define_method로 메서드를 생성합니다. 각 메서드는 Rails 내부의 _process_action_callbacks를 호출하여 컨트롤러의 모든 액션 콜백 목록(Callback 객체)을 가져옵니다. 이 Callback 객체는 kind, filter, if/unless 조건 등의 메타데이터를 포함합니다. 생성된 메서드는 특정 kind에 해당하는 콜백 객체만 필터링한 후, filter 속성을 추출하여 실행될 콜백들의 배열을 반환합니다.

3. 사용 예시

이니셜라이저 로드 후, 모든 컨트롤러 클래스에서 다음처럼 동적으로 정의된 메서드를 호출하여 콜백 목록을 확인할 수 있습니다.

ruby PostsController.before_actions # => [:verify_authenticity_token, :set_site_info, ...] PostsController.after_actions # => [:verify_same_origin_request] PostsController.around_actions # => [:turbo_tracking_request_id] 이 방법은 콜백 실행 순서를 정확히 보여주므로, 복잡한 콜백 로직 디버깅에 매우 유용합니다.

4. Rails 소스 코드 활용

이 트릭은 Rails 소스 코드(filters_test.rb)에서 유사한 테스트 코드를 발견하여 개발되었습니다. _process_action_callbacks는 공식 퍼블릭 API는 아니지만, 디버깅이나 문서화 목적으로 컨트롤러 필터를 내성(introspect)하는 데 신뢰할 수 있는 방법입니다. Rails 소스 코드를 읽는 것은 문제 해결과 새로운 패턴 발견에 큰 도움이 됩니다.

결론

본 글에서 소개된 트릭은 Rails 컨트롤러의 복잡한 콜백 시퀀스를 명확하게 이해하고 디버깅하는 데 강력한 도구로 활용될 수 있습니다. `_process_action_callbacks`와 같은 내부 메커니즘을 활용하여 콜백의 종류와 실행 순서를 동적으로 파악하는 이 방법은, 특히 상속 계층이 깊거나 컨선을 많이 사용하는 애플리케이션에서 발생할 수 있는 혼란을 줄여줍니다. 또한, Rails 소스 코드를 탐색하는 것이 문제 해결 및 새로운 지식 습득에 얼마나 효과적인지 다시 한번 강조하며, 개발자들이 막다른 길에 부딪혔을 때 소스 코드를 살펴보는 것을 권장합니다.

댓글 0

로그인이 필요합니다

댓글을 작성하거나 대화에 참여하려면 로그인이 필요합니다.

로그인 하러 가기

아직 댓글이 없습니다

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