[UX] #577 align VPD menus with DDS

This commit is contained in:
devmrko
2026-07-01 08:21:42 +09:00
parent be14b4c797
commit 1218ae1719
5 changed files with 28 additions and 39 deletions

View File

@@ -95,15 +95,15 @@ UX-1부터 시작한다. 기존 데이터 모델과 VPD 로직은 바꾸지 않
| 기존 표현 | 제품 표면 표현 | 비고 | | 기존 표현 | 제품 표면 표현 | 비고 |
|---|---|---| |---|---|---|
| VPD Backoffice | VPD 권한 운영 | 상단, 로그인, 브라우저 제목 | | VPD Backoffice | VPD 권한 운영 | 상단, 로그인, 브라우저 제목 |
| 권한 관리 | 접근 정책 | 역할별 데이터 범위 설정 | | 권한 관리 | 접근 규칙 | 역할별 데이터 범위 설정 |
| DB 보호 연결 / VPD 설정 | 보호 상태 | DB 객체 보호 정책의 확인·연결 | | DB 보호 연결 / VPD 설정 | 보호 상태 | DB 객체 보호 정책의 확인·연결 |
| 권한 결과 확인 | 접근 검증 | 검증 세션으로 실제 조회 실행 | | 권한 결과 확인 | 접근 검증 | 검증 세션으로 실제 조회 실행 |
| ORDS 조회 대상 | 조회 대상 | ORDS는 화면 상세에서만 표기 | | ORDS 조회 대상 | 조회 대상 | ORDS는 화면 상세에서만 표기 |
| ORDS 핸들러 | 조회 연동 | 고급 운영 메뉴 | | ORDS 핸들러 | 조회 연동 | 고급 운영 메뉴 |
| 지식 검색 관리 | 지식 검색 | 등록·정책·검색 기능 | | 지식 검색 관리 | 지식자료 관리 | 등록·정책·검색 기능 |
| 별도 Filter 관리 | 고급 접근 조건 | 예외 정책 기능 | | 별도 Filter 관리 | 고급 접근 조건 | 예외 정책 기능 |
| 운영 상태 / 연결 설정 | 운영 현황 / 시스템 설정 | 운영성·연동 설정 기능 | | 운영 상태 / 연결 설정 | 운영 현황 / 시스템 설정 | 운영성·연동 설정 기능 |
상단 메뉴는 `권한 관리 · 데이터 보호 · 접근 검증 · 지식 검색 · 시스템 관리` 순서로 재구성한다. 절차나 구현 방식이 아니라 사용자가 하려는 일을 메뉴명으로 쓴다. 메뉴와 기본 화면에는 `1.`, `2.`, 단계 레일, `01/02` 배지를 두지 않는다. 순서가 실제 입력 제약인 wizard에서만 단계 번호를 사용한다. 상단 메뉴는 DDS와 같은 네 업무 영역인 `권한 관리 · 보호 정책 관리 · 지식자료 관리 · 접근 검증`으로 구성한다. ORDS·MCP·Filter·시스템 설정은 기본 제품 메뉴에서 빼고 관련 화면의 고급 링크에서만 연다. 절차나 구현 방식이 아니라 사용자가 하려는 일을 메뉴명으로 쓴다. 메뉴와 기본 화면에는 `1.`, `2.`, 단계 레일, `01/02` 배지를 두지 않는다. 순서가 실제 입력 제약인 wizard에서만 단계 번호를 사용한다.
기본 페이지는 제목과 현재 설정·주요 행동만 노출한다. VPD/ORDS 처리 원리, 배경 설명, 주의사항은 상단의 공통 `도움말` 버튼을 눌렀을 때만 펼친다. 이 규칙으로 제품 화면이 관리 매뉴얼처럼 보이는 문제를 줄이고, 설정 자체를 전면에 둔다. 기본 페이지는 제목과 현재 설정·주요 행동만 노출한다. VPD/ORDS 처리 원리, 배경 설명, 주의사항은 상단의 공통 `도움말` 버튼을 눌렀을 때만 펼친다. 이 규칙으로 제품 화면이 관리 매뉴얼처럼 보이는 문제를 줄이고, 설정 자체를 전면에 둔다.

View File

