본문으로 건너뛰기

Flipper Gem의 강력한 확장: Evil Martians의 커스텀 활용 사례 가이드

The Flipper gem is amazing, here's how we extended it the Martian way

작성자
발행일
2026년 03월 03일
https://evilmartians.com/chronicles/flipper-gem-is-amazing-we-extended-it-the-martian-way

핵심 요약

  • 1 Flipper Gem을 활용하여 단순 ID 기반이 아닌 사용자 이름이나 이메일 같은 인간 친화적인 식별자로 피처 플래그를 제어하는 방법을 제시합니다.
  • 2 특정 조직이나 팀 전체에 대해 피처 플래그를 활성화하고 이를 개별 멤버에게 적용하는 커스텀 그룹 로직 구현 사례를 설명합니다.
  • 3 피처 플래그의 상태 변화를 분석 도구와 연동하고 관리자 UI의 모든 변경 사항을 추적하는 감사 로그 시스템 구축 방법을 공유합니다.

도입

피처 플래그(Feature Flag)는 런타임 중에 코드의 실행 여부를 제어하여 점진적 배포와 리스크 관리를 가능하게 하는 핵심적인 기술입니다. 본 글에서는 StackBlitz의 사례를 통해, 기본 기능 이상의 복잡한 요구사항을 해결하기 위해 Ruby 진영의 대표적인 피처 플래그 도구인 Flipper Gem을 어떻게 확장하고 커스텀했는지 Evil Martians의 전문적인 접근 방식을 소개합니다. 단순한 on/off 기능을 넘어 분석 시스템 연동, 사용자 그룹화, 보안 감사 등 엔터프라이즈 급 요구사항을 Flipper의 유연한 아키텍처를 통해 해결하는 과정을 구체적인 코드와 함께 다룹니다.

1. Flipper 도입 배경과 피처 플래그의 가치

피처 플래그는 새로운 코드를 배포한 후 실제 활성화 시점은 나중에 결정할 수 있게 해주는 제어 장치입니다. 이는 특정 사용자 그룹, 트래픽 비율, 혹은 특정 조건에 따라 실시간으로 기능을 켜고 끌 수 있게 합니다. StackBlitz는 기존의 인하우스 솔루션을 사용하고 있었으나, 제품 성장에 따라 점진적 롤아웃, 분석 도구 연동, 감사 로그 등의 고도화된 기능이 필요해졌고, 이에 따라 확장성이 뛰어난 Flipper Gem을 채택하게 되었습니다.

2. 인간 친화적인 식별자 활용 (Friendly IDs)

기본적으로 Flipper는 User;42와 같은 데이터베이스 식별자를 사용합니다. 하지만 관리자 입장에서는 @username이나 이메일 주소로 기능을 활성화하는 것이 훨씬 직관적입니다. 이를 위해 Flipper::Actor 클래스를 패치하여 입력된 식별자가 사용자 이름인지, 이메일인지, 혹은 조직의 슬러그(slug)인지 판단하고 적절한 모델 인스턴스를 찾아 flipper_id를 반환하도록 개선했습니다. 또한 Flipper::UI 설정을 통해 플레이스홀더를 변경함으로써 관리자가 어떤 형식을 입력해야 하는지 명확히 안내할 수 있습니다.

3. 팀 및 조직 단위의 그룹 활성화

피처 플래그는 대개 개별 사용자 단위로 체크되지만, 비즈니스 요구사항에 따라 특정 ‘팀’ 전체에 기능을 열어줘야 할 때가 있습니다. Flipper의 커스텀 그룹 등록 기능을 활용하면, 체크 대상이 되는 actor가 특정 조직의 멤버인지 동적으로 확인하는 로직을 구현할 수 있습니다. 예를 들어 organization_members라는 그룹을 정의하고, 해당 그룹에 특정 조직을 추가하면 그 조직에 속한 모든 사용자가 별도의 설정 없이도 해당 기능을 사용할 수 있게 됩니다.

4. 분석 시스템 연동 및 관찰 시점 기록

A/B 테스트나 기능 성과 분석을 위해서는 사용자가 기능을 ‘언제 처음 보았는지’가 중요합니다. 단순히 플래그가 켜진 시점이 아니라, 실제 코드 경로를 통해 enabled? 메서드가 호출되어 사용자가 해당 기능을 접한 순간을 기록해야 합니다. 이를 위해 ActiveSupport::Notifications를 구독하여 feature_operation.flipper 이벤트를 추적합니다. 데이터베이스에 flipper_remembers 테이블을 구축하여 각 사용자별 최초 노출 시점을 기록하고, 새로운 기록이 생성될 때만 분석 엔진(Analytics Tracker)으로 이벤트를 전송하여 데이터 전송량을 최적화합니다.

5. 관리자 작업 감사 로그(Audit Log) 구현

Flipper UI는 독립적인 Rack 애플리케이션으로 동작하기 때문에 Rails의 current_user에 직접 접근할 수 없습니다. 이를 해결하기 위해 커스텀 Rack 미들웨어를 작성하여 Warden(Devise의 기반) 세션에서 사용자 정보를 추출하고 CurrentAttributes에 저장합니다. 이후 Flipper의 작업을 구독하는 이벤트 핸들러에서 이 정보를 활용해 ‘누가’, ‘언제’, ‘어떤 플래그’를 변경했는지 상세한 감사 로그를 남깁니다. 또한 텍스트 프래그먼트 URI 기술을 활용해 감사 로그에서 해당 피처 플래그 설정 페이지로 직접 연결되는 링크를 제공하여 관리 편의성을 극대화했습니다.

결론

Flipper는 단순한 라이브러리를 넘어 확장성이 매우 뛰어난 도구입니다. Evil Martians는 계층적 권한 관리, 분석 연동, 감사 로그 등 기업용 애플리케이션에 필수적인 기능들을 Flipper의 내부 구조를 활용해 성공적으로 구현했습니다. 특히 ActiveSupport::Notifications를 활용한 이벤트 구독과 Rack 미들웨어를 통한 컨텍스트 주입 방식은 Rails 생태계 내에서 Flipper를 얼마나 깊이 있게 제어할 수 있는지 잘 보여줍니다. 이러한 유연성은 복잡한 비즈니스 로직을 가진 프로젝트에서 Flipper가 왜 최선의 선택인지를 증명하며, 개발자들에게 창의적인 확장 가능성을 시사합니다.

댓글0

댓글 작성

댓글 삭제 시 비밀번호가 필요합니다.

이미 계정이 있으신가요? 로그인 후 댓글을 작성하세요.

0/1000
정중하고 건설적인 댓글을 작성해 주세요.