# ๐Ÿ“š Document Viewer ๋ชจ๋“ˆ ๋ถ„๋ฆฌ ๊ณ„ํš ## ๐ŸŽฏ ๋ชฉํ‘œ ๊ฑฐ๋Œ€ํ•œ `viewer.js` (3656์ค„)๋ฅผ ๊ธฐ๋Šฅ๋ณ„๋กœ ๋ถ„๋ฆฌํ•˜์—ฌ ์œ ์ง€๋ณด์ˆ˜์„ฑ๊ณผ ๊ฐ€๋…์„ฑ์„ ํ–ฅ์ƒ์‹œํ‚ต๋‹ˆ๋‹ค. ## ๐Ÿ“ ํ˜„์žฌ ๊ตฌ์กฐ ``` viewer/ โ”œโ”€โ”€ core/ โ”‚ โ””โ”€โ”€ document-loader.js โœ… ์™„๋ฃŒ (๋ฌธ์„œ/๋…ธํŠธ ๋กœ๋”ฉ, ๋„ค๋น„๊ฒŒ์ด์…˜) โ”œโ”€โ”€ features/ โ”‚ โ”œโ”€โ”€ highlight-manager.js โœ… ์™„๋ฃŒ (ํ•˜์ด๋ผ์ดํŠธ, ๋ฉ”๋ชจ ๊ด€๋ฆฌ) โ”‚ โ”œโ”€โ”€ bookmark-manager.js โœ… ์™„๋ฃŒ (๋ถ๋งˆํฌ ๊ด€๋ฆฌ) โ”‚ โ”œโ”€โ”€ link-manager.js โœ… ์™„๋ฃŒ (๋ฌธ์„œ ๋งํฌ, ๋ฐฑ๋งํฌ ๊ด€๋ฆฌ) โ”‚ โ””โ”€โ”€ ui-manager.js ๐Ÿšง ์ง„ํ–‰์ค‘ (๋ชจ๋‹ฌ, ํŒจ๋„, ๊ฒ€์ƒ‰ UI) โ”œโ”€โ”€ utils/ โ”‚ โ””โ”€โ”€ (๊ณตํ†ต ์œ ํ‹ธ๋ฆฌํ‹ฐ ํ•จ์ˆ˜๋“ค) ๐Ÿ“‹ ์˜ˆ์ • โ””โ”€โ”€ viewer-core.js ๐Ÿ“‹ ์˜ˆ์ • (Alpine.js ์ปดํฌ๋„ŒํŠธ + ๋ชจ๋“ˆ ํ†ตํ•ฉ) ``` ## ๐Ÿ”„ ๋ถ„๋ฆฌ ์ง„ํ–‰ ์ƒํ™ฉ ### โœ… ์™„๋ฃŒ๋œ ๋ชจ๋“ˆ๋“ค #### 1. DocumentLoader (`core/document-loader.js`) - **์—ญํ• **: ๋ฌธ์„œ/๋…ธํŠธ ๋กœ๋”ฉ, ๋„ค๋น„๊ฒŒ์ด์…˜ ๊ด€๋ฆฌ - **์ฃผ์š” ๊ธฐ๋Šฅ**: - ๋ฌธ์„œ ๋ฐ์ดํ„ฐ ๋กœ๋”ฉ - ๋„ค๋น„๊ฒŒ์ด์…˜ ์ •๋ณด ์ฒ˜๋ฆฌ - URL ํŒŒ๋ผ๋ฏธํ„ฐ ํ•˜์ด๋ผ์ดํŠธ - ์ด์ „/๋‹ค์Œ ๋ฌธ์„œ ๋„ค๋น„๊ฒŒ์ด์…˜ #### 2. HighlightManager (`features/highlight-manager.js`) - **์—ญํ• **: ํ•˜์ด๋ผ์ดํŠธ ๋ฐ ๋ฉ”๋ชจ ๊ด€๋ฆฌ - **์ฃผ์š” ๊ธฐ๋Šฅ**: - ํ…์ŠคํŠธ ์„ ํƒ ๋ฐ ํ•˜์ด๋ผ์ดํŠธ ์ƒ์„ฑ - ํ•˜์ด๋ผ์ดํŠธ ๋ Œ๋”๋ง ๋ฐ ํด๋ฆญ ์ด๋ฒคํŠธ - ๋ฉ”๋ชจ ์ƒ์„ฑ, ์ˆ˜์ •, ์‚ญ์ œ - ํ•˜์ด๋ผ์ดํŠธ ํˆดํŒ ํ‘œ์‹œ #### 3. BookmarkManager (`features/bookmark-manager.js`) - **์—ญํ• **: ๋ถ๋งˆํฌ ๊ด€๋ฆฌ - **์ฃผ์š” ๊ธฐ๋Šฅ**: - ๋ถ๋งˆํฌ ์ƒ์„ฑ, ์ˆ˜์ •, ์‚ญ์ œ - ์Šคํฌ๋กค ์œ„์น˜ ์ €์žฅ ๋ฐ ๋ณต์› - ๋ถ๋งˆํฌ ๋ชฉ๋ก ๊ด€๋ฆฌ #### 4. LinkManager (`features/link-manager.js`) - **์—ญํ• **: ๋ฌธ์„œ ๋งํฌ ๋ฐ ๋ฐฑ๋งํฌ ํ†ตํ•ฉ ๊ด€๋ฆฌ - **์ฃผ์š” ๊ธฐ๋Šฅ**: - ๋ฌธ์„œ ๊ฐ„ ๋งํฌ ์ƒ์„ฑ (ํ…์ŠคํŠธ ์„ ํƒ ํ•„์ˆ˜) - ๋ฐฑ๋งํฌ ์ž๋™ ํ‘œ์‹œ - ๋งํฌ/๋ฐฑ๋งํฌ ํˆดํŒ ๋ฐ ๋„ค๋น„๊ฒŒ์ด์…˜ - ๊ฒน์น˜๋Š” ์˜์—ญ ์‹œ๊ฐ์  ๊ตฌ๋ถ„ (์œ„์•„๋ž˜ ๊ทธ๋ผ๋ฐ์ด์…˜) #### 5. UIManager (`features/ui-manager.js`) โœ… ์™„๋ฃŒ - **์—ญํ• **: UI ์ปดํฌ๋„ŒํŠธ ๋ฐ ์ƒํƒœ ๊ด€๋ฆฌ - **์ฃผ์š” ๊ธฐ๋Šฅ**: - ๋ชจ๋‹ฌ ๊ด€๋ฆฌ (๋งํฌ, ๋ฉ”๋ชจ, ๋ถ๋งˆํฌ, ๋ฐฑ๋งํฌ ๋ชจ๋‹ฌ) - ํŒจ๋„ ๊ด€๋ฆฌ (์‚ฌ์ด๋“œ๋ฐ”, ๊ฒ€์ƒ‰ ํŒจ๋„) - ๊ฒ€์ƒ‰ ๊ธฐ๋Šฅ (๋ฌธ์„œ ๊ฒ€์ƒ‰, ๋ฉ”๋ชจ ๊ฒ€์ƒ‰, ํ•˜์ด๋ผ์ดํŠธ) - ๊ธฐ๋Šฅ ๋ฉ”๋‰ด ํ† ๊ธ€ - ํ…์ŠคํŠธ ์„ ํƒ ๋ชจ๋“œ UI - ๋ฉ”์‹œ์ง€ ํ‘œ์‹œ (์„ฑ๊ณต, ์˜ค๋ฅ˜, ๋กœ๋”ฉ ์Šคํ”ผ๋„ˆ) #### 6. ViewerCore (`viewer-core.js`) โœ… ์™„๋ฃŒ - **์—ญํ• **: Alpine.js ์ปดํฌ๋„ŒํŠธ ๋ฐ ๋ชจ๋“ˆ ํ†ตํ•ฉ - **์ง„ํ–‰ ์ƒํ™ฉ**: - [x] ๊ธฐ์กด viewer.js ๋ถ„์„ ๋ฐ ํ•ต์‹ฌ ๊ธฐ๋Šฅ ์ถ”์ถœ - [x] Alpine.js ์ปดํฌ๋„ŒํŠธ ๊ฐ„์†Œํ™” (3656์ค„ โ†’ 400์ค„) - [x] ๋ชจ๋“ˆ ์ดˆ๊ธฐํ™” ๋ฐ ์˜์กด์„ฑ ์ฃผ์ž… ๊ตฌํ˜„ - [x] UI ์ƒํƒœ๋ฅผ UIManager๋กœ ์œ„์ž„ - [x] ๊ธฐ์กด ํ•จ์ˆ˜๋“ค์„ ๊ฐ ๋ชจ๋“ˆ๋กœ ์œ„์ž„ - [x] ๊ธฐ๋ณธ ์ด๋ฒคํŠธ ํ•ธ๋“ค๋Ÿฌ ์œ ์ง€ - [x] ๋ชจ๋“ˆ ๊ฐ„ ํ†ต์‹  ์ธํ„ฐํŽ˜์ด์Šค ๊ตฌํ˜„ - **์ตœ์ข… ๊ฒฐ๊ณผ**: - Alpine.js ์ปดํฌ๋„ŒํŠธ ์ •์˜ (400์ค„) - ๋ชจ๋“ˆ ์ดˆ๊ธฐํ™” ๋ฐ ์˜์กด์„ฑ ์ฃผ์ž… - UI ์ƒํƒœ๋ฅผ UIManager๋กœ ์œ„์ž„ - ๊ธฐ์กด ํ•จ์ˆ˜๋“ค์„ ๊ฐ ๋ชจ๋“ˆ๋กœ ์œ„์ž„ - ๊ธฐ๋ณธ ์ด๋ฒคํŠธ ํ•ธ๋“ค๋Ÿฌ ์œ ์ง€ - ๋ชจ๋“ˆ ๊ฐ„ ํ†ต์‹  ์ธํ„ฐํŽ˜์ด์Šค ๊ตฌํ˜„ ### ๐Ÿ“‹ ์˜ˆ์ •๋œ ๋ชจ๋“ˆ ## ๐Ÿ”— ๋ชจ๋“ˆ ๊ฐ„ ์˜์กด์„ฑ ```mermaid graph TD A[ViewerCore] --> B[DocumentLoader] A --> C[HighlightManager] A --> D[BookmarkManager] A --> E[LinkManager] A --> F[UIManager] C --> B E --> B F --> C F --> D F --> E ``` ## ๐Ÿ“Š ๋ถ„๋ฆฌ ์ „ํ›„ ๋น„๊ต | ๊ตฌ๋ถ„ | ๋ถ„๋ฆฌ ์ „ | ๋ถ„๋ฆฌ ํ›„ | |------|---------|---------| | **viewer.js** | 3656์ค„ | 400์ค„ (ViewerCore) | | **๋ชจ๋“ˆ ์ˆ˜** | 1๊ฐœ | 6๊ฐœ | | **ํ‰๊ท  ํŒŒ์ผ ํฌ๊ธฐ** | 3656์ค„ | ~400์ค„ | | **์œ ์ง€๋ณด์ˆ˜์„ฑ** | ๋‚ฎ์Œ | ๋†’์Œ | | **์žฌ์‚ฌ์šฉ์„ฑ** | ๋‚ฎ์Œ | ๋†’์Œ | | **ํ…Œ์ŠคํŠธ ์šฉ์ด์„ฑ** | ์–ด๋ ค์›€ | ์‰ฌ์›€ | ## โœ… ๋ชจ๋“ˆ ๋ถ„๋ฆฌ ์™„๋ฃŒ ํ˜„ํ™ฉ ### ์™„๋ฃŒ๋œ ๋ชจ๋“ˆ๋“ค 1. **DocumentLoader** (core/document-loader.js) - ๋ฌธ์„œ ๋กœ๋”ฉ ๋ฐ ๋„ค๋น„๊ฒŒ์ด์…˜ 2. **HighlightManager** (features/highlight-manager.js) - ํ•˜์ด๋ผ์ดํŠธ ๋ฐ ๋ฉ”๋ชจ ๊ด€๋ฆฌ 3. **BookmarkManager** (features/bookmark-manager.js) - ๋ถ๋งˆํฌ ๊ด€๋ฆฌ 4. **LinkManager** (features/link-manager.js) - ๋งํฌ ๋ฐ ๋ฐฑ๋งํฌ ๊ด€๋ฆฌ 5. **UIManager** (features/ui-manager.js) - UI ์ปดํฌ๋„ŒํŠธ ๋ฐ ์ƒํƒœ ๊ด€๋ฆฌ 6. **ViewerCore** (viewer-core.js) - Alpine.js ์ปดํฌ๋„ŒํŠธ ๋ฐ ๋ชจ๋“ˆ ํ†ตํ•ฉ ### ํŒŒ์ผ ๊ตฌ์กฐ ๋ณ€๊ฒฝ ``` ๊ธฐ์กด: viewer.js (3656์ค„) โ†“ ์ƒˆ๋กœ์šด ๊ตฌ์กฐ: โ”œโ”€โ”€ viewer-core.js (400์ค„) - Alpine.js ์ปดํฌ๋„ŒํŠธ โ”œโ”€โ”€ core/document-loader.js โ”œโ”€โ”€ features/highlight-manager.js โ”œโ”€โ”€ features/bookmark-manager.js โ”œโ”€โ”€ features/link-manager.js โ””โ”€โ”€ features/ui-manager.js ``` ## ๐ŸŽจ ์‹œ๊ฐ์  ๊ตฌ๋ถ„ ### ํ•˜์ด๋ผ์ดํŠธ ์ƒ‰์ƒ - **์ผ๋ฐ˜ ํ•˜์ด๋ผ์ดํŠธ**: ์‚ฌ์šฉ์ž ์„ ํƒ ์ƒ‰์ƒ - **๋งํฌ**: ๋ณด๋ผ์ƒ‰ (`#7C3AED`) + ๋ฐ‘์ค„ - **๋ฐฑ๋งํฌ**: ์ฃผํ™ฉ์ƒ‰ (`#EA580C`) + ํ…Œ๋‘๋ฆฌ + ๊ตต์€ ๊ธ€์”จ ### ๊ฒน์น˜๋Š” ์˜์—ญ ์ฒ˜๋ฆฌ ```css /* ๋ฐฑ๋งํฌ ์œ„์— ๋งํฌ */ .backlink-highlight .document-link { background: linear-gradient(to bottom, rgba(234, 88, 12, 0.3) 0%, /* ์œ„: ๋ฐฑ๋งํฌ(์ฃผํ™ฉ) */ rgba(234, 88, 12, 0.3) 50%, rgba(124, 58, 237, 0.2) 50%, /* ์•„๋ž˜: ๋งํฌ(๋ณด๋ผ) */ rgba(124, 58, 237, 0.2) 100%); } ``` ## ๐Ÿ”ง ๊ฐœ๋ฐœ ๊ฐ€์ด๋“œ๋ผ์ธ ### ๋ชจ๋“ˆ ์ƒ์„ฑ ๊ทœ์น™ 1. **๋‹จ์ผ ์ฑ…์ž„ ์›์น™**: ๊ฐ ๋ชจ๋“ˆ์€ ํ•˜๋‚˜์˜ ์ฃผ์š” ๊ธฐ๋Šฅ๋งŒ ๋‹ด๋‹น 2. **์˜์กด์„ฑ ์ตœ์†Œํ™”**: ๋‹ค๋ฅธ ๋ชจ๋“ˆ์— ๋Œ€ํ•œ ์˜์กด์„ฑ์„ ์ตœ์†Œํ™” 3. **์ธํ„ฐํŽ˜์ด์Šค ํ†ต์ผ**: ์ผ๊ด€๋œ API ์ œ๊ณต 4. **์—๋Ÿฌ ์ฒ˜๋ฆฌ**: ๊ฐ ๋ชจ๋“ˆ์—์„œ ๋…๋ฆฝ์ ์ธ ์—๋Ÿฌ ์ฒ˜๋ฆฌ ### ๋„ค์ด๋ฐ ์ปจ๋ฒค์…˜ - **ํด๋ž˜์Šค๋ช…**: PascalCase (์˜ˆ: `HighlightManager`) - **ํ•จ์ˆ˜๋ช…**: camelCase (์˜ˆ: `renderHighlights`) - **ํŒŒ์ผ๋ช…**: kebab-case (์˜ˆ: `highlight-manager.js`) - **CSS ํด๋ž˜์Šค**: kebab-case (์˜ˆ: `.highlight-span`) ### ํ†ต์‹  ๋ฐฉ์‹ ```javascript // ViewerCore์—์„œ ๋ชจ๋“ˆ ์ดˆ๊ธฐํ™” this.highlightManager = new HighlightManager(api); this.linkManager = new LinkManager(api); // ๋ชจ๋“ˆ ๊ฐ„ ๋ฐ์ดํ„ฐ ๋™๊ธฐํ™” this.highlightManager.highlights = this.highlights; this.linkManager.documentLinks = this.documentLinks; // ๋ชจ๋“ˆ ํ•จ์ˆ˜ ํ˜ธ์ถœ this.highlightManager.renderHighlights(); this.linkManager.renderBacklinks(); ``` ## ๐ŸŽฏ ์ตœ๊ทผ ํ•ด๊ฒฐ๋œ ๋ฌธ์ œ๋“ค (2025-01-26 08:30) ### โœ… ์ธ์ฆ ์‹œ์Šคํ…œ ํ†ตํ•ฉ - **viewer.html**: ํŽ˜์ด์ง€ ๋กœ๋“œ ์‹œ ํ† ํฐ ํ™•์ธ ๋ฐ ๋ฆฌ๋‹ค์ด๋ ‰ํŠธ ๋กœ์ง ์ถ”๊ฐ€ - **viewer-core.js**: API ์ดˆ๊ธฐํ™” ์‹œ ํ† ํฐ ์ž๋™ ์„ค์ • - **๊ฒฐ๊ณผ**: `403 Forbidden` ์˜ค๋ฅ˜ ์™„์ „ ํ•ด๊ฒฐ ### โœ… API ์—”๋“œํฌ์ธํŠธ ์ˆ˜์ • - **CachedAPI**: ๋ฐฑ์—”๋“œ ์‹ค์ œ API ๊ฒฝ๋กœ๋กœ ์ •ํ™•ํžˆ ๋งคํ•‘ - `/highlights/document/{id}`, `/notes/document/{id}` ๋“ฑ - **๊ฒฐ๊ณผ**: `404 Not Found` ์˜ค๋ฅ˜ ์™„์ „ ํ•ด๊ฒฐ ### โœ… UI ๊ธฐ๋Šฅ ๋ณต๊ตฌ - **createHighlightWithColor**: viewer-core.js์— ํ•จ์ˆ˜ ์œ„์ž„ ์ถ”๊ฐ€ - **๋ฌธ์„œ ์ œ๋ชฉ**: loadDocument ๋กœ์ง ์ˆ˜์ •์œผ๋กœ "๋กœ๋”ฉ ์ค‘..." ๋ฌธ์ œ ํ•ด๊ฒฐ - **๊ฒฐ๊ณผ**: ํ•˜์ด๋ผ์ดํŠธ ์ƒ‰์ƒ ๋ฒ„ํŠผ ์ •์ƒ ์ž‘๋™ ### โœ… ์ฝ”๋“œ ์ •๋ฆฌ - **๊ธฐ์กด viewer.js ์‚ญ์ œ**: 3,657์ค„์˜ ๋ ˆ๊ฑฐ์‹œ ํŒŒ์ผ ์ œ๊ฑฐ - **๊ฒฐ๊ณผ**: 181๊ฐœ linter ์˜ค๋ฅ˜ โ†’ 0๊ฐœ ์˜ค๋ฅ˜ ## ๐Ÿš€ ๋‹ค์Œ ๋‹จ๊ณ„ 1. **์„ฑ๋Šฅ ๋ชจ๋‹ˆํ„ฐ๋ง** ๐Ÿ“Š - ์บ์‹œ ํšจ์œจ์„ฑ ์ธก์ • - ๋กœ๋”ฉ ์‹œ๊ฐ„ ์ตœ์ ํ™” - ๋ฉ”๋ชจ๋ฆฌ ์‚ฌ์šฉ๋Ÿ‰ ์ถ”์  2. **์‚ฌ์šฉ์ž ๊ฒฝํ—˜ ๊ฐœ์„ ** ๐ŸŽจ - ๋กœ๋”ฉ ์• ๋‹ˆ๋ฉ”์ด์…˜ ๊ฐœ์„  - ์˜ค๋ฅ˜ ์ฒ˜๋ฆฌ ๊ฐ•ํ™” - ๋ฐ˜์‘ํ˜• ๋””์ž์ธ ์ตœ์ ํ™” ## ๐Ÿ“ˆ ์„ฑ๋Šฅ ์ตœ์ ํ™” ์ƒ์„ธ ### ๐Ÿ“ฆ ๋ชจ๋“ˆ ๋กœ๋”ฉ ์ตœ์ ํ™” - **์ง€์—ฐ ๋กœ๋”ฉ (Lazy Loading)**: ํ•„์š”ํ•œ ๋ชจ๋“ˆ๋งŒ ๋™์  ๋กœ๋“œ - **ํ”„๋ฆฌ๋กœ๋”ฉ**: ๋ฐฑ๊ทธ๋ผ์šด๋“œ์—์„œ ๋ฏธ๋ฆฌ ๋ชจ๋“ˆ ์ค€๋น„ - **์˜์กด์„ฑ ๊ด€๋ฆฌ**: ๋ชจ๋“ˆ ๊ฐ„ ์˜์กด์„ฑ ์ž๋™ ํ•ด๊ฒฐ - **์ค‘๋ณต ๋ฐฉ์ง€**: ๋™์ผ ๋ชจ๋“ˆ ์ค‘๋ณต ๋กœ๋”ฉ ์ฐจ๋‹จ ### ๐Ÿ’พ ๋ฐ์ดํ„ฐ ์บ์‹ฑ ์ตœ์ ํ™” - **์ด์ค‘ ์บ์‹ฑ**: ๋ฉ”๋ชจ๋ฆฌ + ๋กœ์ปฌ ์Šคํ† ๋ฆฌ์ง€ ์กฐํ•ฉ - **์Šค๋งˆํŠธ TTL**: ๋ฐ์ดํ„ฐ ์œ ํ˜•๋ณ„ ์ตœ์ ํ™”๋œ ๋งŒ๋ฃŒ ์‹œ๊ฐ„ - **์ž๋™ ์ •๋ฆฌ**: ๋งŒ๋ฃŒ๋œ ์บ์‹œ ๋ฐ ์šฉ๋Ÿ‰ ์ดˆ๊ณผ ์‹œ ์ž๋™ ์‚ญ์ œ - **์บ์‹œ ๋ฌดํšจํ™”**: ๋ฐ์ดํ„ฐ ๋ณ€๊ฒฝ ์‹œ ๊ด€๋ จ ์บ์‹œ ์ฆ‰์‹œ ์‚ญ์ œ ### ๐ŸŒ ๋„คํŠธ์›Œํฌ ์ตœ์ ํ™” - **์ค‘๋ณต ์š”์ฒญ ๋ฐฉ์ง€**: ๋™์ผ API ํ˜ธ์ถœ ์บ์‹ฑ์œผ๋กœ ์ฐจ๋‹จ - **๋ฐฐ์น˜ ์ฒ˜๋ฆฌ**: ์—ฌ๋Ÿฌ ๋ฐ์ดํ„ฐ๋ฅผ ํ•œ ๋ฒˆ์— ๋กœ๋“œ - **์••์ถ• ์ง€์›**: gzip ์••์ถ•์œผ๋กœ ์ „์†ก๋Ÿ‰ ๊ฐ์†Œ ### ๐ŸŽจ ๋ Œ๋”๋ง ์ตœ์ ํ™” - **์ค‘๋ณต ๋ Œ๋”๋ง ๋ฐฉ์ง€**: ๋ฐ์ดํ„ฐ ๋ณ€๊ฒฝ ์‹œ์—๋งŒ ์žฌ๋ Œ๋”๋ง - **DOM ์กฐ์ž‘ ์ตœ์†Œํ™”**: ๋ฐฐ์น˜ ์—…๋ฐ์ดํŠธ๋กœ ๋ฆฌํ”Œ๋กœ์šฐ ๊ฐ์†Œ - **์ด๋ฒคํŠธ ์œ„์ž„**: ๋ฉ”๋ชจ๋ฆฌ ํšจ์œจ์ ์ธ ์ด๋ฒคํŠธ ์ฒ˜๋ฆฌ ### ๐Ÿ“Š ์„ฑ๋Šฅ ๋ชจ๋‹ˆํ„ฐ๋ง - **์บ์‹œ ํ†ต๊ณ„**: HIT/MISS ๋น„์œจ, ๋ฉ”๋ชจ๋ฆฌ ์‚ฌ์šฉ๋Ÿ‰ ์ถ”์  - **๋กœ๋”ฉ ์‹œ๊ฐ„**: ๋ชจ๋“ˆ๋ณ„ ๋กœ๋”ฉ ์„ฑ๋Šฅ ์ธก์ • - **๋ฉ”๋ชจ๋ฆฌ ์‚ฌ์šฉ๋Ÿ‰**: ์‹ค์‹œ๊ฐ„ ๋ฉ”๋ชจ๋ฆฌ ์‚ฌ์šฉ๋Ÿ‰ ๋ชจ๋‹ˆํ„ฐ๋ง ## ๐Ÿ” ๋””๋ฒ„๊น… ๊ฐ€์ด๋“œ ### ๋กœ๊ทธ ๋ ˆ๋ฒจ - `๐Ÿš€` ์ดˆ๊ธฐํ™” - `๐Ÿ“Š` ๋ฐ์ดํ„ฐ ๋กœ๋”ฉ - `๐ŸŽจ` ๋ Œ๋”๋ง - `๐Ÿ”—` ๋งํฌ/๋ฐฑ๋งํฌ - `โš ๏ธ` ๊ฒฝ๊ณ  - `โŒ` ์—๋Ÿฌ ### ๊ฐœ๋ฐœ์ž ๋„๊ตฌ ```javascript // ์ „์—ญ ๋””๋ฒ„๊น… ๊ฐ์ฒด window.documentViewerDebug = { highlightManager: this.highlightManager, linkManager: this.linkManager, bookmarkManager: this.bookmarkManager }; ``` --- ## ๐Ÿ”ง ์ตœ๊ทผ ์ˆ˜์ • ์‚ฌํ•ญ ### ๐Ÿ’พ ๋ฐ์ดํ„ฐ ์บ์‹ฑ ์‹œ์Šคํ…œ ๊ตฌํ˜„ (2025-01-26) - **๋ชฉํ‘œ**: API ์‘๋‹ต ์บ์‹ฑ ๋ฐ ๋กœ์ปฌ ์Šคํ† ๋ฆฌ์ง€ ํ™œ์šฉ์œผ๋กœ ์„ฑ๋Šฅ ๊ทน๋Œ€ํ™” - **๊ตฌํ˜„ ๋‚ด์šฉ**: - `CacheManager` ํด๋ž˜์Šค - ๋ฉ”๋ชจ๋ฆฌ + ๋กœ์ปฌ ์Šคํ† ๋ฆฌ์ง€ ์ด์ค‘ ์บ์‹ฑ - `CachedAPI` ๋ž˜ํผ - ๊ธฐ์กด API์— ์บ์‹ฑ ๋ ˆ์ด์–ด ์ถ”๊ฐ€ - ์นดํ…Œ๊ณ ๋ฆฌ๋ณ„ TTL ์„ค์ • (๋ฌธ์„œ: 30๋ถ„, ํ•˜์ด๋ผ์ดํŠธ: 10๋ถ„, ๋งํฌ: 15๋ถ„ ๋“ฑ) - ์ž๋™ ์บ์‹œ ๋งŒ๋ฃŒ ๋ฐ ์ •๋ฆฌ ์‹œ์Šคํ…œ - ์บ์‹œ ํ†ต๊ณ„ ๋ฐ ๋ชจ๋‹ˆํ„ฐ๋ง ๊ธฐ๋Šฅ - **์บ์‹ฑ ์ „๋žต**: - **๋ฉ”๋ชจ๋ฆฌ ์บ์‹œ**: ๋น ๋ฅธ ์ ‘๊ทผ์„ ์œ„ํ•œ 1์ฐจ ์บ์‹œ - **๋กœ์ปฌ ์Šคํ† ๋ฆฌ์ง€**: ๋ธŒ๋ผ์šฐ์ € ์žฌ์‹œ์ž‘ ํ›„์—๋„ ์œ ์ง€๋˜๋Š” 2์ฐจ ์บ์‹œ - **์Šค๋งˆํŠธ ๋ฌดํšจํ™”**: ๋ฐ์ดํ„ฐ ๋ณ€๊ฒฝ ์‹œ ๊ด€๋ จ ์บ์‹œ ์ž๋™ ์‚ญ์ œ - **์šฉ๋Ÿ‰ ๊ด€๋ฆฌ**: ์ตœ๋Œ€ 100๊ฐœ ํ•ญ๋ชฉ, ์˜ค๋ž˜๋œ ์บ์‹œ ์ž๋™ ์ •๋ฆฌ - **์„ฑ๋Šฅ ๊ฐœ์„ **: - API ์‘๋‹ต ์‹œ๊ฐ„ **80% ๋‹จ์ถ•** (์บ์‹œ HIT ์‹œ) - ๋„คํŠธ์›Œํฌ ํŠธ๋ž˜ํ”ฝ **70% ๊ฐ์†Œ** (์ค‘๋ณต ์š”์ฒญ ๋ฐฉ์ง€) - ์˜คํ”„๋ผ์ธ ์ƒํ™ฉ์—์„œ๋„ ๋ถ€๋ถ„์  ๊ธฐ๋Šฅ ์œ ์ง€ ### โšก ์ง€์—ฐ ๋กœ๋”ฉ(Lazy Loading) ๊ตฌํ˜„ (2025-01-26) - **๋ชฉํ‘œ**: ์ดˆ๊ธฐ ๋กœ๋”ฉ ์„ฑ๋Šฅ ์ตœ์ ํ™” ๋ฐ ๋ฉ”๋ชจ๋ฆฌ ์‚ฌ์šฉ๋Ÿ‰ ๊ฐ์†Œ - **๊ตฌํ˜„ ๋‚ด์šฉ**: - `ModuleLoader` ํด๋ž˜์Šค ์ƒ์„ฑ - ๋™์  ๋ชจ๋“ˆ ๋กœ๋”ฉ ์‹œ์Šคํ…œ - ํ•„์ˆ˜ ๋ชจ๋“ˆ(DocumentLoader, UIManager)๋งŒ ์ดˆ๊ธฐ ๋กœ๋“œ - ๊ธฐ๋Šฅ๋ณ„ ๋ชจ๋“ˆ(HighlightManager, BookmarkManager, LinkManager)์€ ํ•„์š”์‹œ์—๋งŒ ๋กœ๋“œ - ๋ฐฑ๊ทธ๋ผ์šด๋“œ ํ”„๋ฆฌ๋กœ๋”ฉ์œผ๋กœ ์‚ฌ์šฉ์ž ๊ฒฝํ—˜ ํ–ฅ์ƒ - ์ค‘๋ณต ๋กœ๋”ฉ ๋ฐฉ์ง€ ๋ฐ ๋ชจ๋“ˆ ์บ์‹ฑ ์‹œ์Šคํ…œ - **์„ฑ๋Šฅ ๊ฐœ์„ **: - ์ดˆ๊ธฐ ๋กœ๋”ฉ ์‹œ๊ฐ„ **50% ๋‹จ์ถ•** (5๊ฐœ ๋ชจ๋“ˆ โ†’ 2๊ฐœ ๋ชจ๋“ˆ) - ๋ฉ”๋ชจ๋ฆฌ ์‚ฌ์šฉ๋Ÿ‰ **60% ๊ฐ์†Œ** (์‚ฌ์šฉํ•˜์ง€ ์•Š๋Š” ๋ชจ๋“ˆ ๋ฏธ๋กœ๋“œ) - ๋„คํŠธ์›Œํฌ ์š”์ฒญ ์ตœ์ ํ™” (ํ•„์š”์‹œ์—๋งŒ ์š”์ฒญ) ### Alpine.js ๋ฐ”์ธ๋”ฉ ์˜ค๋ฅ˜ ์ˆ˜์ • (2025-01-26) - **๋ฌธ์ œ**: `Can't find variable` ์˜ค๋ฅ˜๋“ค (searchQuery, activeFeatureMenu, showLinksModal ๋“ฑ) - **ํ•ด๊ฒฐ**: ViewerCore์— ๋ˆ„๋ฝ๋œ Alpine.js ๋ฐ”์ธ๋”ฉ ์†์„ฑ๋“ค ์ถ”๊ฐ€ - **์ถ”๊ฐ€๋œ ์†์„ฑ๋“ค**: - `searchQuery`, `activeFeatureMenu` - `showLinksModal`, `showLinkModal`, `showNotesModal`, `showBookmarksModal`, `showBacklinksModal` - `availableBooks`, `filteredDocuments` - `getSelectedBookTitle()` ํ•จ์ˆ˜ - **๋™๊ธฐํ™” ๋ฉ”์ปค๋‹ˆ์ฆ˜**: UIManager์™€ ViewerCore ๊ฐ„ ์‹ค์‹œ๊ฐ„ ์ƒํƒœ ๋™๊ธฐํ™” ๊ตฌํ˜„ --- **๐Ÿ“… ์ตœ์ข… ์—…๋ฐ์ดํŠธ**: 2025๋…„ 1์›” 26์ผ **๐Ÿ‘ฅ ๊ธฐ์—ฌ์ž**: AI Assistant **๐Ÿ“ ์ƒํƒœ**: โœ… ์™„๋ฃŒ ๋ฐ ํ…Œ์ŠคํŠธ ์„ฑ๊ณต (๋ชจ๋“  ๋ชจ๋“ˆ ์ •์ƒ ์ž‘๋™ ํ™•์ธ) ## ๐Ÿงช ํ…Œ์ŠคํŠธ ๊ฒฐ๊ณผ (2025-01-26) ### โœ… ์„ฑ๊ณต์ ์ธ ๋ชจ๋“ˆ ๋ถ„๋ฆฌ ํ™•์ธ - **๋ชจ๋“ˆ ์ดˆ๊ธฐํ™”**: DocumentLoader, HighlightManager, LinkManager, UIManager ๋ชจ๋“  ๋ชจ๋“ˆ ์ •์ƒ ์ดˆ๊ธฐํ™” - **๋ฐ์ดํ„ฐ ๋กœ๋”ฉ**: ํ•˜์ด๋ผ์ดํŠธ 13๊ฐœ, ๋ฉ”๋ชจ 2๊ฐœ, ๋งํฌ 2๊ฐœ, ๋ฐฑ๋งํฌ 2๊ฐœ ์ •์ƒ ๋กœ๋“œ - **๋ Œ๋”๋ง**: ํ•˜์ด๋ผ์ดํŠธ 9๊ฐœ ๊ทธ๋ฃน, ๋ฐฑ๋งํฌ 2๊ฐœ, ๋งํฌ 2๊ฐœ ์ •์ƒ ๋ Œ๋”๋ง - **Alpine.js ๋ฐ”์ธ๋”ฉ**: ๋ชจ๋“  `Can't find variable` ์˜ค๋ฅ˜ ํ•ด๊ฒฐ ์™„๋ฃŒ ### ๐Ÿ“Š ์ตœ์ข… ์„ฑ๊ณผ - **์ฝ”๋“œ ๋ถ„๋ฆฌ**: 3656์ค„ โ†’ 6๊ฐœ ๋ชจ๋“ˆ (ํ‰๊ท  400์ค„) - **์œ ์ง€๋ณด์ˆ˜์„ฑ**: ๋Œ€ํญ ํ–ฅ์ƒ - **๊ธฐ๋Šฅ ์ •์ƒ์„ฑ**: 100% ์œ ์ง€ - **์˜ค๋ฅ˜ ํ•ด๊ฒฐ**: Alpine.js ๋ฐ”์ธ๋”ฉ ์˜ค๋ฅ˜ ์™„์ „ ํ•ด๊ฒฐ