왜 Filament인가?
이 문서는 검토 중입니다. 내용이 변경될 수 있습니다.
Multi-SaaS Kit이 관리자 패널 프레임워크로 Filament v4를 선택한 이유를 설명합니다.
핵심 선택 이유
Multi-SaaS Kit은 **권한 시스템 (Level 0~6, ADR-058)**을 구현해야 합니다. 각 계층(Platform, SaaS, Tenant, Organization, Workspace, Team, Member)마다 별도의 관리 패널이 필요하며, 이를 효율적으로 구축하려면 다중 패널 네이티브 지원이 필수입니다.
| 요구사항 | Filament 지원 |
|---|---|
| 다중 패널 (7개+) | ✅ 네이티브 지원 |
| 라이선스 비용 | ✅ 무료 (MIT) |
| Laravel 통합 | ✅ 공식 Laravel 패키지 |
| 멀티테넌시 | ✅ Stancl/Tenancy 호환 |
| 커스터마이징 | ✅ 높은 유연성 |
Admin Panel 프레임워크 비교
Laravel 생태계에서 가장 인기 있는 Admin Panel 프레임워크를 비교합니다.
상세 비교표
| 기준 | Filament v4 | Laravel Nova | Backpack |
|---|---|---|---|
| 가격 | 무료 (MIT) | $99/site | $69/project |
| 다중 패널 | ✅ 네이티브 | ⚠️ 제한적 | ⚠️ 제한적 |
| 커스터마이징 | ⭐⭐⭐⭐⭐ | ⭐⭐⭐ | ⭐⭐⭐⭐ |
| 프론트엔드 | Livewire + Alpine.js | Vue.js | Blade/jQuery |
| Laravel 통합 | 완벽 | 완벽 (공식) | 좋음 |
| 멀티테넌시 | 우수 | 보통 | 보통 |
| 성능 | 빠름 (SPA 모드) | 빠름 | 보통 |
| 학습 곡선 | 보통 | 낮음 | 낮음 |
| 커뮤니티 | 매우 활발 | 활발 | 활발 |
| 문서화 | 우수 | 우수 | 좋음 |
왜 Filament이 최선인가?
1. 무료 + 강력한 기능
Nova는 사이트당 $99, Backpack은 프로젝트당 $69입니다. Multi-SaaS Kit처럼 여러 고객 프로젝트를 지원하는 플랫폼에서는 라이선스 비용이 급격히 증가합니다.
# 10개 프로젝트 운영 시 비용
Nova: $99 × 10 = $990
Backpack: $69 × 10 = $690
Filament: $0
Filament은 무료이면서도 Nova, Backpack과 동등하거나 더 나은 기능을 제공합니다.
2. 다중 패널 네이티브 지원
Multi-SaaS Kit의 핵심 요구사항인 Level 0~6 계층 패널을 자연스럽게 구현할 수 있습니다.
// app/Providers/Filament/PlatformPanelProvider.php
class PlatformPanelProvider extends PanelProvider
{
public function panel(Panel $panel): Panel
{
return $panel
->id('platform')
->path('platform')
->colors(['primary' => Color::Indigo])
->discoverResources(in: app_path('Filament/Platform/Resources'))
->discoverPages(in: app_path('Filament/Platform/Pages'));
}
}
// app/Providers/Filament/TenantPanelProvider.php
class TenantPanelProvider extends PanelProvider
{
public function panel(Panel $panel): Panel
{
return $panel
->id('tenant')
->path('tenant')
->tenant(Tenant::class) // 멀티테넌시 자동 적용
->colors(['primary' => Color::Emerald]);
}
}
Nova나 Backpack에서는 다중 패널 구현에 상당한 커스텀 작업이 필요합니다.
3. Livewire 기반 반응형 UI
Filament은 Livewire 3와 Alpine.js를 사용하여 SPA와 유사한 반응형 경험을 제공합니다.
| 특징 | 효과 |
|---|---|
| 실시간 업데이트 | 페이지 새로고침 없이 데이터 반영 |
| 폼 유효성 검사 | 입력 즉시 유효성 검사 |
| 무한 스크롤 | 대용량 데이터 효율적 표시 |
| 모달/슬라이드오버 | 부드러운 UI 전환 |
4. Stancl/Tenancy 호환성
Multi-SaaS Kit의 멀티테넌시 솔루션인 Stancl/Tenancy v4와 완벽히 호환됩니다.
// Filament 패널에서 테넌트 자동 적용
->tenant(Tenant::class)
->tenantRoutePrefix('{tenant}')
->tenantMiddleware([
InitializeTenancyByDomain::class,
])
Filament v4의 새로운 기능
Multi-SaaS Kit은 최신 Filament v4를 채택했습니다.
v3 → v4 주요 개선
| 기능 | v3 | v4 |
|---|---|---|
| 성능 | 기본 | 50% 향상 |
| SPA 모드 | 제한적 | 완전 지원 |
| Clusters | 없음 | ✅ 리소스 그룹화 |
| Unsaved Changes | 없음 | ✅ 자동 감지 |
| Asset Bundling | Vite 분리 | 통합 |
Clusters (리소스 그룹화)
v4의 Clusters 기능으로 관련 리소스를 논리적으로 그룹화할 수 있습니다.
// 사용자 관리 Cluster
class UserManagement extends Cluster
{
protected static ?string $navigationIcon = 'heroicon-o-users';
public static function getNavigationLabel(): string
{
return '사용자 관리';
}
}
// Cluster에 속하는 리소스
class UserResource extends Resource
{
protected static ?string $cluster = UserManagement::class;
}
class RoleResource extends Resource
{
protected static ?string $cluster = UserManagement::class;
}
권한 시스템 (Level 0~6, ADR-058)에서 각 계층별로 리소스를 그룹화하여 관리 UI를 체계화할 수 있습니다.
Multi-SaaS Kit에서의 Filament 활용
Level 0~6 계층 패널 구성
| 계층 | 패널 경로 | 용도 |
|---|---|---|
| Platform | /platform | 전체 플랫폼 관리 |
| SaaS | /saas | SaaS 서비스 관리 |
| Tenant | /tenant | 테넌트 관리 |
| Organization | /org | 조직 관리 |
| Workspace | /workspace | 워크스페이스 관리 |
| Team | /team | 팀 관리 |
| Member | /member | 개인 설정 |
권한 기반 네비게이션
각 패널에서 사용자 권한에 따라 메뉴가 동적으로 표시됩니다.
NavigationItem::make('사용자 관리')
->icon('heroicon-o-users')
->visible(fn (): bool => auth()->user()->can('manage-users'))
->url(fn (): string => UserResource::getUrl());
테넌트별 커스터마이징
Filament의 테넌트 기능으로 각 테넌트마다 다른 테마와 로고를 적용할 수 있습니다.
->colors([
'primary' => fn () => tenant()->primary_color ?? Color::Blue,
])
->brandLogo(fn () => tenant()->logo_url ?? asset('logo.png'))
->favicon(fn () => tenant()->favicon_url ?? asset('favicon.ico'))
커스터마이징 예시
커스텀 위젯
대시보드에 테넌트별 통계를 표시하는 위젯 예시:
class TenantStatsWidget extends Widget
{
protected static string $view = 'filament.widgets.tenant-stats';
protected function getStats(): array
{
return [
Stat::make('총 사용자', tenant()->users()->count())
->icon('heroicon-o-users')
->color('success'),
Stat::make('활성 구독', tenant()->activeSubscriptions()->count())
->icon('heroicon-o-credit-card')
->color('primary'),
];
}
}
커스텀 페이지
Filament 패널 내에 커스텀 페이지를 추가할 수 있습니다.
class TenantSettings extends Page
{
protected static ?string $navigationIcon = 'heroicon-o-cog';
protected static string $view = 'filament.pages.tenant-settings';
public function getTitle(): string
{
return '테넌트 설정';
}
}
커스텀 액션
테이블과 폼에 커스텀 액션을 추가할 수 있습니다.
// 일괄 상태 변경 액션
BulkAction::make('activate')
->label('활성화')
->icon('heroicon-o-check')
->action(fn (Collection $records) => $records->each->activate())
->requiresConfirmation()
->deselectRecordsAfterCompletion();