이 시나리오를 생각해 보십시오. 당신은 Rails 개발자이고 지난 며칠 동안 모두가 기다리고 있는 멋진 기능을 개발하는 데 시간을 보냈습니다. 크고 복잡하지만 엄격한 테스트를 거쳤으므로 모든 것이 제대로 작동한다고 확신할 수 있습니다. 마감 기한이 있으므로 배포하세요. 즉시 모든 지옥이 풀려날 것입니다.
귀하의 기능은 일부 사용자의 전체 앱을 중단시킵니다. 이유를 말하기는 어렵습니다. 테스트 중에 버그가 나타나지 않았습니다. 변경 사항을 되돌렸지만 손상이 발생했습니다. 귀하의 고객은 만족하지 않으며 귀하는 가까운 미래에 피해를 통제하고 무엇이 잘못되었는지 조사하는 데 시간을 보내게 될 것입니다.
문제는 아무리 많은 테스트를 수행하더라도 복잡한 변경 사항을 공개하는 것은 본질적으로 위험하다는 것입니다. 이 기능을 점진적으로, 아마도 소수의 사용자에게만 먼저 출시했다면 좋았을 것입니다. 첫 번째 문제가 나타나자마자 해당 기능을 끌 수 있었다면 훨씬 더 좋았을 것입니다.
이것이 바로 기능 플래그가 등장하는 곳입니다. 이 게시물에서 우리는 Flipper gem을 사용하여 기능 플래그를 설정하는 방법을 포함하여 Rails의 기능 플래그에 대해 자세히 알아볼 것입니다. 하지만 먼저, 그게 무엇인가요?
Ruby on Rails의 기능 플래그란 무엇인가요?
기능 플래그는 애플리케이션이 실행되는 동안 해당 기능을 활성화하거나 비활성화하는 방법입니다. 플래그가 활성화되면 해당 기능이 사용됩니다. 그렇지 않으면 그렇지 않습니다. 의사코드에서 이와 같은 것을 상상해보세요.
'기능 플래그'라는 이름은 다소 오해의 소지가 있습니다. 런타임 시 애플리케이션 동작을 제어하는 것은 기능에만 국한되지 않고 프로그램 내의 모든 기능에 적용됩니다. 예를 들어 기능 플래그를 사용하여 성능 조정을 시도하고 A/B 테스트를 실행할 수 있습니다. 기능 플래그와 다른 기존 조건 간의 중요한 차이점은 런타임에 기능 플래그를 수정할 수 있다는 것입니다.
설명을 위해 환경 변수를 사용하는 간단한 기능 플래그 지정 메커니즘을 상상해 보겠습니다.
환경 변수의 값을 수정하여 애플리케이션의 일부를 마음대로 켜거나 끌 수 있습니다. 응용 프로그램의 어느 부분입니까? 원하는 것은 무엇이든!
기능이 비활성화된 경우 UI의 일부를 숨길 수 있습니다. 코드의 일부를 전환할 수 있는데, 이는 최신 리팩터링에 자신이 없는 경우 매우 유용합니다. 제가 가장 좋아하는 기능 플래그 용도 중 하나는 라우팅 제약 조건을 사용하여 전체 경로를 숨기는 것입니다:
우리는 이미 기능 플래그에 대한 많은 응용 프로그램이 있음을 볼 수 있습니다. 그러나 우리의 순진한 구현에는 한 가지 중요한 약점이 있습니다. 기능은 모든 사용자에 대해 활성화되거나 비활성화됩니다.
특정 사용자나 사용자 그룹, 또는 일정 기간 동안만 기능을 활성화하려면 어떻게 해야 할까요? Flipper를 살펴보겠습니다.
기능 플래그에 Flipper Gem 사용
Flipper는 기능 플래그와 이를 Rails에서 사용할 수 있는 다양한 전환 방법으로 만드는 보석입니다. 고도로 모듈화되어 있습니다. 주요 보석 외에도 스토리지 어댑터도 선택해야 하지만 이에 대해서는 나중에 더 자세히 설명합니다. 지금은 ActiveRecord 어댑터를 사용해 보겠습니다.
Gemfile에 다음 줄을 추가하고 bundle install를 실행하세요. :
ActiveRecord 어댑터를 사용할 때 Flipper는 기능 플래그를 데이터베이스에 저장하므로 새 데이터베이스 테이블을 설정해야 합니다. Flipper에는 필요한 마이그레이션을 생성하는 편리한 생성기가 함께 제공됩니다.
이전에 사용한 순진한 구현과 동일한 방식으로 Flipper를 사용할 수 있습니다.
가장 큰 차이점은 환경 변수를 수정하는 대신 이제 Flipper의 사용자 인터페이스를 사용하여 기능을 전환할 수 있다는 것입니다. Flipper UI gem을 추가하고 설치하세요.
Flipper UI를 마운트하도록 경로 파일을 수정하세요.
애플리케이션을 시작하고 Flipper UI로 이동하면 사용 가능한 모든 기능과 해당 상태에 대한 개요를 볼 수 있습니다. 계속해서 my_awesome_feature을 만들어 보세요. 기능입니다.

