9.0 KiB
9.0 KiB
메뉴 회사별 필터링 개선 완료
📋 개요
문제점: SUPER_ADMIN이 좌측 사이드바에서 모든 회사의 메뉴를 보게 되어 혼란스러움
해결책:
- 좌측 사이드바: 모든 사용자(SUPER_ADMIN 포함)가 공통 메뉴만 표시
- 메뉴 관리 화면: SUPER_ADMIN만 전체 메뉴 관리 가능
🎯 개선 내용
핵심 차이점
| 화면 유형 | SUPER_ADMIN | COMPANY_ADMIN | 일반 사용자 |
|---|---|---|---|
| 좌측 사이드바 | 공통 메뉴만 ✅ | 공통 메뉴만 ✅ | 공통 메뉴만 ✅ |
| 메뉴 관리 화면 | 전체 메뉴 ✅ | 자기 회사 메뉴 ✅ | 접근 불가 ❌ |
1. 좌측 사이드바 (menuType=0 또는 menuType=1)
모든 사용자: 공통 메뉴만 표시 (company_code IS NULL)
-- 모든 사용자 공통
WHERE STATUS = 'active'
AND MENU.COMPANY_CODE IS NULL -- 공통 메뉴만
이유:
- SUPER_ADMIN도 일반 업무 시에는 공통 메뉴만 사용
- 다른 회사 메뉴가 섞여 보이면 혼란스러움
- 메뉴 관리는 별도 화면에서 수행
2. 메뉴 관리 화면 (menuType=undefined)
SUPER_ADMIN
- 모든 회사의 메뉴 표시 및 관리 가능
WHERE STATUS = 'active' -- 필터 없음
COMPANY_ADMIN
- 자기 회사 메뉴 + 공통 메뉴 표시 및 관리
WHERE STATUS = 'active'
AND (MENU.COMPANY_CODE = '사용자회사코드' OR MENU.COMPANY_CODE IS NULL)
🔧 수정된 코드
adminService.ts - getAdminMenuList()
// 좌측 사이드바 관리자 메뉴는 모든 사용자가 공통 메뉴만 표시
// SUPER_ADMIN도 좌측 사이드바에서는 공통 메뉴만 보임
// 메뉴 관리 화면(menuType 없음)에서만 전체 메뉴 조회
if (menuType === undefined) {
// 메뉴 관리 화면: SUPER_ADMIN은 전체, 나머지는 자기 회사만
if (userType === "SUPER_ADMIN" && userCompanyCode === "*") {
logger.info("✅ 메뉴 관리 화면 (SUPER_ADMIN): 모든 메뉴 표시");
companyFilter = "";
} else {
logger.info(
`✅ 메뉴 관리 화면: 회사 ${userCompanyCode} 메뉴 + 공통 메뉴 표시`
);
companyFilter = `AND (MENU.COMPANY_CODE = $${paramIndex} OR MENU.COMPANY_CODE IS NULL)`;
queryParams.push(userCompanyCode);
paramIndex++;
}
} else {
// 좌측 사이드바: 모든 사용자가 공통 메뉴만
logger.info("✅ 좌측 사이드바 (관리자): 공통 메뉴만 표시");
companyFilter = `AND MENU.COMPANY_CODE IS NULL`;
}
adminService.ts - getUserMenuList()
// 좌측 사이드바 메뉴는 모든 사용자가 공통 메뉴만 표시
// (SUPER_ADMIN도 좌측 사이드바에서는 공통 메뉴만 보임)
// 메뉴 관리 화면에서는 별도로 전체 메뉴 조회
// 모든 사용자: 공통 메뉴만 (company_code IS NULL)
companyFilter = `AND MENU.COMPANY_CODE IS NULL`;
logger.info("✅ 좌측 사이드바: 공통 메뉴만 표시");
🧪 테스트 시나리오
시나리오 1: SUPER_ADMIN 로그인
좌측 사이드바
# ✅ 공통 메뉴만 표시
- 공통 대시보드
- 공통 설정
- 공통 보고서
# ❌ 표시되지 않음
- ILSHIN 전용 메뉴
- VEXPLOR 전용 메뉴
메뉴 관리 화면 (/admin/menus)
# ✅ 모든 회사 메뉴 표시
- ILSHIN 전용 메뉴 (company_code='ILSHIN')
- VEXPLOR 전용 메뉴 (company_code='VEXPLOR')
- 공통 메뉴 (company_code IS NULL)
시나리오 2: COMPANY_ADMIN (ILSHIN) 로그인
좌측 사이드바
# ✅ 공통 메뉴만 표시
- 공통 대시보드
- 공통 설정
- 공통 보고서
# ❌ 표시되지 않음
- ILSHIN 전용 메뉴
메뉴 관리 화면 (/admin/menus)
# ✅ ILSHIN 메뉴 + 공통 메뉴 표시
- ILSHIN 전용 메뉴 (company_code='ILSHIN')
- 공통 메뉴 (company_code IS NULL)
# ❌ 표시되지 않음
- VEXPLOR 전용 메뉴
시나리오 3: 일반 사용자 로그인
좌측 사이드바
# ✅ 공통 메뉴만 표시
- 공통 대시보드
- 공통 설정
- 공통 보고서
메뉴 관리 화면
# ❌ 접근 불가 (권한 없음)
📝 로그 확인
좌측 사이드바 접근 시
# 관리자 메뉴 (menuType=0)
✅ 좌측 사이드바 (관리자): 공통 메뉴만 표시
# 사용자 메뉴 (menuType=1)
✅ 좌측 사이드바: 공통 메뉴만 표시
메뉴 관리 화면 접근 시
# SUPER_ADMIN
✅ 메뉴 관리 화면 (SUPER_ADMIN): 모든 메뉴 표시
# COMPANY_ADMIN
✅ 메뉴 관리 화면: 회사 ILSHIN 메뉴 + 공통 메뉴 표시
📊 API 응답 예시
좌측 사이드바 (모든 사용자 동일)
// GET /api/admin/menus?menuType=1
{
"success": true,
"data": [
{
"objid": "1",
"menu_name_kor": "공통 대시보드",
"company_code": null // ✅ 공통 메뉴만
},
{
"objid": "2",
"menu_name_kor": "공통 설정",
"company_code": null // ✅ 공통 메뉴만
}
]
}
메뉴 관리 화면 (SUPER_ADMIN)
// GET /api/admin/menus (menuType 없음)
{
"success": true,
"data": [
{ "menu_name_kor": "ILSHIN 메뉴", "company_code": "ILSHIN" }, // ✅ 전체
{ "menu_name_kor": "VEXPLOR 메뉴", "company_code": "VEXPLOR" }, // ✅ 전체
{ "menu_name_kor": "공통 메뉴", "company_code": null } // ✅ 전체
]
}
메뉴 관리 화면 (COMPANY_ADMIN, ILSHIN)
// GET /api/admin/menus (menuType 없음)
{
"success": true,
"data": [
{ "menu_name_kor": "ILSHIN 메뉴", "company_code": "ILSHIN" }, // ✅ 자기 회사
{ "menu_name_kor": "공통 메뉴", "company_code": null } // ✅ 공통
// ❌ VEXPLOR 메뉴 없음
]
}
🎨 사용자 경험 개선
Before (문제점)
SUPER_ADMIN 로그인
└─ 좌측 사이드바
├─ ILSHIN 대시보드 ← 혼란스러움
├─ ILSHIN 보고서 ← 혼란스러움
├─ VEXPLOR 대시보드 ← 혼란스러움
├─ VEXPLOR 보고서 ← 혼란스러움
└─ 공통 설정
After (개선)
SUPER_ADMIN 로그인
└─ 좌측 사이드바
├─ 공통 대시보드 ← 깔끔함
├─ 공통 설정 ← 깔끔함
└─ 공통 보고서 ← 깔끔함
└─ 메뉴 관리 화면 (/admin/menus)
├─ ILSHIN 대시보드 ← 관리 목적
├─ ILSHIN 보고서 ← 관리 목적
├─ VEXPLOR 대시보드 ← 관리 목적
├─ VEXPLOR 보고서 ← 관리 목적
└─ 공통 설정
✅ 완료 체크리스트
- getAdminMenuList() 수정 (menuType 조건 분기)
- getUserMenuList() 수정 (공통 메뉴만 필터링)
- 로그 메시지 개선
- 린트 에러 해결
- 문서 작성
- 실제 테스트
- SUPER_ADMIN - 좌측 사이드바
- SUPER_ADMIN - 메뉴 관리 화면
- COMPANY_ADMIN - 좌측 사이드바
- COMPANY_ADMIN - 메뉴 관리 화면
🚨 주의사항
공통 메뉴 (company_code IS NULL)
- 모든 회사에서 공통으로 사용하는 메뉴
- 예: 대시보드, 설정, 공지사항 등
- 반드시
company_code를NULL로 설정해야 좌측 사이드바에 표시됨
회사 전용 메뉴
- 특정 회사에서만 사용하는 메뉴
company_code에 회사 코드 지정 (예:ILSHIN,VEXPLOR)- 좌측 사이드바에는 표시되지 않음
- 메뉴 관리 화면에서만 표시됨
🔮 향후 개선 사항
1. 회사 전환 기능
SUPER_ADMIN이 특정 회사 컨텍스트로 전환하여 해당 회사 메뉴를 볼 수 있는 기능:
// 헤더에 회사 선택 드롭다운
<Select value={currentCompany} onChange={switchCompany}>
<option value="*">전체 (관리자 모드)</option>
<option value="ILSHIN">ILSHIN</option>
<option value="VEXPLOR">VEXPLOR</option>
</Select>
2. 메뉴 타입 추가
- 공통 메뉴 (company_code IS NULL)
- 회사 전용 메뉴 (company_code 지정)
- 부서 전용 메뉴 (향후 추가)
3. 동적 메뉴 표시
사용자 권한에 따라 메뉴 항목의 표시 여부 결정:
-- 권한 기반 메뉴 필터링 (향후 개선)
SELECT * FROM get_user_menus_with_permissions('user_id', 'company_code');
🎉 결론
개선 효과
-
사용자 경험 개선
- SUPER_ADMIN도 좌측 사이드바에서 깔끔한 UI 제공
- 다른 회사 메뉴가 섞이지 않아 혼란 방지
-
권한 분리
- 일반 업무: 공통 메뉴만 사용
- 관리 업무: 메뉴 관리 화면에서 전체 메뉴 관리
-
확장성
- 향후 회사별 메뉴 추가 시에도 좌측 사이드바는 깔끔하게 유지
- 메뉴 관리 화면에서만 복잡한 메뉴 구조 관리
문서 작성일: 2025-01-XX
작성자: AI Assistant
버전: 2.0 (개선판)