배포를 두려워하지 마세요: Laravel Pennant의 Feature Flags
Source: Dev.to

병합 충돌 악몽
전통적인 Git 워크플로우에서는 B2B SaaS 플랫폼을 위한 대규모 새로운 기능을 개발할 때, 개발자들이 수 주 동안 별도의 장기 feature branch에서 작업합니다. 기능이 준비될 무렵이면 메인 프로덕션 브랜치는 완전히 달라져 있습니다. 몇 주 된 브랜치를 병합하면 치명적인 병합 충돌, 깨진 테스트, 그리고 막대한 배포 불안이 발생합니다. Smart Tech Devs에서는 Trunk‑Based Development를 실천함으로써 이를 완전히 피합니다.
Trunk‑based development는 개발자들이 코드를 매일 메인 브랜치에 병합한다는 의미이며, 기능이 완성되지 않았더라도 마찬가지입니다. 아직 완성되지 않은 코드를 사용자에게 영향을 주지 않으면서 프로덕션에 배포하려면 어떻게 할까요? 우리는 Feature Flags를 사용합니다.
Laravel Pennant 등장
Feature flag는 데이터베이스나 Redis 캐시에 저장되는 동적 불리언 토글입니다. 새로운 코드를 감싸서 일반 사용자에게는 숨기고, 특정 내부 개발자나 베타 테스터에게만 노출합니다. Laravel은 이를 위한 아름답고 공식적인 패키지 Laravel Pennant를 제공합니다.
단계 1: 기능 정의하기
먼저 서비스 프로바이더에서 기능 플래그를 정의합니다. 예를 들어, 새로운 무거운 AI Analytics 대시보드를 만든다고 가정해 보겠습니다.
namespace App\Providers;
use App\Models\User;
use Illuminate\Support\ServiceProvider;
use Laravel\Pennant\Feature;
class AppServiceProvider extends ServiceProvider
{
public function boot(): void
{
// 플래그 정의: 'admin' 역할을 가진 사용자이거나,
// 베타 프로그램에 참여 중인 특정 테넌트만 새로운 AI 대시보드를 볼 수 있음
Feature::define('ai-analytics-v2', function (User $user) {
return $user->role === 'admin' || $user->tenant->in_beta_program;
});
}
}
단계 2: UI와 로직 제어하기
이제 반쯤 완성된 AI 대시보드 코드를 안전하게 프로덕션에 배포할 수 있습니다. Blade 템플릿(또는 API 응답)에서 UI 링크를 감싸면 전체 사용자의 99 %는 이를 전혀 보지 못합니다.
// Inside a Laravel Controller
public function index(Request $request)
{
// 플래그가 현재 사용자에게 활성화된 경우에만 코드가 실행됨
if (Feature::active('ai-analytics-v2')) {
return view('dashboard.ai-v2');
}
// 기존 안정적인 프로덕션 대시보드로 대체
return view('dashboard.v1');
}
엔지니어링 ROI
Feature flag를 도입하면 배포와 릴리즈가 완전히 분리됩니다. 하루에 열 번 코드를 배포해도 일반 사용자에게는 새로운 기능이 공개되지 않습니다. 새로운 기능이 치명적인 버그를 일으키면 스트레스가 많은 Git revert와 재배포를 할 필요 없이 데이터베이스 토글을 false로 전환하면 기능이 1밀리초 안에 사라집니다. 이는 확장 가능한 SaaS 팀을 위한 궁극적인 안전망입니다.