Pundit 네임스페이스 정책 간소화: 깔끔한 접근 방식

Namespaced Pundit Policies Without the Repetition Racket

작성자
발행일
2025년 06월 24일

핵심 요약

  • 1 Pundit 네임스페이스 정책 적용 시 발생하는 반복적인 `policy_scope` 및 `authorize` 오버라이딩 문제를 다룹니다.
  • 2 기존의 코드 중복 문제를 해결하기 위해 `NamespacedPolicy` Concern을 활용한 개선 방안을 제시합니다.
  • 3 동적 메서드 생성을 통해 컨트롤러 코드를 간결하게 유지하고 개발 생산성을 향상시키는 방법을 소개합니다.

도입

Pundit은 Rails 애플리케이션에서 권한 부여를 관리하는 인기 있는 Gem입니다. `Admin::PostPolicy`와 같은 네임스페이스 정책 사용 시, 공식 권장 방식은 베이스 컨트롤러에서 `policy_scope` 및 `authorize` 메서드를 오버라이딩하여 네임스페이스를 수동으로 추가하는 것입니다. 이 방식은 반복적인 코드 작성을 유발하여 코드 중복과 가독성 저하를 초래합니다. 본 글은 이러한 반복적인 문제를 해결하고 코드를 간소화하기 위한 개선된 접근 방식을 제시합니다.

Pundit 네임스페이스 정책의 기존 구현 방식은 AdminController와 같은 베이스 컨트롤러에서 policy_scopeauthorize 메서드를 수동으로 오버라이딩하여 네임스페이스 심볼을 추가하는 형태입니다.

기존 Pundit 네임스페이스 정책 구현 예시

ruby class AdminController < ApplicationController def policy_scope(scope) super([:admin, scope]) end def authorize(record, query = nil) super([:admin, record], query) end end

  • 이 방식은 각 네임스페이스 베이스 컨트롤러마다 동일한 코드를 반복해야 하는 단점이 있습니다.

  • 이는 코드 중복을 증가시키고 유지보수를 번거롭게 만듭니다.

제안하는 개선된 접근 방식: NamespacedPolicy Concern

이러한 문제를 해결하기 위해, NamespacedPolicy라는 Ruby 모듈 Concern이 제안됩니다. 이 Concern은 Module.newdefine_method를 사용하여 동적으로 policy_scopeauthorize 메서드를 생성하며, 지정된 네임스페이스 심볼을 자동으로 처리합니다.

ruby # app/controllers/concerns/namespaced_policy.rb module NamespacedPolicy def self.Policy(scope) Module.new do define_method :policy_scope do |scope_class| super([scope, scope_class]) end define_method :authorize do |record, query = nil| super([scope, record], query) end private :policy_scope, :authorize end end end

  • NamespacedPolicy::Policy(:namespace_symbol) 형태로 호출하여 특정 네임스페이스에 대한 정책 로직을 포함하는 익명 모듈을 생성합니다.

  • 생성된 모듈은 policy_scopeauthorize 메서드를 오버라이딩하여 super 호출 시 지정된 scope를 자동으로 프리픽스로 추가합니다.

개선된 컨트롤러 구조

이 Concern을 베이스 컨트롤러에 포함하면, 컨트롤러 코드는 다음과 같이 간결해집니다. ruby class AdminController < ApplicationController include NamespacedPolicy::Policy(:admin)

  • AdminController는 이제 단 한 줄의 include 문으로 네임스페이스 정책 기능을 완벽하게 지원하며, 코드 중복이 효과적으로 제거됩니다.

  • 하위 컨트롤러에서는 policy_scopeauthorize를 평소처럼 호출할 수 있어 개발자 경험이 향상됩니다.

결론

Pundit 네임스페이스 정책의 반복적인 코드 문제는 `NamespacedPolicy` Concern을 통해 효과적으로 해결될 수 있습니다. 이 접근 방식은 기존의 수동 오버라이딩보다 훨씬 깔끔하고 유지보수가 용이한 코드를 가능하게 합니다. `Module.new`와 `define_method`를 활용한 동적 메서드 생성 기법은 Ruby의 유연성을 잘 보여주며, 개발자는 boilerplate 코드를 줄여 핵심 비즈니스 로직에 집중할 수 있습니다. 이는 코드 품질과 개발 생산성 향상에 기여할 것입니다.

댓글 0

로그인이 필요합니다

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

로그인 하러 가기

아직 댓글이 없습니다

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