Rails 컨트롤러 콜백 순서와 Concern 활용

Rails Controller Callback Order With Concerns

작성자
발행일
2025년 05월 17일

핵심 요약

  • 1 Rails의 `before_action` 콜백은 정의된 순서대로 실행되며, Concern 내에 정의된 콜백도 이 규칙을 따릅니다.
  • 2 Concern을 `include`할 때, Concern 내 `before_action`이 컨트롤러의 다른 콜백보다 먼저 실행될 수 있어 `NoMethodError`와 같은 문제를 야기할 수 있습니다.
  • 3 콜백 순서 문제를 명확히 하고 `include` 위치의 유연성을 확보하려면, Concern 내에서 `before_action`을 직접 정의하기보다 컨트롤러에서 명시적으로 호출하는 것이 좋습니다.

도입

이 글은 자동화된 전화 시스템의 프롬프트 목록을 설정하는 Rails 애플리케이션 개발 사례를 통해 컨트롤러의 `before_action` 콜백 순서의 중요성을 설명합니다. 초기에는 단일 `before_action`으로 프롬프트 목록을 설정했으나, 코드 재사용을 위해 공통 로직을 Concern으로 분리하는 과정에서 발생할 수 있는 콜백 실행 순서 문제를 다룹니다. 특히, `before_action`이 정의된 순서대로 실행된다는 기본 원칙이 Concern을 사용할 때 어떻게 적용되는지 보여줍니다.

초기 구현에서는 set_prompts before_action이 프롬프트 목록을 초기화하고 채웠습니다. 이후 공통 메시지를 add_callback_notices 메서드로 분리하고 별도의 before_action으로 호출했을 때도, 콜백은 정의된 순서대로 (set_prompts -> add_callback_notices) 실행되어 문제가 없었습니다.

Concern 도입과 콜백 순서 문제

그러나 이 add_callback_notices 로직을 Callbackable Concern으로 이동하고 Concern 내에서 included 블록을 통해 before_action :add_callback_notices를 정의한 후, 컨트롤러에서 include Callbackablebefore_action :set_prompts보다 먼저 배치하자 NoMethodError가 발생했습니다. 이는 Callbackable Concern의 before_action@prompts 변수가 초기화되기 전에 실행되어 nil 객체에 << 연산을 시도했기 때문입니다.

문제 해결 및 대안

  • include 순서 조정: 이 문제를 해결하기 위해서는 before_action :set_prompts가 먼저 실행되도록 include Callbackable 구문을 before_action :set_prompts 뒤에 배치해야 했습니다. 이는 콜백의 정의 순서 규칙이 Concern의 included 블록 내 before_action에도 동일하게 적용됨을 의미합니다.

  • include 순서의 모호성: 하지만 include 문의 위치가 다른 before_action 콜백의 실행 순서에 영향을 미친다는 점은 코드의 가독성과 유지보수성을 저해할 수 있습니다. include 순서에 대한 명확한 맥락이 없으면 개발자가 의도치 않게 순서를 변경하여 버그를 유발할 가능성이 있습니다.

  • 대안: Concern에서 콜백 정의 제거: 대안으로는 Concern 내에서 before_action을 직접 정의하지 않고, 단순히 공통 메서드(add_callback_notices)만 정의하는 방식이 제시됩니다. 이 경우 컨트롤러에서는 Concern을 include한 후, 필요한 위치에 before_action :add_callback_notices를 명시적으로 추가하여 콜백 순서를 직접 제어할 수 있습니다. 이 방법은 include 문의 위치에 대한 제약을 없애고, 컨트롤러 내에서 모든 콜백의 실행 순서를 한눈에 파악할 수 있게 하여 코드의 명확성을 높입니다.

결론

결론적으로 Rails 컨트롤러의 `before_action` 콜백은 정의된 순서대로 실행되며, 이 규칙은 `ActiveSupport::Concern`을 통해 포함된 콜백에도 동일하게 적용됩니다. 따라서 Concern을 사용할 때는 `include` 문의 위치가 콜백 실행 순서에 중대한 영향을 미칠 수 있음을 인지해야 합니다. 코드의 명확성과 유연성을 높이기 위해서는 Concern 내에서 콜백을 직접 정의하기보다, Concern이 제공하는 메서드를 컨트롤러에서 명시적으로 `before_action`으로 호출하는 방식을 고려하는 것이 바람직합니다. 이는 개발자가 콜백의 의존성과 실행 순서를 더 쉽게 이해하고 관리할 수 있도록 돕습니다.

댓글 0

로그인이 필요합니다

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

로그인 하러 가기

아직 댓글이 없습니다

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