공통 메뉴 관리와 프로비저닝 전 프리뷰 설계
설계 원칙
Portal Foundation은 모든 포탈에 같은 프레임·테마·반응형 메뉴 동작을 제공하지만, 메뉴의 실제 업무 의미는 포탈마다 다르다. 따라서 메뉴 관리 기능은 공통 UI 패키지로 제공하고, 메뉴 데이터의 소유·운영은 각 포탈이 담당한다. DirectoryService는 신규 생성 시 기본 메뉴 Seed와 프리뷰를 제공할 수 있지만, 생성 이후 포탈별 메뉴의 일상 변경을 중앙에서 강제하지 않는다. 1
공통으로 제공하는 것: 메뉴 모델, 메뉴 프레임 렌더링, 메뉴 관리 화면, 접근성·테마·권한 평가 계약.
포탈별로 관리하는 것: 메뉴명, 경로, 아이콘, 순서, 그룹, 노출 권한, 활성 상태, 외부 링크와 실제 도메인 기능 연결.
공통 메뉴 모델
각 포탈은 아래 필드를 포함한 메뉴 항목을 자체 저장소에 보관한다. 공통 UI는 이 모델을 입력으로 받아 좌측 메뉴·모바일 메뉴·현재 위치 표시를 일관되게 렌더링한다.
| 필드 | 설명 | 예시 |
|---|---|---|
id | 포탈 내부의 불변 메뉴 식별자 | menu_process_library |
key | 코드·권한·프리뷰에서 쓰는 안정적인 키 | process-library |
parentId | 메뉴 그룹 또는 상위 메뉴 | group_operations |
type | 링크, 그룹, 외부 링크, 구분선 등 렌더링 방식 | LINK |
label | 현재 언어의 메뉴명 | 프로세스 라이브러리 |
href | 내부 경로 또는 외부 URL | /process-library |
icon | 공통 UI에서 허용한 아이콘 키 | Network |
sortOrder | 같은 수준의 표시 순서 | 20 |
requiredScopes | 표시·접근에 필요한 최소 scope | ["process:read"] |
visibility | 모든 사용자, 로그인 사용자, 관리자 등 노출 정책 | AUTHENTICATED |
enabled | 메뉴 활성 여부 | true |
systemReserved | 삭제가 제한되는 시스템 메뉴 여부 | true 또는 false |
권한은 메뉴를 숨기는 용도로만 사용하지 않는다. 실제 페이지와 API도 동일한 scope를 검증해야 하며, 메뉴 비노출은 보조 UX 수단이다. 2
포탈별 메뉴 관리 화면
새 포탈 템플릿에는 관리자 → 메뉴 관리를 포함한다. 공통 UI 패키지는 아래 컴포넌트와 검증 도구를 제공하고, 개별 포탈은 자신의 메뉴 저장 API에 연결한다.
| 공통 요소 | 역할 |
|---|---|
PortalMenuManagement | 메뉴 목록, 생성·수정·비활성화, 정렬과 권한 편집을 제공한다. |
PortalNavigation | 저장된 메뉴 구성으로 데스크톱 좌측 메뉴와 모바일 메뉴를 렌더링한다. |
validatePortalMenu | 중복 키, 잘못된 경로, 순환 부모 관계, 허용되지 않은 아이콘·scope를 검증한다. |
buildPortalMenuPreview | 저장 전 메뉴 Seed를 포탈 프레임의 프리뷰 모델로 만든다. |
ReservedMenuPolicy | 홈, 프로필, 관리자 등 시스템 메뉴의 수정·삭제 범위를 제어한다. |
포탈은 메뉴를 변경할 때 사용자·그룹·권한 정책과 함께 감사 기록을 남긴다. systemReserved 메뉴는 이름·아이콘·순서는 조정할 수 있어도 중앙 로그인, 프로필, 관리자 진입에 필요한 최소 경로를 무단 삭제하지 못하도록 정책을 둔다.
신규 포탈 생성 전 프리뷰
DirectoryService의 신규 포탈 생성 흐름은 실제 외부 리소스를 만들기 전에 다음 두 단계를 둔다.
| 단계 | 운영자가 확인·조정하는 내용 | 외부 리소스 생성 여부 |
|---|---|---|
| 설정 입력 | 포탈 식별자, 표시명, 배포 공급자, URL, 설명, 온프레미스 배포 라벨 | 생성하지 않음 |
| 프레임·메뉴 프리뷰 | 라이트·다크 테마의 포탈 프레임, 로고 자리, 기본 메뉴 Seed, 관리자 메뉴, 동기화·사전·권한 적용 배지 | 생성하지 않음 |
| 생성 확인 | 최종 입력값과 자동 설정·보안 경계 확인 | 확인 후에만 생성 |
| 프로비저닝 결과 | 저장소·배포 대상·연동 상태, 일회성 Key·온프레미스 전달 안내 | 생성됨 |
프리뷰는 실제 포탈 소스나 배포 환경을 만들지 않는 순수한 클라이언트 모델이어야 한다. 그 결과는 portalId, 선택한 테마, 브랜드 기본값, 메뉴 Seed, 예상 권한 배지로 구성하고, 비밀값·API Key·인프라 토큰은 프리뷰에 포함하지 않는다. 프리뷰에서 저장한 메뉴 Seed는 생성 요청의 검증 가능한 일부가 되며, 템플릿의 포탈별 메뉴 데이터로 전달한다.
최소 기본 메뉴 Seed
공통 템플릿은 업무 도메인을 가정하지 않는 아래 최소 메뉴만 제공한다. 각 포탈 관리자는 생성 후 메뉴 관리에서 새 업무 메뉴를 추가하거나 필요 없는 초기 메뉴를 비활성화한다.
| 키 | 기본 표시명 | 경로 | 정책 |
|---|---|---|---|
home | 홈 | / | 시스템 예약, 활성 상태 유지 |
workspace | 업무 공간 | /workspace | 일반 사용자용 빈 상태·확장 시작점 |
admin | 관리자 | /admin | 관리자에게만 노출, 시스템 예약 |
profile | 내 정보 | /profile | 로그인 사용자에게 노출, 시스템 예약 |
기존 포탈의 구체적인 메뉴, 예를 들어 프로세스센터의 프로세스 라이브러리와 전결규정은 이 기본 Seed가 아니라 해당 포탈의 메뉴 관리 데이터로 유지한다. 공통 UI는 그 메뉴를 동일한 프레임과 상호작용 규칙으로 표현한다.
구현 순서
@hohyun94/portal-foundation에 메뉴 타입·검증기·프레임 렌더러·관리 UI 컴포넌트를 추가한다.- 새 포탈 템플릿에 메뉴 저장 스키마·관리 API·관리자 라우트를 추가한다.
- DirectoryService 프로비저닝 요청에 검증된
menuSeed와 프리뷰 설정을 포함하고, 템플릿 초기화 단계에서 이를 적용한다. - DirectoryService 신규 포탈 생성 화면에 프레임·메뉴 프리뷰와 명시적 생성 확인 단계를 추가한다.
- 포탈 프레임, 권한·접근성, 모바일 메뉴, 메뉴 변경 감사 이력을 계약·브라우저 테스트로 검증한다.