Flipper의 기능 전환
Flipper UI에서 단순히 기능을 활성화하거나 비활성화하는 것보다 훨씬 더 많은 일을 할 수 있다는 것을 눈치채셨을 것입니다. Flipper를 사용하면 일부 사용자 또는 특정 시간 동안 기능을 활성화할 수 있습니다. 다섯 가지 메커니즘 중 하나를 사용하여 기능 플래그를 구성할 수 있습니다.
그 중 하나는 전역 켜기/끄기 스위치인 부울 토글입니다. 나머지 4가지 항목은 그룹, 배우, 배우 비율, 시간 비율 등 그보다 훨씬 더 흥미롭습니다.
그룹
특정 사용자 그룹에 대해서만 기능을 활성화하려면 그룹 토글을 사용하십시오. 존재하지 않는 경우 config/initializers/flipper.rb 파일을 생성하세요. 그리고 다음 코드를 추가하여 새 그룹(예:유료 사용자)을 등록하세요.
이 새로운 토글을 사용하려면 Flipper 호출을 수정하여 사용자 또는 문서에서 호출하기를 좋아하는 행위자 및 기능 이름을 전달하세요.
Flipper는 이니셜라이저에서 정의한 블록을 사용하여 이 사용자에 대해 기능을 활성화할지 여부를 결정합니다. 이 경우 paid?을 호출합니다. 방법. 이제 Flipper UI에서 이 그룹을 사용할 수 있습니다. '그룹 추가' 버튼을 클릭하고 그룹을 선택하세요.

귀하의 그룹은 유료 사용자일 필요는 없습니다. 팀 구성원일 수도 있고 베타 프로그램에 등록한 사용자일 수도 있습니다. 그룹 토글을 사용하면 일부 사용자에게 무언가를 공개하려는 경우 유용합니다. 베타 릴리스나 내부 릴리스를 상상해 보십시오.
배우
때로는 특정 개인에게 무언가를 공개하고 싶을 수도 있습니다. 이 경우 액터 토글을 고려해야 합니다.
이 메커니즘을 사용하기 위해 초기화 프로그램에서 아무것도 변경할 필요가 없습니다. 그러나 대부분의 경우 사용자 모델이 될 액터 모델이 flipper_id를 구현하는지 확인해야 합니다. . Flipper::Identifier 포함 그건 알아서 처리해드리겠습니다.
그런 다음 이 ID를 사용하여 개별 사용자를 위한 기능을 활성화할 수 있습니다.

이 기능 토글은 특정 개인의 기능을 미리 보려면 유용합니다. 더 많은 사용자에게 기능이 출시되기 전에 기능에 액세스해야 하는 파트너를 위해 특정 테스트 계정을 활성화하는 것을 고려해 보세요.
배우 비율
기능 사용량을 천천히 늘리고 싶다면 액터 토글 비율이 적합합니다. 일부 성능 최적화를 구현했는데 그것이 프로덕션 환경에서 어떻게 작동할지 확신할 수 없다고 가정해 보세요. 먼저 소수의 사용자에게 이 기능을 배포한 다음 애플리케이션을 모니터링하면서 사용량을 천천히 늘리면 됩니다.