@@ -11,7 +11,7 @@
</div> </div>
<div class="dashboard-hero-actions" aria-label="주요 작업"> <div class="dashboard-hero-actions" aria-label="주요 작업">
<a class="btn rw-btn-primary" href="/probe">접근 검증</a> <a class="btn rw-btn-primary" href="/probe">접근 검증</a>
<a class="btn rw-btn-secondary" href="/permissions">접근 정책</a> <a class="btn rw-btn-secondary" href="/permissions">접근 규칙</a>
</div> </div>
<details class="explanation-details dashboard-explanation"> <details class="explanation-details dashboard-explanation">
<summary>도움말</summary> <summary>도움말</summary>
@@ -30,7 +30,7 @@
<h2>주요 작업</h2> <h2>주요 작업</h2>
<div class="dashboard-action-grid"> <div class="dashboard-action-grid">
<a class="dashboard-action" href="/permissions"> <a class="dashboard-action" href="/permissions">
<span><strong>접근 정책</strong><small>역할별 객체·행·컬럼 접근을 설정합니다.</small></span> <span><strong>접근 규칙</strong><small>역할별 객체·행·컬럼 접근을 설정합니다.</small></span>
<span class="dashboard-action-arrow" aria-hidden="true"></span> <span class="dashboard-action-arrow" aria-hidden="true"></span>
</a> </a>
<a class="dashboard-action dashboard-action-emphasis" href="/probe"> <a class="dashboard-action dashboard-action-emphasis" href="/probe">

View File

@@ -18,18 +18,26 @@
<div class="rw-menu-group"> <div class="rw-menu-group">
<button class="rw-menu-trigger" type="button" aria-expanded="false">권한 관리</button> <button class="rw-menu-trigger" type="button" aria-expanded="false">권한 관리</button>
<div class="rw-menu-panel"> <div class="rw-menu-panel">
<a class="nav-link" href="/users">사용자</a> <a class="nav-link" href="/users">사용자 관리</a>
<a class="nav-link" href="/groups">그룹</a> <a class="nav-link" href="/groups">그룹 관리</a>
<a class="nav-link" href="/roles">역할</a> <a class="nav-link" href="/roles">역할 관리</a>
<a class="nav-link" href="/permissions">접근 정책</a> <a class="nav-link" href="/permissions">접근 규칙</a>
<a class="nav-link" href="/effective-matrix">사용자별 접근 확인</a> <a class="nav-link" href="/effective-matrix">권한 현황</a>
</div> </div>
</div> </div>
<div class="rw-menu-group"> <div class="rw-menu-group">
<button class="rw-menu-trigger" type="button" aria-expanded="false">데이터 보호</button> <button class="rw-menu-trigger" type="button" aria-expanded="false">보호 정책 관리</button>
<div class="rw-menu-panel"> <div class="rw-menu-panel">
<a class="nav-link" href="/vpd-policies">보호 상태</a> <a class="nav-link" href="/vpd-policies">보호 상태</a>
<a class="nav-link" href="/objects">조회 대상</a> <a class="nav-link" href="/objects">보호 대상 관리</a>
</div>
</div>
<div class="rw-menu-group">
<button class="rw-menu-trigger" type="button" aria-expanded="false">지식자료 관리</button>
<div class="rw-menu-panel">
<a class="nav-link" href="/vector-knowledge">지식자료 등록 및 검색</a>
<a class="nav-link" href="/mcp-chatbot">대화형 검색</a>
<a class="nav-link" href="/mcp-reasoning">검색 해석</a>
</div> </div>
</div> </div>
<div class="rw-menu-group"> <div class="rw-menu-group">
@@ -37,25 +45,7 @@
<div class="rw-menu-panel"> <div class="rw-menu-panel">
<a class="nav-link" href="/tokens">검증 세션</a> <a class="nav-link" href="/tokens">검증 세션</a>
<a class="nav-link" href="/probe">접근 검증</a> <a class="nav-link" href="/probe">접근 검증</a>
</div> <a class="nav-link" href="/operation-status">검증 현황</a>
</div>
<div class="rw-menu-group">
<button class="rw-menu-trigger" type="button" aria-expanded="false">지식 검색</button>
<div class="rw-menu-panel">
<a class="nav-link" href="/vector-knowledge">지식 검색</a>
<a class="nav-link" href="/mcp-chatbot">대화형 검색</a>
<a class="nav-link" href="/mcp-reasoning">검색 해석</a>
</div>
</div>
<div class="rw-menu-group">
<button class="rw-menu-trigger" type="button" aria-expanded="false">시스템 관리</button>
<div class="rw-menu-panel">
<a class="nav-link" href="/ords-handlers">조회 연동</a>
<a class="nav-link" href="/mcp-sse">MCP 연동</a>
<a class="nav-link" href="/mcp-client-demo">연동 점검</a>
<a class="nav-link" href="/operation-status">운영 현황</a>
<a class="nav-link" href="/vpd-filter-policies">고급 접근 조건</a>
<a class="nav-link" href="/settings">시스템 설정</a>
</div> </div>
</div> </div>
</div> </div>

