통합 탐색·답변(§14) 연계 이관 계획 — Document Library
상태: 1~4단계 완료(2026-10-05) · 5단계(게이트웨이 어댑터 노출)·6단계(운영 등록) 남음 선행: Guide Center·Document Library §16 용어 파이프라인(완료) 참조 구현(검증됨): ProcessCenter explore.gatewayAsk / AgentCenter explore.ask(exploreAskService)
1. 목표
셸 상단 검색창이 중앙 통합 탐색이 되고, 질문은 게이트웨이 → 중앙 RAG(RagService) 가 답한다. 검색은 이 포털 색인(kind=document 로 게이트웨이에 제공), 답변은 게이트웨이 위임이 정본이며 자기 색인은 폴백이다 (ExploreGateway/docs/adapter-onboarding.md §3-2).
2. 실측한 제약 (2026-10-05 확인)
| 항목 | 사실 | 영향 |
|---|---|---|
| 현재 PF | @hohyun94/portal-foundation 0.6.46 (file:vendor/...tgz) | 122버전 뒤처짐 |
PortalFrame | 0.6.168 에서 제거됨(export 없음) | 셸 교체가 필수다 — 유지 불가 |
PortalShell | 0.6.168 에 존재. antd 를 의존성으로 번들(antd ^6.6.3) | 소비자가 antd 를 선언할 필요 없다 |
PortalShellProps | searchValue·onSearchChange·onSearchSubmit·exploreResults·onExploreSelect·onExploreAsk·exploreAnswer·exploreAnswerLoading 보유 | 탐색 슬롯은 이미 있다 |
quickLinks·quickLinksLabel | PortalShellProps 에 없다 | DL 의 바로가기를 다른 슬롯으로 옮겨야 한다(결정 필요) |
| 유지되는 API | PortalIcon·DocumentLibraryMark·buildPortalNavigationItems·buildPortalQuickLinks·PortalMenuItem·PortalQuickLink | 내비게이션·바로가기 빌더 로직은 그대로 쓸 수 있다 |
| DL 의 PF 사용면 | client/src/components/PortalShell.tsx 래퍼 + Login.tsx(AuthCard) + App.tsx(PortalThemeProvider) — 4개 파일 | 교체 반경이 작다 |
| DL 서버 탐색 | 탐색 어댑터·답변 경로 없음(server/contentTermService.ts 만 있음) | 서버 경로를 새로 만든다 |
3. 결정이 필요한 2건 (권장안 포함)
- 상단 검색의 의미 — PF 규약(
docs/EXPLORE_ANSWER_CONVENTION.md)은 입력 표면을 셸 통합 검색창 + 페이지 내 검색창 둘로 못박는다.- 권장: 상단 검색 = 탐색 대화창(
onSearchSubmit·onExploreAsk), 게시판 필터는 페이지 안으로 이동(게시판 목록 헤더의 입력). - 근거: 새 셸에서
searchValue/onSearchChange는 탐색 대화창 입력을 구동한다 — 게시판 필터를 그대로 두면 성격이 다른 두 기능이 한 입력을 공유하게 된다.
- 권장: 상단 검색 = 탐색 대화창(
- 바로가기(quickLinks) 위치 — 0.6.168 셸에 슬롯이 없다.
- 권장:
sidebarFooter또는accountMenuItems로 옮긴다(관리자 바로가기는 이미adminHref·admin 셸이 있다). - 대안: 중앙 메뉴 공급(PortalConsole)으로 이관 — ProcessCenter 처럼
navigationItems에 포함.
- 권장:
4. 작업 단계
- ✅ 벤더·의존성 —
portal-foundation 0.6.168·portal-operations 0.3.1반입,package.json갱신,pnpm install. vite 테스트에서 사내file:패키지는server.deps.inline으로 변환해야 한다(vite.config.ts). - ✅ 셸 교체 —
PortalFrame→PortalShell. 관리자 진입은roleSwitch가 소유하고(셸에adminHref·quickLinksprop 이 없다), 바로가기는 그대로 두지 않는다. 커밋9052986(동작 동일 단독 커밋). - ✅ 서버 경로 —
server/exploreGateway.ts(위임 토큰 캐시 + 게이트웨이/api/explore/v1/ask) ·server/explore-api.ts(GET /api/explore/capabilities,POST /api/explore/ask). - ✅ 클라이언트 —
client/src/features/explore/useShellExplore.ts(게시판 색인 → 셸 결과, 서버 답변 → 셸 답변 카드) + 셸 래퍼 배선(exploreResults·onExploreSelect·onExploreAsk·exploreAnswer). - ✅ 게이트웨이 어댑터 노출 —
server/explore-adapter.ts(POST /api/explore/v1/search, 서비스 토큰 인증). 게시글(문서)을 제목·본문 부분 일치로 찾아kind=document로 돌려준다. 이 포털의 읽기 규칙은 "인증 사용자 전체" 이므로 주체별로 더 좁힐 축이 없다(없는 축을 흉내 내지 않는다). - ⏳ 운영 등록 — PortalConsole
PORTAL_CONSOLE_TOKEN_CONSUMERS_JSON에document-library소비자(delegationAudiences: ["explore-gateway"],delegationScopes: ["search:read"]), ExploreGatewayPORTAL_SERVICE_TOKENS_JSON에EXPLORE_SERVICE_TOKEN값. - ✅ 검증 —
pnpm check0 ·pnpm build0 ·pnpm test86 passed(신규 9: 위임 발급·캐시·반쪽 구성·게이트웨이 호출, 게시판 결과 변환·인용 없는 답변 버리기).
4-1. 선확인 결과(2026-10-05)
- DL 인증은 두 모드다(
server/portalIntegrationConfig.ts):directory(중앙 로그인, Directory 사용자 ID 를 로컬 원장에 매핑) /local(자체 관리자). 위임 토큰의 주체는 Directory 사용자여야 하므로 연동은 directory 모드에서만 켜진다 —local배포에는 위임할 주체가 없다. 그래서GET /api/explore/capabilities가authProvider !== "directory"면answer: false를 돌려주고,POST /api/explore/ask는 503 으로 그 사실을 알린다(빈 답으로 위장하지 않는다). - 바로가기(quickLinks) — 0.6.168 셸에 슬롯이 없다. DL 의 유일한 바로가기(관리자)는
roleSwitch로 흡수했다(플랫폼 표준 진입). - 게시판 필터 — 상단 검색창이 탐색 대화창을 열고, 그 입력값이 게시판 필터를 함께 구동한다(기존 동작 유지). 대화창은 그 값을 그대로 결과로 보여 준다 — 화면 목록과 대화창이 같은 규칙을 쓴다.
5. 하지 않는 것
- 포털 로컬 RAG 색인·검색을 게이트웨이로 위임하지 않는다 — 검색은 각 포털이 소유한다(답변만 위임).
- 게이트웨이가 답을 만들지 않는다(오케스트레이션만).
- PF 0.6.168 의
PortalExploreDialog를 새로 만들지 않는다 — 셸이 이미 제공한다.