Files
sam-docs/dev/changes/20251111_admin_users_improvement.md
권혁성 db63fcff85 refactor: [docs] 팀별 폴더 구조 재편 (공유/개발/프론트/기획)
- 개발팀 전용 폴더 dev/ 생성 (standards, guides, quickstart, changes, deploys, data, history, dev_plans 이동)
- 프론트엔드 전용 폴더 frontend/ 생성 (api/ → frontend/api-specs/)
- 기획팀 폴더 requests/ 생성
- plans/ → dev/dev_plans/ 이름 변경
- README.md 신규 (사람용 안내), INDEX.md 재작성 (Claude Code용)
- resources.md 신규 (노션 링크용, assets/brochure 이관 예정)
- CURRENT_WORKS.md 삭제, TODO.md → dev/ 이동
- 전체 참조 경로 업데이트

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-05 16:46:03 +09:00

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개):

  1. admin/app/Models/Members/User.php - departments, primaryDepartment 관계 추가
  2. admin/app/Filament/Resources/Users/Tables/UsersTable.php - 컬럼 4개, 필터 3개 추가
  3. admin/app/Filament/Resources/Users/Pages/ViewUser.php - Infolist 4개 섹션 구현
  4. admin/app/Filament/Resources/Users/UserResource.php - RelationManager 3개 등록
  5. 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\InfolistFilament\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.php
  • PermissionsRelationManager.php
  • DepartmentsRelationManager.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)
  • 필터 동작 확인 (테넌트, 역할, 부서)

⚠️ 배포 시 주의사항

  1. DB 마이그레이션 불필요: 기존 테이블 활용, 스키마 변경 없음
  2. Shared 모델 수정: Members/User.php는 api 프로젝트에서도 사용되므로 영향 확인 필요
  3. Spatie Permission 가드: User 모델의 guard_name = 'api' 설정 유지 필요
  4. 동적 필드 (Phase 2): setting_field_defs, tenant_field_settings 기반 동적 필드는 추후 구현

🔗 관련 문서


📊 작업 통계

  • 수정된 파일: 5개
  • 신규 파일: 3개
  • 총 변경 라인 수: 약 350줄
  • 작업 시간: 약 1시간
  • 검증 완료: 문법, 로직, 보안, 성능

🚀 다음 단계

Phase 2: 동적 필드 시스템 구현

  • Admin 기본 필드 관리 (setting_field_defs)
  • Tenant 오버로드 필드 (tenant_field_settings)
  • ViewUser Infolist에 동적 필드 섹션 추가

Phase 3: 기타 운영 관리 페이지

  • 테넌트 관리 페이지 개선
  • 역할 & 권한 관리 페이지
  • 부서 관리 페이지 (계층 구조 트리 뷰)