diff --git a/index.html b/index.html
index 97f9ef6..4f90b57 100644
--- a/index.html
+++ b/index.html
@@ -5,20 +5,6 @@
-
= 0.11.8 < 2.x"
+ },
+ "peerDependencies": {
+ "tslib": ">= 1.0.0"
+ }
+ },
+ "node_modules/@microsoft/applicationinsights-cfgsync-js": {
+ "version": "3.3.9",
+ "resolved": "https://registry.npmjs.org/@microsoft/applicationinsights-cfgsync-js/-/applicationinsights-cfgsync-js-3.3.9.tgz",
+ "integrity": "sha512-/7HpyjvKnKp4UGZ6U3pNXjpdPWRXcDyxlAkE3D3/TtgLbiTLfraLQuQAi/zTnJPFqkb3/TcS3wmDtnVea83w2Q==",
+ "license": "MIT",
+ "dependencies": {
+ "@microsoft/applicationinsights-common": "3.3.9",
+ "@microsoft/applicationinsights-core-js": "3.3.9",
+ "@microsoft/applicationinsights-shims": "3.0.1",
+ "@microsoft/dynamicproto-js": "^2.0.3",
+ "@nevware21/ts-async": ">= 0.5.4 < 2.x",
+ "@nevware21/ts-utils": ">= 0.11.8 < 2.x"
+ },
+ "peerDependencies": {
+ "tslib": ">= 1.0.0"
+ }
+ },
+ "node_modules/@microsoft/applicationinsights-channel-js": {
+ "version": "3.3.9",
+ "resolved": "https://registry.npmjs.org/@microsoft/applicationinsights-channel-js/-/applicationinsights-channel-js-3.3.9.tgz",
+ "integrity": "sha512-/yEgSe6vT2ycQJkXu6VF04TB5XBurk46ECV7uo6KkNhWyDEctAk1VDWB7EqXYdwLhKMbNOYX1pvz7fj43fGNqg==",
+ "license": "MIT",
+ "dependencies": {
+ "@microsoft/applicationinsights-common": "3.3.9",
+ "@microsoft/applicationinsights-core-js": "3.3.9",
+ "@microsoft/applicationinsights-shims": "3.0.1",
+ "@microsoft/dynamicproto-js": "^2.0.3",
+ "@nevware21/ts-async": ">= 0.5.4 < 2.x",
+ "@nevware21/ts-utils": ">= 0.11.8 < 2.x"
+ },
+ "peerDependencies": {
+ "tslib": ">= 1.0.0"
+ }
+ },
+ "node_modules/@microsoft/applicationinsights-common": {
+ "version": "3.3.9",
+ "resolved": "https://registry.npmjs.org/@microsoft/applicationinsights-common/-/applicationinsights-common-3.3.9.tgz",
+ "integrity": "sha512-IgruOuDBxmBK9jYo7SqLJG7Z9OwmAmlvHET49srpN6pqQlEjRpjD1nfA3Ps4RSEbF89a/ad2phQaBp8jvm122g==",
+ "license": "MIT",
+ "dependencies": {
+ "@microsoft/applicationinsights-core-js": "3.3.9",
+ "@microsoft/applicationinsights-shims": "3.0.1",
+ "@microsoft/dynamicproto-js": "^2.0.3",
+ "@nevware21/ts-utils": ">= 0.11.8 < 2.x"
+ },
+ "peerDependencies": {
+ "tslib": ">= 1.0.0"
+ }
+ },
+ "node_modules/@microsoft/applicationinsights-core-js": {
+ "version": "3.3.9",
+ "resolved": "https://registry.npmjs.org/@microsoft/applicationinsights-core-js/-/applicationinsights-core-js-3.3.9.tgz",
+ "integrity": "sha512-xliiE9H09xCycndlua4QjajN8q5k/ET6VCv+e0Jjodxr9+cmoOP/6QY9dun9ptokuwR8TK0qOaIJ8z4fgslVSA==",
+ "license": "MIT",
+ "dependencies": {
+ "@microsoft/applicationinsights-shims": "3.0.1",
+ "@microsoft/dynamicproto-js": "^2.0.3",
+ "@nevware21/ts-async": ">= 0.5.4 < 2.x",
+ "@nevware21/ts-utils": ">= 0.11.8 < 2.x"
+ },
+ "peerDependencies": {
+ "tslib": ">= 1.0.0"
+ }
+ },
+ "node_modules/@microsoft/applicationinsights-dependencies-js": {
+ "version": "3.3.9",
+ "resolved": "https://registry.npmjs.org/@microsoft/applicationinsights-dependencies-js/-/applicationinsights-dependencies-js-3.3.9.tgz",
+ "integrity": "sha512-I8MiU0S2EB0H+Pz2X5PaV1BcqLHmWRSJDVhvxATvLGshwCRNSoXPSNf4Ami2mjVBKNH9GrSj01s6vrSUrSBsoQ==",
+ "license": "MIT",
+ "dependencies": {
+ "@microsoft/applicationinsights-common": "3.3.9",
+ "@microsoft/applicationinsights-core-js": "3.3.9",
+ "@microsoft/applicationinsights-shims": "3.0.1",
+ "@microsoft/dynamicproto-js": "^2.0.3",
+ "@nevware21/ts-async": ">= 0.5.4 < 2.x",
+ "@nevware21/ts-utils": ">= 0.11.8 < 2.x"
+ },
+ "peerDependencies": {
+ "tslib": ">= 1.0.0"
+ }
+ },
+ "node_modules/@microsoft/applicationinsights-properties-js": {
+ "version": "3.3.9",
+ "resolved": "https://registry.npmjs.org/@microsoft/applicationinsights-properties-js/-/applicationinsights-properties-js-3.3.9.tgz",
+ "integrity": "sha512-8CPrqLgFCrFMaUWQoHEXMGSG6Ykn9wxfDxBeEHI6yUSvnkeolnP0Mwg+6NRdHcVbiNnO4itGBJC+Icu0Eq7Xeg==",
+ "license": "MIT",
+ "dependencies": {
+ "@microsoft/applicationinsights-common": "3.3.9",
+ "@microsoft/applicationinsights-core-js": "3.3.9",
+ "@microsoft/applicationinsights-shims": "3.0.1",
+ "@microsoft/dynamicproto-js": "^2.0.3",
+ "@nevware21/ts-utils": ">= 0.11.8 < 2.x"
+ },
+ "peerDependencies": {
+ "tslib": ">= 1.0.0"
+ }
+ },
+ "node_modules/@microsoft/applicationinsights-shims": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/@microsoft/applicationinsights-shims/-/applicationinsights-shims-3.0.1.tgz",
+ "integrity": "sha512-DKwboF47H1nb33rSUfjqI6ryX29v+2QWcTrRvcQDA32AZr5Ilkr7whOOSsD1aBzwqX0RJEIP1Z81jfE3NBm/Lg==",
+ "license": "MIT",
+ "dependencies": {
+ "@nevware21/ts-utils": ">= 0.9.4 < 2.x"
+ }
+ },
+ "node_modules/@microsoft/applicationinsights-web": {
+ "version": "3.3.9",
+ "resolved": "https://registry.npmjs.org/@microsoft/applicationinsights-web/-/applicationinsights-web-3.3.9.tgz",
+ "integrity": "sha512-sphOpJwjq0AVcUCxaoZYeB9nsMcxRgpZ6Jt8raqMIn0WdvgcSi51yFW4BE2gk8G8z4E8umnkEvYIb8SmEpkm1A==",
+ "license": "MIT",
+ "dependencies": {
+ "@microsoft/applicationinsights-analytics-js": "3.3.9",
+ "@microsoft/applicationinsights-cfgsync-js": "3.3.9",
+ "@microsoft/applicationinsights-channel-js": "3.3.9",
+ "@microsoft/applicationinsights-common": "3.3.9",
+ "@microsoft/applicationinsights-core-js": "3.3.9",
+ "@microsoft/applicationinsights-dependencies-js": "3.3.9",
+ "@microsoft/applicationinsights-properties-js": "3.3.9",
+ "@microsoft/applicationinsights-shims": "3.0.1",
+ "@microsoft/dynamicproto-js": "^2.0.3",
+ "@nevware21/ts-async": ">= 0.5.4 < 2.x",
+ "@nevware21/ts-utils": ">= 0.11.8 < 2.x"
+ },
+ "peerDependencies": {
+ "tslib": ">= 1.0.0"
+ }
+ },
+ "node_modules/@microsoft/dynamicproto-js": {
+ "version": "2.0.3",
+ "resolved": "https://registry.npmjs.org/@microsoft/dynamicproto-js/-/dynamicproto-js-2.0.3.tgz",
+ "integrity": "sha512-JTWTU80rMy3mdxOjjpaiDQsTLZ6YSGGqsjURsY6AUQtIj0udlF/jYmhdLZu8693ZIC0T1IwYnFa0+QeiMnziBA==",
+ "license": "MIT",
+ "dependencies": {
+ "@nevware21/ts-utils": ">= 0.10.4 < 2.x"
+ }
+ },
+ "node_modules/@nevware21/ts-async": {
+ "version": "0.5.4",
+ "resolved": "https://registry.npmjs.org/@nevware21/ts-async/-/ts-async-0.5.4.tgz",
+ "integrity": "sha512-IBTyj29GwGlxfzXw2NPnzty+w0Adx61Eze1/lknH/XIVdxtF9UnOpk76tnrHXWa6j84a1RR9hsOcHQPFv9qJjA==",
+ "license": "MIT",
+ "dependencies": {
+ "@nevware21/ts-utils": ">= 0.11.6 < 2.x"
+ }
+ },
+ "node_modules/@nevware21/ts-utils": {
+ "version": "0.12.5",
+ "resolved": "https://registry.npmjs.org/@nevware21/ts-utils/-/ts-utils-0.12.5.tgz",
+ "integrity": "sha512-JPQZWPKQJjj7kAftdEZL0XDFfbMgXCGiUAZe0d7EhLC3QlXTlZdSckGqqRIQ2QNl0VTEZyZUvRBw6Ednw089Fw==",
+ "license": "MIT"
+ },
"node_modules/@nodelib/fs.scandir": {
"version": "2.1.5",
"resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz",
@@ -4765,6 +4934,12 @@
"typescript": ">=4.8.4"
}
},
+ "node_modules/tslib": {
+ "version": "2.8.1",
+ "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz",
+ "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==",
+ "license": "0BSD"
+ },
"node_modules/type-check": {
"version": "0.4.0",
"resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz",
diff --git a/package.json b/package.json
index 95f74a6..5f3d119 100644
--- a/package.json
+++ b/package.json
@@ -32,6 +32,7 @@
"vitest": "^3.2.2"
},
"dependencies": {
+ "@microsoft/applicationinsights-web": "^3.3.9",
"@vitejs/plugin-react": "^4.3.4",
"@vitejs/plugin-vue": "^5.2.1",
"marked": "^15.0.7",
diff --git a/public/docs/get-started/docker-concepts/building-images/build-tag-and-publish-an-image.md b/public/docs/get-started/docker-concepts/building-images/build-tag-and-publish-an-image.md
index 6bb8a52..29884e5 100644
--- a/public/docs/get-started/docker-concepts/building-images/build-tag-and-publish-an-image.md
+++ b/public/docs/get-started/docker-concepts/building-images/build-tag-and-publish-an-image.md
@@ -2,10 +2,12 @@
diff --git a/public/docs/get-started/docker-concepts/building-images/multi-stage-builds.md b/public/docs/get-started/docker-concepts/building-images/multi-stage-builds.md
index cd961d9..33a4fc4 100644
--- a/public/docs/get-started/docker-concepts/building-images/multi-stage-builds.md
+++ b/public/docs/get-started/docker-concepts/building-images/multi-stage-builds.md
@@ -1,10 +1,14 @@
# Multi-stage builds
diff --git a/public/docs/get-started/docker-concepts/building-images/understanding-image-layers.md b/public/docs/get-started/docker-concepts/building-images/understanding-image-layers.md
index 673abf5..44d080e 100644
--- a/public/docs/get-started/docker-concepts/building-images/understanding-image-layers.md
+++ b/public/docs/get-started/docker-concepts/building-images/understanding-image-layers.md
@@ -2,10 +2,12 @@
diff --git a/public/docs/get-started/docker-concepts/building-images/using-the-build-cache.md b/public/docs/get-started/docker-concepts/building-images/using-the-build-cache.md
index 2bfc09e..10c2f30 100644
--- a/public/docs/get-started/docker-concepts/building-images/using-the-build-cache.md
+++ b/public/docs/get-started/docker-concepts/building-images/using-the-build-cache.md
@@ -2,10 +2,12 @@
diff --git a/public/docs/get-started/docker-concepts/building-images/writing-a-dockerfile.md b/public/docs/get-started/docker-concepts/building-images/writing-a-dockerfile.md
index ec640e6..e8db04d 100644
--- a/public/docs/get-started/docker-concepts/building-images/writing-a-dockerfile.md
+++ b/public/docs/get-started/docker-concepts/building-images/writing-a-dockerfile.md
@@ -2,10 +2,12 @@
diff --git a/public/docs/get-started/docker-concepts/running-containers/multi-container-applications.md b/public/docs/get-started/docker-concepts/running-containers/multi-container-applications.md
index ca9e8a9..8b2b0cd 100644
--- a/public/docs/get-started/docker-concepts/running-containers/multi-container-applications.md
+++ b/public/docs/get-started/docker-concepts/running-containers/multi-container-applications.md
@@ -2,10 +2,12 @@
diff --git a/public/docs/get-started/docker-concepts/running-containers/overriding-container-defaults.md b/public/docs/get-started/docker-concepts/running-containers/overriding-container-defaults.md
index c75712d..e352108 100644
--- a/public/docs/get-started/docker-concepts/running-containers/overriding-container-defaults.md
+++ b/public/docs/get-started/docker-concepts/running-containers/overriding-container-defaults.md
@@ -2,10 +2,12 @@
diff --git a/public/docs/get-started/docker-concepts/running-containers/persisting-container-data.md b/public/docs/get-started/docker-concepts/running-containers/persisting-container-data.md
index 6337281..912b8f4 100644
--- a/public/docs/get-started/docker-concepts/running-containers/persisting-container-data.md
+++ b/public/docs/get-started/docker-concepts/running-containers/persisting-container-data.md
@@ -2,10 +2,12 @@
diff --git a/public/docs/get-started/docker-concepts/running-containers/publishing-ports.md b/public/docs/get-started/docker-concepts/running-containers/publishing-ports.md
index a8daa0f..77f45db 100644
--- a/public/docs/get-started/docker-concepts/running-containers/publishing-ports.md
+++ b/public/docs/get-started/docker-concepts/running-containers/publishing-ports.md
@@ -2,10 +2,12 @@
diff --git a/public/docs/get-started/docker-concepts/running-containers/sharing-local-files.md b/public/docs/get-started/docker-concepts/running-containers/sharing-local-files.md
index f706fa9..9d38239 100644
--- a/public/docs/get-started/docker-concepts/running-containers/sharing-local-files.md
+++ b/public/docs/get-started/docker-concepts/running-containers/sharing-local-files.md
@@ -2,10 +2,12 @@
diff --git a/public/docs/get-started/docker-concepts/the-basics/what-is-a-container.md b/public/docs/get-started/docker-concepts/the-basics/what-is-a-container.md
index 0e8432b..7ea6c57 100644
--- a/public/docs/get-started/docker-concepts/the-basics/what-is-a-container.md
+++ b/public/docs/get-started/docker-concepts/the-basics/what-is-a-container.md
@@ -2,10 +2,12 @@
diff --git a/public/docs/get-started/docker-concepts/the-basics/what-is-a-registry.md b/public/docs/get-started/docker-concepts/the-basics/what-is-a-registry.md
index d49ec3e..91baf23 100644
--- a/public/docs/get-started/docker-concepts/the-basics/what-is-a-registry.md
+++ b/public/docs/get-started/docker-concepts/the-basics/what-is-a-registry.md
@@ -2,10 +2,12 @@
diff --git a/public/docs/get-started/docker-concepts/the-basics/what-is-an-image.md b/public/docs/get-started/docker-concepts/the-basics/what-is-an-image.md
index 59fefa6..c4642c0 100644
--- a/public/docs/get-started/docker-concepts/the-basics/what-is-an-image.md
+++ b/public/docs/get-started/docker-concepts/the-basics/what-is-an-image.md
@@ -2,10 +2,12 @@
diff --git a/public/docs/get-started/docker-concepts/the-basics/what-is-docker-compose.md b/public/docs/get-started/docker-concepts/the-basics/what-is-docker-compose.md
index fe04a51..bd034dd 100644
--- a/public/docs/get-started/docker-concepts/the-basics/what-is-docker-compose.md
+++ b/public/docs/get-started/docker-concepts/the-basics/what-is-docker-compose.md
@@ -2,10 +2,12 @@
diff --git a/public/docs/get-started/introduction/build-and-push-first-image.md b/public/docs/get-started/introduction/build-and-push-first-image.md
index 0ab46dc..787b172 100644
--- a/public/docs/get-started/introduction/build-and-push-first-image.md
+++ b/public/docs/get-started/introduction/build-and-push-first-image.md
@@ -2,10 +2,12 @@
diff --git a/public/docs/get-started/introduction/develop-with-containers.md b/public/docs/get-started/introduction/develop-with-containers.md
index e1a2529..81a5819 100644
--- a/public/docs/get-started/introduction/develop-with-containers.md
+++ b/public/docs/get-started/introduction/develop-with-containers.md
@@ -2,10 +2,12 @@
diff --git a/public/docs/get-started/introduction/get-docker-desktop.md b/public/docs/get-started/introduction/get-docker-desktop.md
index 8cd678c..15fcfe7 100644
--- a/public/docs/get-started/introduction/get-docker-desktop.md
+++ b/public/docs/get-started/introduction/get-docker-desktop.md
@@ -2,10 +2,12 @@
diff --git a/src/scripts/main.ts b/src/scripts/main.ts
index 0c11298..62dab0b 100644
--- a/src/scripts/main.ts
+++ b/src/scripts/main.ts
@@ -6,6 +6,34 @@ import './components/card-component';
import { initializeMarkdownLoader } from './load_md';
import { initializeTableContents } from './table-contents';
import { initializeBreadcrumb } from './breadcrumb';
+import { ApplicationInsights } from '@microsoft/applicationinsights-web';
+
+// Application Insights 초기화
+const appInsights = new ApplicationInsights({
+ config: {
+ connectionString:
+ 'InstrumentationKey=7bea0293-01dc-409c-9471-3a65567b11ed;IngestionEndpoint=https://koreacentral-0.in.applicationinsights.azure.com/;LiveEndpoint=https://koreacentral.livediagnostics.monitor.azure.com/;ApplicationId=ddbe985c-4d7a-41e4-80a8-a3961068933b',
+ enableAutoRouteTracking: true, // SPA 라우팅 자동 추적
+ enableCorsCorrelation: true,
+ enableRequestHeaderTracking: true,
+ enableResponseHeaderTracking: false, // 서버 응답 헤더 수집 불필요
+ enableAjaxErrorStatusText: true,
+ enableAjaxPerfTracking: true,
+ enableUnhandledPromiseRejectionTracking: true,
+ disableAjaxTracking: false,
+ disableFetchTracking: false,
+ loggingLevelConsole: 0, // 콘솔 로깅 비활성화
+ loggingLevelTelemetry: 1,
+ maxBatchSizeInBytes: 10000,
+ maxBatchInterval: 15000,
+ disableDataLossAnalysis: true,
+ disableCorrelationHeaders: false,
+ distributedTracingMode: 0, // 단일 서비스이므로 분산 추적 비활성화
+ enablePerfMgr: false,
+ },
+});
+appInsights.loadAppInsights();
+appInsights.trackPageView(); // Manually call trackPageView to establish the current user/session/pageview
document.addEventListener('DOMContentLoaded', async () => {
try {
diff --git a/src/styles/style.css b/src/styles/style.css
index 8f3e27e..a1527d8 100644
--- a/src/styles/style.css
+++ b/src/styles/style.css
@@ -1,5 +1,45 @@
@import 'tailwindcss';
+/* 기본 폰트 설정 */
+@layer base {
+ /* 한국어 텍스트에 최적화된 시스템 폰트 스택 */
+ html {
+ font-family:
+ -apple-system, BlinkMacSystemFont, 'Apple SD Gothic Neo', 'Noto Sans KR',
+ 'Malgun Gothic', '맑은 고딕', 'Segoe UI', Roboto, 'Helvetica Neue', Arial,
+ sans-serif;
+ }
+
+ /* 외부 웹폰트 최적화 (Google Fonts 등) */
+ @font-face {
+ font-family: 'Google Fonts Fallback';
+ src: local('system-ui'), local('-apple-system');
+ font-display: swap;
+ }
+}
+
+/* YouTube iframe 최적화 */
+@layer components {
+ .youtube-video {
+ @apply relative mx-auto w-full;
+ aspect-ratio: 16 / 9; /* 모던 브라우저용 */
+ /* 레거시 브라우저 대체 */
+ padding-bottom: 56.25%; /* 16:9 종횡비 */
+ }
+
+ /* 모던 브라우저에서 padding-bottom 제거 */
+ @supports (aspect-ratio: 16 / 9) {
+ .youtube-video {
+ padding-bottom: 0;
+ }
+ }
+
+ .youtube-video iframe {
+ @apply absolute top-0 left-0 h-full w-full rounded-lg;
+ border: none; /* frameborder 대체 */
+ }
+}
+
/* 카드 컴포넌트 스타일 */
@layer components {
.card {