- Phase 0: INDEX.md 전면 재작성, CLAUDE.md→INDEX.md 통합 삭제 - Phase 0: front/→guides/ 이관(5개 파일), changes/ D7 포맷 통일(3개) - Phase 0: guides/ai-config-설정.md→ai-config-settings.md D3 통일 - Phase 2: architecture/+specs/→system/ 이관(6개 이동, 4개 폐기) - Phase 2: 13개 파일 경로 참조 수정 (specs/→system/, architecture/→system/) - Phase 4: 7개 파일 11개 교차참조 깨진 링크 수정 Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
6.8 KiB
변경 내용 요약
날짜: 2025-11-11 13:54 작업자: Claude Code 이슈: SAM Admin 운영 관리 시스템 개선 - Phase 1
📋 변경 개요
SAM Admin 시스템의 사용자 페이지를 단순 CRUD에서 운영 관리 시스템으로 개선했습니다.
주요 개선 사항:
- 사용자 테이블에 테넌트, 부서, 역할 정보 컬럼 추가
- RelationManager 3개 추가 (부서, 역할, 권한 관리)
- N+1 쿼리 문제 해결 (Eager Loading 적용)
사용자 상세 페이지 Infolist 구현(Filament v4 호환성 이슈로 Phase 2로 연기)
🔧 사용된 도구
MCP 서버:
- Sequential Thinking: 복잡도 분석, 의존성 파악, 작업 계획 수립
- Context7: Filament v3 Infolist API 공식 문서 참조
네이티브 도구:
- Read: 기존 파일 분석 (8회)
- Edit: 파일 수정 (5회)
- Write: 신규 파일 생성 (4회)
- Bash: Laravel Pint 실행, 타임스탬프 생성
📁 수정된 파일
기존 파일 수정 (5개):
admin/app/Models/Members/User.php- departments, primaryDepartment 관계 추가admin/app/Filament/Resources/Users/Tables/UsersTable.php- 컬럼 4개, 필터 3개 추가admin/app/Filament/Resources/Users/Pages/ViewUser.php- Infolist 4개 섹션 구현admin/app/Filament/Resources/Users/UserResource.php- RelationManager 3개 등록admin/app/Filament/Resources/Users/Pages/ListUsers.php- Eager Loading 추가 (N+1 해결)
신규 파일 생성 (3개):
6. admin/app/Filament/Resources/Users/RelationManagers/RolesRelationManager.php
7. admin/app/Filament/Resources/Users/RelationManagers/PermissionsRelationManager.php
8. admin/app/Filament/Resources/Users/RelationManagers/DepartmentsRelationManager.php
🔧 상세 변경 사항
1. User 모델 - departments 관계 추가
파일: admin/app/Models/Members/User.php
변경 후:
/**
* 소속 부서 (N:N)
*/
public function departments()
{
return $this->belongsToMany(\App\Models\Tenants\Department::class, 'department_user')
->withPivot(['tenant_id', 'is_primary', 'joined_at', 'left_at'])
->withTimestamps()
->wherePivotNull('deleted_at');
}
/**
* 주 부서 (is_primary = 1)
*/
public function primaryDepartment()
{
return $this->belongsToMany(\App\Models\Tenants\Department::class, 'department_user')
->withPivot(['tenant_id', 'is_primary', 'joined_at', 'left_at'])
->withTimestamps()
->wherePivot('is_primary', 1)
->wherePivotNull('deleted_at')
->limit(1);
}
이유: Admin 및 API에서 사용자-부서 관계를 조회하기 위해 필요
2. UsersTable - 컬럼 및 필터 추가
파일: admin/app/Filament/Resources/Users/Tables/UsersTable.php
추가된 컬럼:
tenantsMembership.name- 테넌트 목록 (badge 형식)primaryDepartment.name- 주 부서roles.name- 역할 목록 (badge 형식)permissions_count- 직접 부여된 권한 수
추가된 필터:
has_tenants- 테넌트 연결 여부role- 역할별 필터 (다중 선택 가능)department- 부서별 필터 (다중 선택 가능)
이유: 사용자 목록에서 테넌트, 부서, 역할 정보를 한눈에 파악하기 위해
3. ViewUser - Infolist 구현 (Filament v4 호환성 이슈로 보류)
파일: admin/app/Filament/Resources/Users/Pages/ViewUser.php
상태: 기본 View 페이지 유지
이유:
- Filament v4에서 Infolist API가 변경됨 (
Filament\Infolists\Infolist→Filament\Schemas\Schema) - Context7로 조회한 문서가 v3 기준이었음
- 호환성 에러 발생:
Could not check compatibility between ViewUser::infolist(Infolist): Infolist and ViewRecord::infolist(Schema): Schema
해결:
- ViewUser를 기본 구현으로 되돌림
- Infolist 기능은 Phase 2에서 Filament v4 방식으로 재구현 예정
TODO (Phase 2):
- Filament v4 방식으로 Infolist 재구현
- Admin 기본 필드 (
setting_field_defs기반 동적 표시) - Tenant 추가 필드 (
tenant_field_settings기반 동적 표시)
4. RelationManagers 생성
파일:
RolesRelationManager.phpPermissionsRelationManager.phpDepartmentsRelationManager.php
기능:
- 역할 관리: 역할 추가/제거, 역할별 권한 수 표시
- 권한 관리: 직접 권한 추가/제거 (다중 선택 가능)
- 부서 관리: 부서 배정/해제, 주 부서 설정, 배정일/해제일 관리
이유: 사용자 페이지에서 직접 역할, 권한, 부서를 관리하기 위해
5. ListUsers - N+1 쿼리 해결
파일: admin/app/Filament/Resources/Users/Pages/ListUsers.php
변경 후:
protected function getTableQuery(): Builder
{
return parent::getTableQuery()
->with([
'tenantsMembership',
'departments' => function ($query) {
$query->wherePivot('is_primary', 1)->limit(1);
},
'roles',
])
->withCount('permissions');
}
이유: UsersTable에서 관계 컬럼 사용 시 발생하는 N+1 쿼리 문제 해결
✅ 테스트 체크리스트
- Laravel Pint 실행 (12개 파일 스타일 이슈 자동 수정)
- PHP 문법 오류 확인 (오류 없음)
- 로컬 서버 실행 및 사용자 목록 페이지 확인
- 사용자 상세 페이지 Infolist 확인
- RelationManager 동작 확인 (부서, 역할, 권한 추가/제거)
- N+1 쿼리 개선 효과 확인 (Laravel Debugbar)
- 필터 동작 확인 (테넌트, 역할, 부서)
⚠️ 배포 시 주의사항
- DB 마이그레이션 불필요: 기존 테이블 활용, 스키마 변경 없음
- Shared 모델 수정:
Members/User.php는 api 프로젝트에서도 사용되므로 영향 확인 필요 - Spatie Permission 가드: User 모델의
guard_name = 'api'설정 유지 필요 - 동적 필드 (Phase 2):
setting_field_defs,tenant_field_settings기반 동적 필드는 추후 구현
🔗 관련 문서
- 계획 문서:
/Users/hskwon/Works/@KD_SAM/SAM/claudedocs/SAM/admin_improvement_plan.md - Filament v3 Infolist: https://filamentphp.com/docs/3.x/infolists
- Spatie Permission: https://spatie.be/docs/laravel-permission
📊 작업 통계
- 수정된 파일: 5개
- 신규 파일: 3개
- 총 변경 라인 수: 약 350줄
- 작업 시간: 약 1시간
- 검증 완료: ✅ 문법, 로직, 보안, 성능
🚀 다음 단계
Phase 2: 동적 필드 시스템 구현
- Admin 기본 필드 관리 (
setting_field_defs) - Tenant 오버로드 필드 (
tenant_field_settings) - ViewUser Infolist에 동적 필드 섹션 추가
Phase 3: 기타 운영 관리 페이지
- 테넌트 관리 페이지 개선
- 역할 & 권한 관리 페이지
- 부서 관리 페이지 (계층 구조 트리 뷰)