상황이 좋지 않으면 언제든지 비율을 0으로 재설정할 수 있습니다.
시간 비율
마지막으로, 요청의 일부에 대해 기능을 활성화할 수 있습니다. 이 토글을 사용할 때 액터를 제공할 필요가 없습니다.
나는 이것을 두 가지 다른 구현의 성능을 비교하는 데 사용하고 싶습니다. 이 기능 전환은 무작위입니다. 동일한 사용자가 요청마다 다른 동작을 경험하게 됩니다.
Flipper의 고급 구성
우리는 ActiveRecord 어댑터를 사용하여 데이터베이스에 기능 플래그 정보를 저장할 수 있다는 것을 이미 살펴보았습니다. 하지만 특정 요구 사항에 따라 다른 어댑터를 사용하고 싶을 수도 있습니다.
대부분의 경우, 스토리지 어댑터를 교체할 때 해야 할 일은 해당 gem을 설치하고 그에 따라 Flipper를 구성하는 것뿐입니다. 예를 들어 Redis 어댑터를 사용하려면 flipper-redis을 추가합니다. gem을 yourGemfile에 추가하고 Flipper 초기화 프로그램을 업데이트하세요.
스토리지 어댑터 구성 외에도 Flipper에서 조정할 수 있는 다른 측면이 많이 있습니다.
기능 플래그를 추가하면 약간의 성능 저하가 발생하므로 일반적으로 메모 및 캐싱을 추가하는 것이 좋습니다. 또한 Flipper UI에 대한 액세스를 승인된 사용자로 제한하고 싶을 수도 있습니다. 이러한 주제는 이 게시물의 범위를 벗어나지만, 더 자세히 알고 싶다면 Flipper 문서를 확인하는 것이 좋습니다.
Rails의 기능 플래그에 대한 주의사항
기능 플래그는 훌륭합니다. 하지만 많은 경우와 마찬가지로 고려해야 할 장단점이 있습니다.
기능 플래그를 추가하고 유지 관리하면 조직의 오버헤드가 추가됩니다. 플래그를 사용하여 숨겨진 기능을 릴리스하고 출시하는 것은 '일반' 코드를 배포하는 것만큼 간단하지 않습니다. 물론 이를 켜는 것을 기억해야 합니다! 일반적으로 그렇게 어렵지는 않지만 더 이상 필요하지 않은 기능 플래그를 정리하는 것은 어려울 수 있습니다.
코드에 기능 플래그를 추가할 때마다 조건을 추가하게 되며, 주의하지 않으면 코드가 빠르게 이러한 플래그로 가득 차게 됩니다. 특정 기능 플래그를 언제, 왜 생성했는지 추적하는 것은 어려울 수 있습니다. 안타깝게도 Flipper UI 자체는 기능 플래그 관리를 위한 많은 기능을 제공하지 않습니다.
또한 기능 플래그를 사용하면 약간의 성능 저하가 발생한다는 점도 알아야 합니다. 이를 완화할 수 있는 방법이 있지만 Flipper를 잘못 구성하거나 오용하는 경우 눈에 띄는 영향을 미칠 수 있습니다.
마무리:Ruby on Rails의 기능 플래그 시작하기
우리는 기능 플래그가 어떻게 보다 자신감 있게 출시하는 데 도움이 되는지 살펴보고, 기능 플래그가 원칙적으로 어떻게 작동하는지 알아보고, Flipper gem을 사용하여 기능 플래그를 시작하는 방법을 살펴보았습니다.
기능 플래그가 편리한 상황이 많이 있습니다. 사용 사례에 따라 부울, 그룹, 행위자, 행위자 비율, 요청 비율 등 5가지 토글 중 하나를 선택할 수 있습니다.
기능 플래그 작업에는 주의 사항이 있고 익숙해지는 데 시간이 걸릴 수 있지만 그럼에도 불구하고 마음대로 사용할 수 있는 훌륭한 도구입니다.
다음 시간까지 즐거운 코딩 되세요!
추신 Ruby Magic 게시물이 보도되는 즉시 읽으려면 Ruby Magic 뉴스레터를 구독하고 단 하나의 게시물도 놓치지 마세요!