멀티 테넌트 SaaS에서의 팀 스코프
개인 사용자가 아니라 팀(테넌트) 단위로 플래그를 관리하고 싶은 경우, 기본 스코프를 팀으로 변경합니다.Feature::active('billing-v2')가 자동으로 현재 팀을 대상으로 합니다. 팀 멤버가 누구든 같은 팀에 속하는 한 같은 결과가 반환되므로, UI의 일관성이 유지됩니다.
팀 가입일에 따른 단계적 롤아웃 예시입니다.
긴급 킬 스위치 (before 메서드 활용)
프로덕션에서 버그가 발각되었을 때, 코드 롤백 없이 즉시 기능을 무효화할 수 있습니다. 클래스 기반 피처에 before 메서드를 추가하면 스토리지의 값보다 먼저 체크가 실행됩니다.
FEATURES_NEW_CHECKOUT_DISABLED=true를 설정하는 것만으로, DB를 건드리지 않고 기능을 멈출 수 있습니다. 배포 불필요한 킬 스위치입니다.
스케줄된 롤아웃
특정 일시에 자동으로 전 사용자에게 공개하고 싶은 케이스.before 메서드로 구현할 수 있습니다.
2025-04-01을 지나면 자동으로 전 사용자에게 공개됩니다. 배포 없이, DB 없이, Artisan 명령 없이 자동화할 수 있습니다.
다크 런치 (Shadow Mode)
새로운 로직을 사용자에게 보이지 않고 프로덕션 데이터로 동작시켜, 기존 로직과 결과를 비교하는 패턴입니다. 문제가 없다면 플래그를 켜는 것만으로 릴리스 완료입니다.recommendation-v2로 전환하기만 하면 됩니다.
이벤트를 사용한 A/B 테스트 결과 수집
공식 문서에는FeatureRetrieved 이벤트에 대한 언급이 있지만, 실제 A/B 테스트 집계 패턴은 제시되어 있지 않습니다.
FeatureResolved 이벤트는 피처의 값이 처음으로 해결되었을 때만 발화합니다. 이것을 사용하여 사용자의 배리언트 할당을 기록합니다.
FeatureResolved와 FeatureRetrieved의 차이: FeatureResolved는 초회 평가 시에만 발화, FeatureRetrieved는 매 체크마다 발화합니다. 할당 기록에는 FeatureResolved, 페이지 뷰 추적에는 FeatureRetrieved가 적합합니다.큐잉된 잡에서의 스코프
큐의 잡에서는 인증된 사용자가 존재하지 않으므로, 피처 체크가 예상과 다른 동작을 할 수 있습니다. 잡에 스코프를 명시적으로 가지게 하세요.Artisan 명령에 의한 관리 UI
플래그를 관리하는 간단한 Artisan 명령을 만들면, 배포 없이 프로덕션 플래그를 조작할 수 있습니다.피처 이름의 안전한 리팩토링 (Name 어트리뷰트)
클래스 기반 피처를 리네임할 때, DB에 저장된 플래그 이름이 바뀌면 모든 사용자의 플래그가 리셋되어 버립니다. Name 어트리뷰트로 저장 이름을 고정합시다.
정리
공식 문서의 기본을 다졌다면, 이하의 패턴으로 Pennant의 진가가 발휘됩니다.Laravel Pennant 가이드
설치부터 기본 사용법까지는 가이드 페이지를 참고하세요.