From 9bb1559041179200eaa4bf96c4faf9a7c062307d Mon Sep 17 00:00:00 2001 From: Shaun Struwig <41984034+Blargian@users.noreply.github.com> Date: Tue, 17 Feb 2026 15:24:23 +0100 Subject: [PATCH 1/6] add config for Korean translations --- docusaurus.config.js | 4 +- docusaurus.config.ko.js | 322 ++++++++++++++++++++++++++++++++++++++++ 2 files changed, 325 insertions(+), 1 deletion(-) create mode 100644 docusaurus.config.ko.js diff --git a/docusaurus.config.js b/docusaurus.config.js index 5b0f5873cd2..7d41045d079 100644 --- a/docusaurus.config.js +++ b/docusaurus.config.js @@ -2,6 +2,7 @@ import enConfig from "./docusaurus.config.en.js"; import jpConfig from "./docusaurus.config.jp.js"; import zhConfig from "./docusaurus.config.zh.js"; import ruConfig from "./docusaurus.config.ru.js"; +import koConfig from "./docusaurus.config.ko.js"; const env = process.env.DOCUSUARUS_LOCALE || "en"; // Default to "en" @@ -9,7 +10,8 @@ const configMap = { en: enConfig, jp: jpConfig, zh: zhConfig, - ru: ruConfig + ru: ruConfig, + ko: koConfig }; // Export the selected config, defaulting to English if the environment variable is invalid diff --git a/docusaurus.config.ko.js b/docusaurus.config.ko.js new file mode 100644 index 00000000000..ff1ef06c9e8 --- /dev/null +++ b/docusaurus.config.ko.js @@ -0,0 +1,322 @@ +import { themes } from "prism-react-renderer"; +import math from "remark-math"; +import katex from "rehype-katex"; +import chHeader from "./plugins/header.js"; +import fixLinks from "./src/hooks/fixLinks.js"; +import prismLight from "./src/utils/prismLight"; +import prismDark from "./src/utils/prismDark"; +import glossaryTransformer from "./plugins/glossary-transformer.js"; +const remarkCustomBlocks = require('./plugins/remark-custom-blocks'); + +// Helper function to skip over index.md files. +function skipIndex(items) { + return items.filter(({ type, id }) => { + return type !== "doc" || !id.match(/index$/); + }); +} + +/** @type {import('@docusaurus/types').Config} */ +const config = { + scripts: [ + { + src: "/docs/ko/js/kapa_config.js", + async: false, + }, + { + src: "/docs/ko/js/kapa_widget.js", + async: true, + defer: true, // execute after document parsing, but before firing DOMContentLoaded event + } + ], + clientModules: [ + require.resolve('./src/clientModules/utmPersistence.js') + ], + // Settings for Docusaurus Faster - build optimizations + future: { + experimental_faster: { + swcJsLoader: true, + swcJsMinimizer: true, + swcHtmlMinimizer: true, + lightningCssMinimizer: true, + rspackBundler: true, + mdxCrossCompilerCache: true, + }, + }, + title: "ClickHouse Docs", + tagline: + "我们提供文档、快速入门指南、用户指南、技术参考、常见问题解答等多种信息。", + url: "https://clickhouse.com", + // url: process.env.VERCEL_URL ? `https://${process.env.VERCEL_URL}` : 'https://bookish-disco-5997zvo.pages.github.io', + baseUrl: "/docs/ko/", + baseUrlIssueBanner: true, + onBrokenLinks: "warn", + onBrokenMarkdownLinks: "warn", + onDuplicateRoutes: "throw", + onBrokenAnchors: "warn", + favicon: "img/docs_favicon.ico", + organizationName: "ClickHouse", + trailingSlash: false, + i18n: { + defaultLocale: "ko", + locales: ["en", "jp", "zh", "ru", "ko"], + path: "i18n", + localeConfigs: { + en: { + label: "English", + htmlLang: "en", + path: "en", + }, + jp: { + label: "日本語", + htmlLang: "jp", + path: "jp", + }, + zh: { + label: "中文", + htmlLang: "zh", + path: "zh", + }, + ru: { + label: "Русский", + htmlLang: "ru", + path: "ru", + }, + ko: { + label: "Korean", + htmlLang: "ko", + path: "ko", + } + }, + }, + staticDirectories: ["static"], + projectName: "clickhouse-docs", + markdown: { + mermaid: true, + }, + themes: ["@docusaurus/theme-mermaid"], + presets: [ + [ + "classic", + /** @type {import('@docusaurus/preset-classic').Options} */ + ({ + docs: { + admonitions: { + keywords: [ + "note", + "tip", + "info", + "caution", + "danger", + "experimental", + "obsolete", + "warning", + "success", + "important", + "secondary", + ], + }, + sidebarPath: require.resolve("./sidebars.js"), + // Implements a custom sidebar to override default behaviour where index.md page shows underneath the category name. + // With this sidebar the category name is clickable to show the index.md contents. + async sidebarItemsGenerator({ + defaultSidebarItemsGenerator, + ...args + }) { + const sidebarItems = await defaultSidebarItemsGenerator(args); + return skipIndex(sidebarItems); + }, + editCurrentVersion: false, + breadcrumbs: true, + showLastUpdateTime: false, + sidebarCollapsed: true, + routeBasePath: "/", + remarkPlugins: [math, remarkCustomBlocks], + beforeDefaultRemarkPlugins: [fixLinks], + rehypePlugins: [katex], + }, + blog: { + path: "knowledgebase", + blogTitle: "ClickHouse 知识库", + blogDescription: "知识库", + blogSidebarTitle: "所有KB文章", + routeBasePath: "/knowledgebase", + postsPerPage: 10, + blogSidebarCount: "ALL", + feedOptions: { + type: "all", + title: "ClickHouse 知识库信息流", + description: "在ClickHouse知识库中发布的文章信息流", + copyright: `Copyright © 2016–${new Date().getFullYear()} ClickHouse, Inc. ClickHouse Docs provided under the Creative Commons CC BY-NC-SA 4.0 license. ClickHouse® is a registered trademark of ClickHouse, Inc.`, + language: "en", + createFeedItems: async (params) => { + const { blogPosts, defaultCreateFeedItems, ...rest } = params; + return defaultCreateFeedItems({ + // keep only the 10 most recent blog posts in the feed + blogPosts: blogPosts.filter((item, index) => index < 10), + ...rest, + }); + }, + }, + editUrl: ({ blogPath }) => { + return ( + "https://github.com/ClickHouse/clickhouse-docs/blob/main/knowledgebase/" + + blogPath + ); + }, + remarkPlugins: [math, remarkCustomBlocks, glossaryTransformer], + beforeDefaultRemarkPlugins: [fixLinks], + rehypePlugins: [katex], + }, + theme: { + customCss: [require.resolve("./src/css/custom.scss")], + }, + ...(process.env.VERCEL_ENV !== 'preview' && { + googleTagManager: { + containerId: 'GTM-WTNTDT7W', + }, + }), + }), + ], + ], + // Inserts tags into the
+ headTags: [ + { + // Ask AI component + tagName: "link", + attributes: { + href: "https://widget.kapa.ai", + rel: "preconnect", // preemptively initiate a connection to resource + }, + }, + { + // Google's CDN. Caches all 'static' files in a server near to you + // to reduce load times. + tagName: "link", + attributes: { + href: "https://www.gstatic.com", + rel: "preconnect", + crossorigin: "use-credentials", + }, + }, + { + tagName: "link", + attributes: { + href: "https://www.googletagmanager.com", + rel: "preconnect", + }, + }, + ], + themeConfig: + /** @type {import('@docusaurus/preset-classic').ThemeConfig} */ + ({ + metadata: [ + {name: 'Accept-Language', content: 'ko-KR,ko;q=0.9'}, + ], + algolia: { + appId: "5H9UG7CX5W", + apiKey: "4a7bf25cf3edbef29d78d5e1eecfdca5", + indexName: "clickhouse-ko", + contextualSearch: false, + searchPagePath: "search", + }, + image: "img/docs_social_share.png", + icon: "/img/gareth.png", + docs: { + sidebar: { + autoCollapseCategories: true, + }, + }, + // autoCollapseSidebarCategories: true, + navbar: { + hideOnScroll: false, + logo: { + alt: "ClickHouse", + src: "img/ch_logo_docs.svg", + srcDark: "img/ch_logo_docs_dark.svg", + href: "https://clickhouse.com/", + }, + items: [], + }, + footer: { + style: "light", + links: [ + { + label: "商标", + to: "https://clickhouse.com/legal/trademark-policy", + }, + { + label: "隐私", + to: "https://clickhouse.com/legal/privacy-policy", + }, + { + label: "安全", + to: "https://trust.clickhouse.com/", + }, + { + label: "服务条款", + to: "https://clickhouse.com/legal/agreements/terms-of-service", + }, + ], + copyright: `© 2016–${new Date().getFullYear()} ClickHouse, Inc.`, + }, + prism: { + theme: prismLight, + darkTheme: prismDark, + additionalLanguages: ["java", "cpp", "rust", "python", "javascript", "yaml", "bash", "docker"], + magicComments: [ + // Remember to extend the default highlight class name as well! + { + className: "theme-code-block-highlighted-line", + line: "highlight-next-line", + block: { start: "highlight-start", end: "highlight-end" }, + }, + ], + }, + colorMode: { + disableSwitch: false, + respectPrefersColorScheme: true, + defaultMode: "dark", + }, + }), + + plugins: [ + "docusaurus-plugin-sass", + function (context, options) { + return { + name: "docusaurus-plugin", + async postBuild({ siteConfig = {}, routesPaths = [], outDir }) { + // Print out to console all the rendered routes. + routesPaths.map((route) => { + //console.log(route) + }); + }, + }; + }, + chHeader, + ['./plugins/tailwind-config.js', {}], + ], + customFields: { + blogSidebarLink: "/docs/knowledgebase", // Used for KB article page + galaxyApiEndpoint: + process.env.NEXT_PUBLIC_GALAXY_API_ENDPOINT || "http://localhost:3000", + secondaryNavItems: [ + { + type: "dropdown", + hoverable: "false", + html: + '", + position: "right", + items: [ + { + label: "English", + to: "/", + }, + ], + }, + ], + }, +}; + +module.exports = config; From c14d1b4f73108abc077af92ce1e423cd8859b0a0 Mon Sep 17 00:00:00 2001 From: Shaun Struwig <41984034+Blargian@users.noreply.github.com> Date: Tue, 17 Feb 2026 16:18:01 +0100 Subject: [PATCH 2/6] update translations in docusaurus.config.ko.js --- docusaurus.config.ko.js | 20 ++++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/docusaurus.config.ko.js b/docusaurus.config.ko.js index ff1ef06c9e8..6a93e2a4513 100644 --- a/docusaurus.config.ko.js +++ b/docusaurus.config.ko.js @@ -44,7 +44,7 @@ const config = { }, title: "ClickHouse Docs", tagline: - "我们提供文档、快速入门指南、用户指南、技术参考、常见问题解答等多种信息。", + "다양한 정보를 제공합니다: 문서, 빠른 시작 가이드, 사용자 가이드, 기술 참조, 자주 묻는 질문 등.", url: "https://clickhouse.com", // url: process.env.VERCEL_URL ? `https://${process.env.VERCEL_URL}` : 'https://bookish-disco-5997zvo.pages.github.io', baseUrl: "/docs/ko/", @@ -136,16 +136,16 @@ const config = { }, blog: { path: "knowledgebase", - blogTitle: "ClickHouse 知识库", - blogDescription: "知识库", - blogSidebarTitle: "所有KB文章", + blogTitle: "ClickHouse 지식베이스", + blogDescription: "지식베이스", + blogSidebarTitle: "모든 KB 문서", routeBasePath: "/knowledgebase", postsPerPage: 10, blogSidebarCount: "ALL", feedOptions: { type: "all", - title: "ClickHouse 知识库信息流", - description: "在ClickHouse知识库中发布的文章信息流", + title: "ClickHouse 지식베이스 피드", + description: "ClickHouse 지식베이스에 게시된 문서 피드", copyright: `Copyright © 2016–${new Date().getFullYear()} ClickHouse, Inc. ClickHouse Docs provided under the Creative Commons CC BY-NC-SA 4.0 license. ClickHouse® is a registered trademark of ClickHouse, Inc.`, language: "en", createFeedItems: async (params) => { @@ -241,19 +241,19 @@ const config = { style: "light", links: [ { - label: "商标", + label: "상표", to: "https://clickhouse.com/legal/trademark-policy", }, { - label: "隐私", + label: "개인정보 보호", to: "https://clickhouse.com/legal/privacy-policy", }, { - label: "安全", + label: "보안", to: "https://trust.clickhouse.com/", }, { - label: "服务条款", + label: "서비스 약관", to: "https://clickhouse.com/legal/agreements/terms-of-service", }, ], From 8bda24f4345e30f08dd72e363e46197176fbdf40 Mon Sep 17 00:00:00 2001 From: Shaun Struwig <41984034+Blargian@users.noreply.github.com> Date: Tue, 17 Feb 2026 16:57:49 +0100 Subject: [PATCH 3/6] updates to custom components to support Korean translations --- docusaurus.config.en.js | 1 - docusaurus.config.jp.js | 1 - docusaurus.config.ko.js | 1 - docusaurus.config.ru.js | 1 - docusaurus.config.zh.js | 1 - src/components/MobileSideBarMenu/Content.jsx | 6 +++--- .../MobileSideBarMenu/MobileLanguagePicker.jsx | 10 ++++++---- src/theme/DocItem/Layout/index.js | 3 ++- 8 files changed, 11 insertions(+), 13 deletions(-) diff --git a/docusaurus.config.en.js b/docusaurus.config.en.js index 3de49018f92..cd1301ab362 100644 --- a/docusaurus.config.en.js +++ b/docusaurus.config.en.js @@ -54,7 +54,6 @@ const config = { tagline: "Documentation, quick starts, user guides, technical references, FAQs and more...", url: "https://clickhouse.com", - // url: process.env.VERCEL_URL ? `https://${process.env.VERCEL_URL}` : 'https://bookish-disco-5997zvo.pages.github.io', baseUrl: "/docs/", baseUrlIssueBanner: true, onBrokenLinks: "warn", diff --git a/docusaurus.config.jp.js b/docusaurus.config.jp.js index 4fab3d5cd53..0828df5ab45 100644 --- a/docusaurus.config.jp.js +++ b/docusaurus.config.jp.js @@ -46,7 +46,6 @@ const config = { tagline: "ドキュメント、クイックスタートガイド、ユーザーガイド、技術リファレンス、FAQ など、多様な情報をご提供します。", url: "https://clickhouse.com", - // url: process.env.VERCEL_URL ? `https://${process.env.VERCEL_URL}` : 'https://bookish-disco-5997zvo.pages.github.io', baseUrl: "/docs/jp/", baseUrlIssueBanner: true, onBrokenLinks: "warn", diff --git a/docusaurus.config.ko.js b/docusaurus.config.ko.js index 6a93e2a4513..a35cf60439d 100644 --- a/docusaurus.config.ko.js +++ b/docusaurus.config.ko.js @@ -46,7 +46,6 @@ const config = { tagline: "다양한 정보를 제공합니다: 문서, 빠른 시작 가이드, 사용자 가이드, 기술 참조, 자주 묻는 질문 등.", url: "https://clickhouse.com", - // url: process.env.VERCEL_URL ? `https://${process.env.VERCEL_URL}` : 'https://bookish-disco-5997zvo.pages.github.io', baseUrl: "/docs/ko/", baseUrlIssueBanner: true, onBrokenLinks: "warn", diff --git a/docusaurus.config.ru.js b/docusaurus.config.ru.js index 75876c38100..8aafef6d030 100644 --- a/docusaurus.config.ru.js +++ b/docusaurus.config.ru.js @@ -46,7 +46,6 @@ const config = { tagline: "Документация, быстрые старты, руководства пользователя, технические справочники, часто задаваемые вопросы и многое другое…", url: "https://clickhouse.com", - // url: process.env.VERCEL_URL ? `https://${process.env.VERCEL_URL}` : 'https://bookish-disco-5997zvo.pages.github.io', baseUrl: "/docs/ru/", baseUrlIssueBanner: true, onBrokenLinks: "warn", diff --git a/docusaurus.config.zh.js b/docusaurus.config.zh.js index 702fa201b84..431fb5ca49b 100644 --- a/docusaurus.config.zh.js +++ b/docusaurus.config.zh.js @@ -46,7 +46,6 @@ const config = { tagline: "我们提供文档、快速入门指南、用户指南、技术参考、常见问题解答等多种信息。", url: "https://clickhouse.com", - // url: process.env.VERCEL_URL ? `https://${process.env.VERCEL_URL}` : 'https://bookish-disco-5997zvo.pages.github.io', baseUrl: "/docs/zh/", baseUrlIssueBanner: true, onBrokenLinks: "warn", diff --git a/src/components/MobileSideBarMenu/Content.jsx b/src/components/MobileSideBarMenu/Content.jsx index 66cce4a2de4..12318e2c873 100644 --- a/src/components/MobileSideBarMenu/Content.jsx +++ b/src/components/MobileSideBarMenu/Content.jsx @@ -29,7 +29,7 @@ const MobileSideBarMenuContents = ({ className, onClick, onClose, sidebar, path, // Get current locale from URL const getCurrentLocale = () => { const pathname = location.pathname; - const docsLocaleMatch = pathname.match(/^\/docs\/(jp|ja|ru|zh|zh-CN)(?=\/|$)/); + const docsLocaleMatch = pathname.match(/^\/docs\/(jp|ja|ko|ru|zh|zh-CN)(?=\/|$)/); return docsLocaleMatch ? docsLocaleMatch[1] : 'en'; }; @@ -37,7 +37,7 @@ const MobileSideBarMenuContents = ({ className, onClick, onClose, sidebar, path, const normalizePath = (path) => { if (!path) return ''; // Remove locale prefix from path for comparison - return path.replace(/^\/docs\/(jp|ja|ru|zh|zh-CN)/, '/docs'); + return path.replace(/^\/docs\/(jp|ja|ko|ru|zh|zh-CN)/, '/docs'); }; // Check if the current path exists in the sidebar @@ -71,7 +71,7 @@ const MobileSideBarMenuContents = ({ className, onClick, onClose, sidebar, path, // Check if we're on a docs root page (should show only top-level menu) const isDocsRootPage = () => { - const docsRootPaths = ['/docs/', '/docs/jp/', '/docs/ru/', '/docs/zh/']; + const docsRootPaths = ['/docs/', '/docs/jp/', '/docs/ko/', '/docs/ru/', '/docs/zh/']; return docsRootPaths.includes(location.pathname); }; diff --git a/src/components/MobileSideBarMenu/MobileLanguagePicker.jsx b/src/components/MobileSideBarMenu/MobileLanguagePicker.jsx index 0c46c95039d..3ad034efb75 100644 --- a/src/components/MobileSideBarMenu/MobileLanguagePicker.jsx +++ b/src/components/MobileSideBarMenu/MobileLanguagePicker.jsx @@ -15,13 +15,13 @@ const MobileLanguagePicker = ({ onLanguageChange }) => { const pathname = location.pathname; // Check if we're in a docs path with locale - const docsLocaleMatch = pathname.match(/^\/docs\/(jp|ja|ru|zh|zh-CN)(?=\/|$)/); + const docsLocaleMatch = pathname.match(/^\/docs\/(jp|ja|ko|ru|zh|zh-CN)(?=\/|$)/); if (docsLocaleMatch) { return docsLocaleMatch[1]; } // Check for root-level locale - const rootLocaleMatch = pathname.match(/^\/(jp|ja|ru|zh|zh-CN)(?=\/|$)/); + const rootLocaleMatch = pathname.match(/^\/(jp|ja|ko|ru|zh|zh-CN)(?=\/|$)/); if (rootLocaleMatch) { return rootLocaleMatch[1]; } @@ -61,6 +61,7 @@ const MobileLanguagePicker = ({ onLanguageChange }) => { en: 'EN', jp: 'JP', ja: 'JP', // Handle both jp and ja for Japanese + ko: 'KO', ru: 'RU', zh: 'ZH', 'zh-CN': 'ZH', @@ -76,6 +77,7 @@ const MobileLanguagePicker = ({ onLanguageChange }) => { en: 'English', jp: '日本語', ja: '日本語', // Handle both jp and ja for Japanese + ko: '한국어', ru: 'Русский', zh: '中文', 'zh-CN': '中文', @@ -165,7 +167,7 @@ const MobileLanguagePicker = ({ onLanguageChange }) => { } } else { // Remove existing locale from docs path if present - let cleanPath = currentPath.replace(/^\/docs\/(jp|ja|ru|zh|zh-CN)(?=\/|$)/, '/docs'); + let cleanPath = currentPath.replace(/^\/docs\/(jp|ja|ko|ru|zh|zh-CN)(?=\/|$)/, '/docs'); // Build new URL with target locale if (locale === i18n.defaultLocale || locale === 'en') { @@ -178,7 +180,7 @@ const MobileLanguagePicker = ({ onLanguageChange }) => { } else { // Handle non-docs paths (like home page, blog, etc.) // Remove any existing locale prefix first - let cleanPath = currentPath.replace(/^\/(jp|ja|ru|zh|zh-CN)(?=\/|$)/, ''); + let cleanPath = currentPath.replace(/^\/(jp|ja|ko|ru|zh|zh-CN)(?=\/|$)/, ''); // If nothing was removed, we're on a clean path already if (cleanPath === currentPath) { diff --git a/src/theme/DocItem/Layout/index.js b/src/theme/DocItem/Layout/index.js index d10fe18cbb6..91658cfe2c9 100644 --- a/src/theme/DocItem/Layout/index.js +++ b/src/theme/DocItem/Layout/index.js @@ -55,7 +55,8 @@ export default function DocItemLayout({children}) { if ( location.pathname.endsWith('/docs/jp/') || location.pathname.endsWith('/docs/ru/') || - location.pathname.endsWith('/docs/zh/') + location.pathname.endsWith('/docs/zh/') || + location.pathname.endsWith('/docs/ko/') ) { isDocsHome = true } From c5fcde4a744a4a5d73a3b8bd060af36ccf9c2801 Mon Sep 17 00:00:00 2001 From: Shaun Struwig <41984034+Blargian@users.noreply.github.com> Date: Tue, 17 Feb 2026 18:27:31 +0100 Subject: [PATCH 4/6] add missing vercel rewrite --- vercel.json | 1 + 1 file changed, 1 insertion(+) diff --git a/vercel.json b/vercel.json index a1fa050a464..8049d8e87c2 100644 --- a/vercel.json +++ b/vercel.json @@ -1,6 +1,7 @@ { "rewrites": [ { "source": "/docs/jp/:path*", "destination": "/:path*" }, + { "source": "/docs/ko/:path*", "destination": "/:path*" }, { "source": "/docs/zh/:path*", "destination": "/:path*" }, { "source": "/docs/ru/:path*", "destination": "/:path*" }, { "source": "/docs/:path*", "destination": "/:path*" } From 0dc632a16174de6c073a091a420d47ae77f07640 Mon Sep 17 00:00:00 2001 From: Shaun Struwig <41984034+Blargian@users.noreply.github.com> Date: Tue, 17 Feb 2026 22:14:55 +0100 Subject: [PATCH 5/6] Fix build errors for Korean translations --- docusaurus.config.ko.js | 2 +- .../current/managing-data/core-concepts/academic_overview.mdx | 2 +- .../current/use-cases/AI_ML/MCP/05_open-webui.md | 2 +- .../ingesting-data/integration-examples/jvm-metrics.md | 2 +- .../ingesting-data/integration-examples/kafka-metrics.md | 2 +- .../ingesting-data/integration-examples/nodejs-traces.md | 4 ++-- .../ingesting-data/integration-examples/temporal.md | 2 ++ 7 files changed, 9 insertions(+), 7 deletions(-) diff --git a/docusaurus.config.ko.js b/docusaurus.config.ko.js index a35cf60439d..f06e09f9437 100644 --- a/docusaurus.config.ko.js +++ b/docusaurus.config.ko.js @@ -81,7 +81,7 @@ const config = { path: "ru", }, ko: { - label: "Korean", + label: "한국어", htmlLang: "ko", path: "ko", } diff --git a/i18n/ko/docusaurus-plugin-content-docs/current/managing-data/core-concepts/academic_overview.mdx b/i18n/ko/docusaurus-plugin-content-docs/current/managing-data/core-concepts/academic_overview.mdx index 78009957afc..2ae86af12c8 100644 --- a/i18n/ko/docusaurus-plugin-content-docs/current/managing-data/core-concepts/academic_overview.mdx +++ b/i18n/ko/docusaurus-plugin-content-docs/current/managing-data/core-concepts/academic_overview.mdx @@ -447,7 +447,7 @@ DuckDB [[67]](#page-13-6)는 호스트 프로세스에 내장되어 사용되도 *