기능 플래그(Feature Flag)는 소프트웨어 개발에서 강력한 도구입니다. 새로운 코드를 배포하지 않고도 런타임에 애플리케이션의 동작을 제어할 수 있어, 팀이 새로운 기능을 실험하거나 A/B 테스트를 수행하고, 변경 사항을 점진적으로 출시할 수 있습니다.
Ruby on Rails에서는 다양한 도구로 기능 플래그를 관리할 수 있으며, 그중 가장 널리 쓰이는 것이 Flipper 젬입니다. 이 글에서는 Flipper와 AppSignal의 커스텀 메트릭을 활용해 Solidus 스토어프론트에서 기능 플래그를 구현하고 그 영향을 측정하는 방법을 살펴보겠습니다.
Rails의 기능 플래그란 무엇일까요?
주제에 대한 기본적인 소개가 필요하다면 'Add Feature Flags in Ruby on Rails with Flipper' 포스트를 참고하세요.
간단히 요약하자면, 기능 플래그란 새 코드를 배포할 필요 없이 런타임에 애플리케이션의 동작에 영향을 주는 방법입니다. 가장 단순한 형태의 기능 플래그는 환경 변수입니다. 모든 Ruby on Rails 애플리케이션은 기본적으로 환경 변수를 지원하며, 예를 들어 ENV['WEB_CONCURRENCY']를 통해 애플리케이션 서버의 동시성을 설정할 수 있습니다.
하지만 ActiveRecord나 Redis 같은 영속성 계층을 활용하는 등 기능 플래그를 관리하는 더 정교한 방법들도 있습니다. Flipper 젬은 이러한 작업을 위한 종합적인 솔루션을 제공합니다.
다음 스니펫은 특정 사용자에 대해 performance_improvement 기능 플래그를 평가하는 방식을 보여줍니다:
이제 Solidus 스토어프론트를 구축하고 기능 플래그 실험을 시작해 보겠습니다.
예제 앱: Solidus 스토어프론트
실제와 비슷한 시나리오에서 기능 플래그의 영향을 측정하기 위해, 먼저 Solidus 스토어를 빠르게 구성해 보겠습니다:
이 제너레이터는 설정 과정을 안내하며 몇 가지 질문을 던집니다.
- 프론트엔드 타입을 묻는 질문에는 starter를 선택합니다.
- 결제 수단 설정은 건너뜁니다.
- Solidus 애플리케이션을 단독 앱으로 사용하므로 마운트 경로는
/로 지정합니다.
설정이 끝나면 터미널에서 bin/dev를 실행하면 준비 완료입니다. https://localhost:3000에 접속하면 다음 화면을 볼 수 있습니다:

