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 소스 코드를 읽는 것은 문제 해결과 새로운 패턴 발견에 큰 도움이 됩니다.