권한 관리 안티패턴 및 개선 방안
기존 current_user.admin?과 같은 역할(Role) 직접 의존 방식은 사업 변화에 취약하며 기술 부채를 유발하는 안티패턴입니다. 권한이 암묵적이고 로직이 분산되어 유지보수가 어렵습니다.
이를 개선하려면 역할이 아닌 권한(Permission)에 의존해야 합니다. can_create_project?처럼 권한을 명시하고, 함수 내에서 역할을 정의합니다. 이로써 권한이 명시적이고 역할 변경에 영향을 받지 않으며, 권한 판별이 한 곳에 집중되어 오류 방지에 용이합니다.
권한 관리 요소 분리 및 모듈 설계
제안된 모듈은 대상, 역할, 조작, 조건의 4가지 핵심 요소를 명확히 분리합니다. 이는 Pundit Gem과 달리 역할과 조건을 분리하여 복잡한 로직의 가독성을 높입니다.
모듈은 대상과 역할로부터 권한 클래스를 특정하고, 판별 모드(레코드, 스코프, 리스트)에 따라 조작 함수를 실행하며 조건을 판별합니다. 메타 프로그래밍을 활용하여 유연성을 확보했고, 각 역할 파일에서는 정의된 조건을 논리 연산자와 함께 사용하여 영어만으로도 이해 가능한 단순하고 명확한 권한 표현을 가능하게 합니다.
서비스 전반의 긍정적 영향
모듈 도입 후 1년간 버그 발생 0건으로 서비스 신뢰성이 크게 향상되었습니다. 고객 지원(CS) 및 제품 관리자(PDM)가 직접 권한을 이해하고 대응하며, 엔지니어에게 오는 권한 관련 문의가 0건이 되어 개발 생산성이 증대되었습니다.
클라이언트 측(Next.js)에서도 기술 부채를 방지했습니다. Rails에서 권한 목록을 JSON으로 전달받아 Next.js도 역할이 아닌 권한에 의존하는 구현이 자연스럽게 이루어졌습니다. Next.js는 이 권한 맵과 PermissionComponent로 UI 제어를 선언적으로 기술하며, Rails와 Next.js 간 권한 일관성을 유지합니다.