ui: adopt product language for DDS console

This commit is contained in:
devmrko
2026-07-01 07:57:52 +09:00
parent 5ab6c53eaf
commit 12b7e00cef
9 changed files with 92 additions and 92 deletions

View File

@@ -1,17 +1,17 @@
<!doctype html>
<html lang="ko" xmlns:th="http://www.thymeleaf.org">
<head th:replace="~{fragments/layout :: head('DDS 지식 검색 관리')}"></head>
<head th:replace="~{fragments/layout :: head('지식자료와 접근 권한')}"></head>
<body>
<nav th:replace="~{fragments/layout :: nav}"></nav>
<main class="container py-4">
<div class="page-title">
<span class="architecture-kicker">DDS · KNOWLEDGE ACCESS</span>
<h1>지식자료를 등록하고 DDS 권한으로 검색합니다.</h1>
<p class="context-summary">문서 → 청크·임베딩 → 기술 태그 → 권한 규칙 → DDS DATA GRANT → 검색 결과</p>
<h1>지식자료와 접근 권한</h1>
<p class="context-summary">등록 · 접근 규칙 · 업무 사용자 검색 · 고급 검증</p>
<details class="explanation-details">
<summary>이 화면의 큰 흐름 보기</summary>
<p>문서는 검색 가능한 청크로 나뉘고 각 청크에 업무 접근 분류값(<code>TECH_TAG</code>)이 붙습니다. 권한 관리에서 역할별 허용 값을 등록하면 DDS의 DATA GRANT가 해당 값이 붙은 청크만 검색 대상으로 남깁니다.</p>
<p class="mb-0">VPD 화면과 같은 사용자·그룹·역할·권한 규칙을 사용합니다. 아래에는 DDS END USER를 직접 선택하는 비교 경로와, 하나의 DDS 기술 사용자에 Bearer 토큰을 전달해 공통 권한을 평가하는 제품형 경로를 함께 둡니다.</p>
<summary>접근 방식 보기</summary>
<p>문서는 검색 단위로 나뉘고 각 단위에 접근 분류값(<code>TECH_TAG</code>)이 연결됩니다. 역할별 허용 값을 등록하면 보호 규칙이 허용된 분류값만 검색 대상으로 남깁니다.</p>
<p class="mb-0">기본 경로는 Bearer 토큰으로 업무 사용자를 식별합니다. 직접 접근 비교는 고급 검증에서만 사용합니다.</p>
</details>
</div>
@@ -28,7 +28,7 @@
<div>
<span class="architecture-kicker">1 · CONTENT</span>
<h2>지식자료 등록</h2>
<p class="section-subtitle">문서 ID가 같으면 기존 청크를 교체합니다. 저장소는 VPD 트랙과 동일한 지식자료 형식을 사용합니다.</p>
<p class="section-subtitle">문서 ID가 같으면 기존 검색 단위를 교체합니다.</p>
</div>
<span class="badge text-bg-secondary" th:text="${summary == null ? '저장소 확인 필요' : summary.chunkCount() + '개 검색 단위'}">0개 검색 단위</span>
</div>
@@ -36,7 +36,7 @@
<summary>청킹·임베딩 설정 보기</summary>
<ul>
<li>문단을 우선 묶고 길이가 길면 문장·공백 기준으로 청크를 나눕니다.</li>
<li>기본 로컬 임베딩은 외부 API 없이 흐름을 검증하는 개발용 4차원 벡터입니다.</li>
<li>기본 로컬 임베딩은 외부 API 없이 흐름을 확인하는 개발용 4차원 벡터입니다.</li>
<li>운영에서는 등록과 검색에 같은 모델·차원을 사용해야 합니다.</li>
</ul>
</details>
@@ -72,19 +72,19 @@
<div>
<span class="architecture-kicker">2 · POLICY</span>
<h2>권한 규칙은 한 곳에서 관리합니다.</h2>
<p class="section-subtitle">사용자·그룹·역할·TAG 규칙은 VPD와 같은 권한 관리 화면에서 작성합니다.</p>
<p class="section-subtitle">사용자·그룹·역할·접근 분류 규칙을 한 곳에서 관리합니다.</p>
</div>
<div class="d-flex gap-2">
<a class="btn btn-sm rw-btn-secondary" href="/permissions">권한 관리 열기</a>
<a class="btn btn-sm rw-btn-primary" href="/dds-provision">DDS 권한 반영</a>
<a class="btn btn-sm rw-btn-primary" href="/dds-provision">권한 게시</a>
</div>
</div>
<div class="macro-micro-grid">
<div><h3>관리 관점</h3><p>를 들어 세일즈 역할에 <code>ALLOW TAG SALES</code>를 등록하면 SALES 값이 붙은 청크만 허용합니다. <code>DENY TAG</code> 허용 후보에서 제외니다.</p></div>
<div><h3>DDS 실행 관점</h3><p><code th:text="${ddsVectorObject}">ADMIN.CB_DDS_VECTOR_SEARCH_DOCUMENTS</code>객체별 DATA GRANT predicate가 토큰으로 식별된 업무 사용자와 청크의 <code>TECH_TAG</code> 값을 비교해 이 규칙을 집행합니다.</p></div>
<div><h3>접근 규칙</h3><p>: 세일즈 역할에 SALES 접근 분류값을 허용하면 SALES 자료만 검색됩니다. 거부 규칙은 허용 대상에서 제외니다.</p></div>
<div><h3>보호 방식</h3><p><code th:text="${ddsVectorObject}">ADMIN.CB_DDS_VECTOR_SEARCH_DOCUMENTS</code>보호 규칙이 업무 사용자와 접근 분류값을 비교합니다.</p></div>
</div>
<details class="explanation-details mt-3">
<summary>VPD와 DDS의 차이 보기</summary>
<summary>보호 방식 기술 상세 보기</summary>
<p>VPD는 요청마다 권한 테이블을 읽어 predicate를 계산합니다. DDS의 직접 비교 경로는 보호 VIEW에 선언한 DATA GRANT와 END USER 매핑을 사용합니다. 토큰 경로에서는 토큰이 공통 사용자 Context를 만들고, 보호 VIEW의 객체별 DATA GRANT predicate가 같은 권한 테이블을 다시 평가합니다.</p>
</details>
</section>
@@ -93,20 +93,20 @@
<div class="section-heading">
<div>
<span class="architecture-kicker">3 · TOKEN CONTEXT</span>
<h2>Bearer 토큰으로 같은 DDS Data Grant 적용</h2>
<p class="section-subtitle">고객별 DDS 계정을 만들지 않고 하나의 기술 사용자 세션에서 토큰으로 업무 사용자를 식별합니다.</p>
<h2>업무 사용자 검색</h2>
<p class="section-subtitle">하나의 기술 사용자 연결에서 Bearer 토큰으로 업무 사용자를 식별합니다.</p>
</div>
<span class="badge text-bg-secondary">객체별 DATA GRANT</span>
</div>
<details class="explanation-details">
<summary>토큰 경계 설명 보기</summary>
<summary>업무 사용자 검색 기술 상세 보기</summary>
<ol>
<li>서버가 설정한 하나의 DDS 기술 사용자로 연결합니다.</li>
<li>Bearer 토큰을 <code>CB_AGENT_CTX_PKG.SET_USER_BY_BEARER</code>에 전달합니다.</li>
<li><code>CB_DDS_VECTOR_SEARCH_DOCUMENTS</code>의 객체별 DATA GRANT predicate가 <code>CB_APP_USER</code>, 역할·그룹, <code>CB_PERMISSION</code>, <code>CB_PERMISSION_RULE</code>을 조회합니다.</li>
<li>ALLOW TAG는 OR로 합치고 DENY TAG는 최종 결과에서 제외합니다.</li>
</ol>
<p class="mb-0">세일즈 예제에서는 <code>agent_sales</code> 역할이 <code>ALLOW TAG SALES</code>를 가지고, 청크의 <code>TECH_TAG</code>에 SALES가 포함된 지식만 남습니다. 토큰은 DATA GRANT 문법의 바인드 파라미터가 아니라 Context를 만드는 입력이며 저장하지 않습니다.</p>
<p class="mb-0">토큰은 보호 규칙의 입력값이 아니라 업무 사용자 Context를 만드는 이며 저장하지 않습니다.</p>
</details>
<form hx-post="/vector-knowledge/token-search" hx-target="#vector-token-search-result" hx-swap="innerHTML" class="form-grid mt-3">
<input type="hidden" th:name="${_csrf.parameterName}" th:value="${_csrf.token}">
@@ -124,10 +124,10 @@
<label class="span-2">검색 질문
<textarea class="form-control" name="query" rows="3" placeholder="예: 세일즈 파이프라인 후속 조치 기준" required></textarea>
</label>
<button class="btn rw-btn-primary" type="submit">토큰 권한으로 검색</button>
<button class="btn rw-btn-primary" type="submit">권한 검색</button>
</form>
<section id="vector-token-search-result" class="mt-3" aria-live="polite">
<div class="empty-result-guide">Bearer 토큰과 질문을 입력하면 공통 권한체계를 반영한 DDS Data Grant 결과를 표시합니다.</div>
<div class="empty-result-guide">Bearer 토큰과 질문을 입력하면 허용된 지식자료만 표시합니다.</div>
</section>
</section>
@@ -135,8 +135,8 @@
<div class="section-heading">
<div>
<span class="architecture-kicker">4 · DIRECT CHECK</span>
<h2>DDS END USER 직접 조회 비교</h2>
<p class="section-subtitle">저수준 DDS 검증을 위해 선택한 END USER로 직접 접속해 DATA ROLE/DATA GRANT 결과를 확인합니다.</p>
<h2>고급: 직접 접근 비교</h2>
<p class="section-subtitle">DDS 선언형 보호 규칙 점검용 고급 검증</p>
</div>
<span class="badge text-bg-primary" th:text="${ddsVectorObject}">DDS view</span>
</div>
@@ -151,7 +151,7 @@
</details>
<form hx-post="/vector-knowledge/search" hx-target="#vector-search-result" hx-swap="innerHTML" class="form-grid mt-3">
<input type="hidden" th:name="${_csrf.parameterName}" th:value="${_csrf.token}">
<label>DDS END USER
<label>직접 접근 검증 프로필
<select class="form-select" name="userKey" required>
<option th:each="user : ${ddsUsers}" th:value="${user.key()}" th:selected="${user.key() == 'both'}"
th:text="${user.label() + ' · ' + user.username()}"></option>
@@ -168,10 +168,10 @@
<label class="span-2">검색 질문
<textarea class="form-control" name="query" rows="3" placeholder="예: 기술 태그로 지식자료 검색 권한을 제한하는 방법" required></textarea>
</label>
<button class="btn rw-btn-primary" type="submit">DDS 권한으로 검색</button>
<button class="btn rw-btn-primary" type="submit">직접 접근 비교</button>
</form>
<section id="vector-search-result" class="mt-3" aria-live="polite">
<div class="empty-result-guide">END USER와 질문을 선택하면 DDS가 허용 검색 단위만 표시니다.</div>
<div class="empty-result-guide">검증 프로필과 질문을 선택하면 허용 검색 단위만 표시니다.</div>
</section>
</section>