View File

@@ -1,11 +1,11 @@
<!doctype html> <!doctype html>
<html lang="ko" xmlns:th="http://www.thymeleaf.org"> <html lang="ko" xmlns:th="http://www.thymeleaf.org">
<head th:replace="~{fragments/layout :: head('접근 정책')}"></head> <head th:replace="~{fragments/layout :: head('접근 규칙')}"></head>
<body> <body>
<nav th:replace="~{fragments/layout :: nav}"></nav> <nav th:replace="~{fragments/layout :: nav}"></nav>
<main class="container py-4"> <main class="container py-4">
<div class="page-title"> <div class="page-title">
<h1>접근 정책</h1> <h1>접근 규칙</h1>
<details class="explanation-details"> <details class="explanation-details">
<summary>도움말</summary> <summary>도움말</summary>
<p>VPD policy function이 참조할 사용자, 역할, 행 규칙, 컬럼 원문 허용 규칙을 저장합니다. 이 화면에서 만든 규칙이 기본 Filter의 동적 입력이 됩니다.</p> <p>VPD policy function이 참조할 사용자, 역할, 행 규칙, 컬럼 원문 허용 규칙을 저장합니다. 이 화면에서 만든 규칙이 기본 Filter의 동적 입력이 됩니다.</p>
@@ -18,7 +18,7 @@
<section class="content-band"> <section class="content-band">
<div class="section-heading"> <div class="section-heading">
<div> <div>
<h2>새 접근 정책</h2> <h2>새 접근 규칙</h2>
<p class="section-description">저장 전 적용 대상과 행 범위를 검토한 뒤 VPD 권한을 반영합니다.</p> <p class="section-description">저장 전 적용 대상과 행 범위를 검토한 뒤 VPD 권한을 반영합니다.</p>
</div> </div>
<div class="wizard-progress" aria-label="권한 추가 단계"> <div class="wizard-progress" aria-label="권한 추가 단계">
@@ -243,7 +243,7 @@
</section> </section>
<section class="content-band"> <section class="content-band">
<h2>접근 정책 목록</h2> <h2>접근 규칙 목록</h2>
<div class="table-responsive"> <div class="table-responsive">
<table class="table table-sm align-middle"> <table class="table table-sm align-middle">
<thead> <thead>

View File

@@ -19,7 +19,7 @@ class GuidedFlowTemplateTest {
.contains("th:replace=\"~{fragments/layout :: head('VPD 권한 운영')}\"") .contains("th:replace=\"~{fragments/layout :: head('VPD 권한 운영')}\"")
.contains("권한 관리") .contains("권한 관리")
.contains("접근 검증") .contains("접근 검증")
.contains("접근 정책") .contains("접근 규칙")
.contains("현재 상태") .contains("현재 상태")
.contains("상세 현황") .contains("상세 현황")
.contains("<details class=\"dashboard-details\">") .contains("<details class=\"dashboard-details\">")
@@ -28,10 +28,9 @@ class GuidedFlowTemplateTest {
.doesNotContain(">01<", ">02<"); .doesNotContain(">01<", ">02<");
assertThat(layout) assertThat(layout)
.contains("VPD 권한 운영") .contains("VPD 권한 운영")
.contains("데이터 보호") .contains("보호 정책 관리")
.contains("접근 검증") .contains("접근 검증")
.contains("지식 검색") .contains("지식자료 관리")
.contains("시스템 관리")
.doesNotContain("VPD Backoffice"); .doesNotContain("VPD Backoffice");
} }