Flipper로 기능 플래그 구현하기
이제 기능 플래그의 대표적인 두 가지 활용 사례를 구현해 보겠습니다:
- 성능 개선
- 전환율 최적화 시도
먼저 flipper 젬과 active_record 저장소 어댑터를 추가해야 합니다:
이렇게 하면 Flipper의 '게이트(gate)', 즉 기능 플래그 확인 시 평가되는 구체적인 조건들을 조회하기 위한 데이터베이스 테이블이 생성됩니다.
성능 개선 테스트하기
이 시나리오를 검증하기 위해, 최적화되지 않은 경우에 1초 지연을 발생시키는 sleep 1 호출을 추가해 느린 요청을 시뮬레이션하겠습니다:
다음으로 '퍼센트 오브 타임(percentage of time)' 전략을 사용해 최적화를 무작위 요청 집합에 걸쳐 점진적으로 배포합니다. Rails 콘솔을 열고 다음 명령어를 입력하세요:
oha 부하 테스트 도구를 사용하면 실제로 요청의 절반이 나머지보다 1초 더 오래 걸린다는 것을 확인할 수 있습니다:
전환율 최적화 테스트하기
UI 변경처럼 사용자에게 직접 노출되는 기능을 다룰 때는 '퍼센트 오브 액터(percentage of actors)' 전략으로 플래그를 롤아웃하는 것이 좋습니다. 이렇게 하면 모든 사용자가 일관된 경험을 유지할 수 있습니다.
먼저 전자상거래 애플리케이션용 사용자 두 명을 생성하겠습니다. Rails 콘솔을 실행하고 다음 명령어를 입력하세요:
이렇게 하면 샘플 사용자 두 명이 생성되고, 그중 한 명에게만 기능 플래그가 일관되게 활성화됩니다.
전환율을 높이려는 기능을 시뮬레이션하기 위해 결제 버튼에 펄스(pulsate) 효과를 적용해 보겠습니다:
두 사용자로 각각 로그인한 뒤 브라우저 창을 나란히 배치하면, 한쪽(왼쪽) 사용자에게만 효과가 활성화된 것을 확인할 수 있습니다.
AppSignal 커스텀 메트릭으로 기능 플래그의 영향 측정하기
아무리 뛰어난 기능 플래그 시스템이라도 그 효과를 평가할 방법이 없다면 무용지물입니다. 이 예제 시나리오에서 우리가 알고 싶은 것은 다음 두 가지입니다:
- 성능 개선이 유의미한 지연 시간 감소로 이어졌는가?
- 펄스 효과가 적용된 결제 버튼이 전환율을 유의미하게 높였는가?
AppSignal의 커스텀 메트릭을 사용해 이러한 최적화의 성과를 측정해 보겠습니다.
먼저 AppSignal 조직에서 새 애플리케이션을 생성하고, 안내에 따라 여러분의 앱과 연결합니다:
측정(Measurement) 메트릭으로 지연 시간 측정하기
앞서 oha CLI로 개선 효과를 확인했지만, 타당한 판단을 내리려면 서버 사이드 텔레메트리를 설치해 AppSignal에 지연 시간을 보고해야 합니다. 측정(measurement) 메트릭이 바로 이 용도에 딱 맞습니다. 응답 시간을 밀리초 단위로 전송하고, 특정 요청에 대해 성능 최적화가 활성화되었는지 여부를 나타내는 메트릭 태그를 함께 추가합니다.
여기서 주의할 점이 하나 있습니다. 'Percentage of Time' 전략을 사용하기 때문에, 실행과 보고에 동일한 값을 사용하도록 플래그 상태를 인스턴스 변수에 캡처해야 합니다:
이제 앞서 진행한 로컬 부하 테스트를 다시 반복해 보겠습니다:
이 메트릭의 차트 작성 및 평가 방법은 잠시 후 다루겠습니다. 그 전에 두 번째 기능 플래그로 넘어가겠습니다.
카운트(Count) 메트릭으로 전환 집계하기
전환수를 세는 데는 카운터 메트릭을 사용합니다. 단순히 이벤트 발생 횟수를 집계하고 싶다면 이것이 가장 좋은 선택입니다.
이를 위해 CartsController를 열고, 데모 목적으로 결제 버튼이 클릭될 때 increment_counter 호출을 추가하겠습니다:
이제 브라우저 창을 직접 열어 한쪽에서는 '결제' 버튼을 3번, 다른 쪽에서는 1번 클릭해서 테스트해 보세요. 이를 통해 최적화 플래그가 활성화되어 있는지 확인할 수 있습니다.
AppSignal에서 커스텀 대시보드 구성하기
마지막 단계는 데이터에 기반한 비즈니스 의사결정을 내릴 수 있도록 유용한 그래프를 만드는 것입니다. AppSignal의 대시보드를 활용하겠습니다. 단계별로 살펴보겠습니다:
- 왼쪽 사이드바에서 'Add dashboard'를 클릭하고 'Feature Flag Evaluation'이라고 이름 붙입니다.

- 'Add Graph'를 클릭하고
products_response_time메트릭을 선택합니다. 평균값만 표시하도록 'mean'을 선택하고,performance_improvement_enabled태그를 적용합니다.

- 'Add new Graph'를 클릭해 결제 카운트 차트를 추가합니다. 마찬가지로
optimization_active태그를 적용합니다.

이제 커스텀 대시보드가 완성되었습니다. 왼쪽 선 그래프에서 성능 개선이 실제로 효과가 있었음을 확인할 수 있고, 오른쪽에서는 최적화된 경우 결제 수가 더 많이 기록된 것을 볼 수 있습니다.

이것으로 끝입니다!
마무리
지금까지 기능 플래그가 Ruby on Rails 애플리케이션에서 새로운 기능을 유연하고 효율적으로 관리·배포할 수 있는 방법임을 살펴봤습니다. Flipper 젬과 AppSignal의 커스텀 메트릭 같은 도구를 활용하면 개발자는 기능 롤아웃을 제어할 뿐만 아니라, 성능과 사용자 행동에 미치는 영향까지 측정할 수 있습니다.
이러한 접근 방식은 새로운 기능이 완전히 배포되기 전에 철저히 테스트되고 최적화되도록 보장하며, 궁극적으로 더 안정적이고 사용자 친화적인 애플리케이션을 만들어냅니다. 나아가 여러 대안의 효과를 평가할 때 더 현명한 비즈니스 의사결정을 내리는 데에도 도움이 됩니다.
즐거운 코딩 되세요!
P.S. Ruby Magic 포스트가 발행되자마자 읽고 싶으시다면 Ruby Magic 뉴스레터를 구독하세요. 어떤 글도 놓치지 않을 수 있습니다!

Julian Rubisch
게스트 저자 Julian은 빈(Vienna)에 거주하는 프리랜서 Ruby on Rails 컨설턴트로, Reactive Rails를 전문으로 합니다. StimulusReflex 코어 팀의 일원으로 2020년부터 HTML-over-the-wire 기술 개발의 최전선에 서 있습니다.
Julian Rubisch의 모든 글 보기