# NoteRich 작업공간 및 고급 검색 튜토리얼 정보 과부하가 일반적인 이 시대에, 디지털 정보를 효율적으로 관리하는 것은 사치가 아니라 필수입니다. **NoteRich**는 지식 관리 및 검색 방식을 혁신하는 두 가지 강력한 기능을 제공합니다: **분리된 다중 작업공간**과 **고급 의미 검색**입니다. 이 튜토리얼을 통해 이러한 기능을 마스터하고, 필요에 따라 확장 가능한 맞춤형 지식 관리 시스템을 구축할 수 있습니다. --- ## 1부: NoteRich의 작업공간 이해 ### 작업공간이란 무엇인가요? 생활의 여러 영역에 각각 별도의 노트북을 사용하는 것을 상상해 보세요. 업무 프로젝트용, 개인 일기용, 연구 노트용이 각각 있습니다. **NoteRich**의 작업공간은 이러한 조직적 명확성을 디지털 환경에 도입합니다. NoteRich의 각 작업공간은 노트를 저장하는 **완전히 분리된 컨테이너**이며, 다음과 같은 기능을 갖추고 있습니다: - 독립적인 노트 데이터베이스 - 별도의 검색 인덱스 - 고유한 URL 라우팅 - 분리된 AI 메모 컨텍스트 ```mermaid graph TB subgraph "NoteRich Application" A[Workspace Router] --> B[Workspace: Work] A --> C[Workspace: Personal] A --> D[Workspace: Research] B --> B1[Notes Database] B --> B2[Search Index] B --> B3[AI Context] C --> C1[Notes Database] C --> C2[Search Index] C --> C3[AI Context] D --> D1[Notes Database] D --> D2[Search Index] D --> D3[AI Context] end style A fill:#000,stroke:#000,color:#fff style B fill:#fafafa,stroke:#eaeaea,color:#333 style C fill:#fafafa,stroke:#eaeaea,color:#333 style D fill:#fafafa,stroke:#eaeaea,color:#333 ``` ### 여러 작업공간을 사용해야 하는 이유는 무엇인가요? | 시나리오 | 장점 | |----------|---------| | **직장과 개인의 분리** | 전문적인 노트를 개인 일기와 완전히 분리함 | | **프로젝트 분리** | 특정 고객이나 장기 프로젝트를 위한 작업공간을 할당함 | | **컨텍스트 전환** | 방해받지 않고 다양한 컨텍스트를 즉시 전환함 | | **개인정보 관리** | 관련 없는 내용을 노출시키지 않고 특정 작업공간을 공유함 | | **성능 최적화** | 집중된 작업공간으로 나누면 대규모 지식베이스도 빠르게 유지됨 | --- ## 2부: 작업공간 간 이동하기 ### 작업공간 라우터 시스템 NoteRich는 사용자의 작업공간 선호도를 기억하고 원활한 이동을 제공하는 지능형 라우팅 시스템을 사용합니다. #### URL 기반 작업공간 식별 각 작업공간은 브라우저의 URL에 반영되는 고유 식별자를 가집니다: ``` https://noterich.app/#workspace=work-projects https://noterich.app/#workspace=personal-journal https://noterich.app/#workspace=research-notes ``` 작업공간 ID는: - **URL-안전**: 알파벳과 하이픈, 스트립만 허용 - **지속적**: 브라우저의 로컬 저장소에 저장되어 빠른 복구 가능 - **공유 가능**: 특정 작업공간의 직접 링크를 공유할 수 있음 #### 작업공간 전환 방식 NoteRich에서 작업공간을 전환할 때, 뒤에서 일어나는 일은 다음과 같습니다: ```mermaid sequenceDiagram participant U as User participant R as Workspace Router participant L as LocalStorage participant W as Web Worker participant S as Search Engine participant D as IndexedDB U->>R: 작업공간 전환 클릭 R->>L: 작업공간 ID 저장 R->>R: URL 해시 업데이트 R->>W: 작업공간 ID 메시지 전송 R->>S: 검색 엔진 재초기화 W->>D: 데이터베이스 연결 전환 S->>D: 작업공간별 인덱스 로드 S-->>U: 검색 준비 알림 ``` ### 작업공간 명명의 모범 사례 작업공간 ID는 다음과 같은 조건을 충족해야 합니다: - **설명적**: `work1` 대신 `marketing-q4-2025` 사용 - **일관성**: 조직 전체에서 동일한 명명 규칙 사용 - **미래를 대비한**: 일시적인 경우를 제외하고 시간 제한이 있는 이름 피함 (`project-phoenix` 대 `temp-notes`) --- ## 3부: 고급 검색 아키텍처 ### 키워드 매칭에서 의미적 이해까지 전통적인 검색 도구는 정확한 키워드 매칭에 의존합니다. “automobile”을 검색하면 “car”이 포함된 노트를 찾을 수 없습니다. NoteRich의 고급 검색 엔진은 이러한 제한을 넘어섭니다. #### 이중 레이어 검색 시스템 NoteRich는 정교한 이중 레이어 검색 아키텍처를 사용합니다: ```graphviz digraph SearchArchitecture { rankdir=TB; node [shape=box, style="rounded,filled", fillcolor="#fafafa", color="#eaeaea", fontname="Inter", fontsize=11]; edge [color="#d4d4d4", penwidth=1.5]; Query [label="User Query", fillcolor="#000", color="#000", fontcolor="#ffffff"]; subgraph cluster_processing { label = "Query Processing Pipeline"; style = "filled"; fillcolor = "#f9f9f9"; color = "#eaeaea"; Segment [label="Text Segmentation\n(Intl.Segmenter + Smart Fallback)";] Tokenize [label="Token Classification\n(Emails, URLs, Numbers, CJK)";] } subgraph cluster_search { label = "Parallel Search Execution"; style = "filled"; fillcolor = "#f9f9f9"; color = "#eaeaea"; Precise [label="Precise Match\ntitle_raw field\nWeight: 1.0"]; Fuzzy [label="Fuzzy Match\ntitle/content fields\nWeight: 0.8"]; } Merge [label="Score Merging & Ranking"]; Results [label="Final Results\nwith Highlights"]; Query -> Segment; Segment -> Tokenize; Tokenize -> Precise; Tokenize -> Fuzzy; Precise -> Merge; Fuzzy -> Merge; Merge -> Results; } ``` ### 지능형 텍스트 분할 NoteRich의 검색 능력의 기반은 고급 텍스트 분할 기능입니다. #### 다국어 지원 검색 엔진은 여러 언어의 텍스트를 자동으로 감지하고 분할합니다: | 언어 유형 | 예시 | 분할 전략 | |----------|----------|------------------| | **라틴 기반** | 영어, 스페인어, 프랑스어 | 단어 경계 감지 | | **CJK** | 중국어, 일본어, 한국어 | Intl.Segmenter를 사용한 문자 수준 분할 | | **혼합** | 코드 조각, URL, 이메일 | 패턴 기반 추출 | | **숫자** | 날짜, 가격, 전화번호 | 전문적인 패턴 인식 | #### 스마트 패턴 인식 NoteRich는 분할 과정에서 중요한 패턴을 인식하고 보존합니다: - **이메일 주소**: `user@example.com` - **URL**: `https://example.com/path` - **전화번호**: `+1-555-123-4567` - **날짜**: `2025-01-15`, `15/01/2025` - **통화**: `$1,234.56`, `¥500` - **측정**: `42℃`, `100km/h` 이를 통해 `user@example.com`을 검색할 때 정확한 이메일을 찾을 수 있으며, `user`, `example`, `com`의 파편화된 결과는 찾을 수 없습니다. --- ## 4부: 검색 쿼리 마스터하기 ### 쿼리 구문 및 연산자 NoteRich는 정확한 정보 검색을 위한 강력한 쿼리 구문을 지원합니다. #### 기본 검색 쿼리를 입력하기만 하면 모든 인덱스된 콘텐츠를 검색할 수 있습니다: ``` Quarterly marketing strategy ``` 이렇게 하면 제목과 전체 내용을 모두 검색하여 관련성에 따라 결과를 정렬합니다. #### 다중 단어 OR 검색 `|` 기호를 사용하여 여러 대체 단어를 검색할 수 있습니다: ``` Q4 planning | quarterly review | year-end summary ``` 이렇게 하면 지정된 단어 중 **어떤 것과든** 일치하는 노트가 반환되며, 용어가 다양할 수 있는 브레인스토밍 세션에 매우 적합합니다. #### 가중치 평가 시스템 NoteRich는 정교한 평가 알고리즘을 사용합니다: ``` Match Type | Weight | Description --------------------|--------|------------------------------------- Precise (title_raw) | 1.0 | 원본 제목과의 정확한 일치 Fuzzy (title) | 0.8 | 토큰화된 제목의 분할 일치 Fuzzy (content) | 0.8 | 노트 내용의 분할 일치 ``` 결과는 다음에 따라 정렬됩니다: 1. **일치 유형 우선순위**: 정확한 일치는 부조리 일치보다 더 높은 순위를 가짐 2. **누적 점수**: 여러 단어 일치는 점수를 증가시킴 3. **하위 쿼리 커버리지**: 더 많은 하위 쿼리와 일치하는 노트가 더 높은 순위를 가짐 ### 실제 검색 예시 #### 예시 1: 회의 노트 찾기 ```javascript // 검색 쿼리 "team standup | daily sync | morning meeting" // 다음과 같은 구절을 포함하는 노트가 반환되며, 정확한 제목 일치가 우선시됨 ``` #### 예시 2: 기술 문서 검색 ```javascript // 검색 쿼리 "API endpoint authentication" // 지능적으로 분할하여 찾음: // - "API"와 "endpoint" 및 "authentication"을 언급하는 노트 // - "API"를 단일 토큰으로 유지 // - CamelCase와 Spaced 변형 모두 일치 ``` #### 예시 3: 다국어 콘텐츠 ```javascript // 검색 쿼리 (영어와 중국어 혼합) "project roadmap 项目规划" // 두 언어를 동시에 분할하여 검색함 ``` ### 장기 문서 내비게이션 어시스턴트 NoteRich의 두드러진 기능 중 하나는 **거대한 문서**를 쉽게 처리할 수 있는 능력입니다. 기술 사양, 연구 논문, 포괄적인 프로젝트 문서를 작업할 때, 장기 문서 내에서 특정 콘텐츠를 찾는 것은 원활합니다. #### 문서 내 검색 작동 방식 검색을 실행할 때, NoteRich는 일치하는 문서만 반환하는 것이 아니라 **정확한 문서 내 내비게이션**을 제공합니다: ```mermaid sequenceDiagram participant User participant SearchEngine participant DocumentIndex participant Viewer User->>SearchEngine: 검색 쿼리 입력 SearchEngine->>DocumentIndex: 모든 작업공간에서 쿼리 실행 DocumentIndex-->>SearchEngine: 일치하는 문서와 위치 반환 SearchEngine->>User: 일치 결과와 일치 수량 표시 User->>User: 결과 중 하나 클릭 SearchEngine->>Viewer: 첫 번째 일치 지점에서 문서 열기 Viewer->>User: 내비게이션 컨트롤로 모든 일치 항목 강조표시 User->>Viewer: 일치 항목 사이 전환(다음/이전) Viewer->>User: 일치 위치 표시기 표시(예: "3 of 12") ``` #### 장기 문서의 주요 기능 1. **일치 수량 표시**: 각 검색 결과는 해당 문서 내 일치 수를 표시합니다(예: "Annual Report 2024 · 15 matches"), 이를 통해 어떤 문서가 가장 관련성 있는 콘텐츠를 포함하는지 파악할 수 있습니다. 2. **즉시 일치 위치로 이동**: 검색 결과를 클릭하면 문서가 열리고 첫 번째 일치 위치로 자동 스크롤됩니다. 일치된 텍스트는 즉시 가시적으로 강조됩니다. 3. **내비게이션 컨트롤**: 키보드 단축키나 UI 버튼을 사용하여 모든 일치 항목을 순환할 수 있습니다: - `F3` 또는 `Cmd+G`: 다음 일치 항목 - `Shift+F3` 또는 `Shift+Cmd+G`: 이전 일치 항목 - 시각적 카운터는 현재 위치를 표시합니다(예: "일치 7 of 23") 4. **다중 일치 강조**: 검색 단어의 모든 인스턴스가 동시에 강조되므로, 문서 전체에 대한 시각적 개요를 얻을 수 있습니다. 5. **컨텍스트 보존**: 일치 항목 사이를 이동할 때, 주변 컨텍스트가 보존되어 복잡한 문서에서도 위치를 잃지 않을 수 있습니다. #### 실제 예시: 기술 사양 내비게이션 50,000자 길이의 기술 사양 문서를 가지고 있다고 가정해 봅시다. “authentication protocol”을 언급하는 모든 내용을 찾아야 합니다: | 단계 | 조치 | 결과 | |------|--------|--------| | 1 | 검색바에 `authentication protocol`을 입력 | "8 matches"와 함께 사양 문서가 나타남 | | 2 | 검색 결과를 클릭 | 문서가 열리고 첫 번째 일치 위치로 이동함 | | 3 | `F3`을 7번 누름 | 8개의 일치 항목을 순차적으로 확인함 | | 4 | 강조된 일치 항목을 관찰 | 단어 분포의 시각적 개요 | | 5 | 주변 컨텍스트를 읽음 | 각 일치 위치에서 전체 단락 컨텍스트가 보존됨 | 이 기능을 통해 긴 문서를 두려운 텍스트의 벽에서 벗어나, 언제든지 몇 번의 키 입력만으로 정보를 얻을 수 있는 유용한 지식 구조로 변환할 수 있습니다. #### 장기 문서 검색 팁 - **특정 구절을 사용**: 긴 쿼리로 인해 대규모 문서에서 잘못된 일치가 줄어듭니다. - **일치 수량 확인**: 높은 일치 수량은 너무 흔한 단어를 나타낼 수 있습니다. - **작업공간 필터링과 결합**: 특정 작업공간 내에서 검색하여 범위를 좁힙니다. - **제목의 정확성 활용**: 섹션 제목을 명확하게 구성하여 정확한 제목 일치가 가능합니다. --- ## 5부: 대규모 성능 ### IndexedDB 기반 저장 NoteRich는 **IndexedDB**를 활용하여 고성능 로컬 저장을 가능하게 하여, 대규모 지식베이스에서도 즉각적인 검색을 가능하게 합니다. #### 데이터베이스 아키텍처 각 작업공간은 자신의 IndexedDB 데이터베이스를 유지합니다: ``` noterich_note_database_{workspaceId} → 노트 메타데이터 및 콘텐츠 noterich_search_index_{workspaceId} → 검색 인덱스 문서 ``` 이러한 분리 덕분에: - **빠른 전환**: 작업공간 간 데이터 로드 없음 - **독립적인 백업**: 개별 작업공간 내보내기 - **범위별 권한**: 세밀한 접근 제어 ### 증분 인덱스 업데이트 전체 검색 인덱스를 매번 재구축하는 대신, NoteRich는 지능적인 증분 업데이트를 사용합니다: ```mermaid graph LR A[노트 저장] --> B[인덱스 존재?] B -->|예| C[타임스탬프 비교] B -->|아니오| D[전체 인덱스 구축] C -->|더 새롭게| E[인덱스 항목 업데이트] C -->|더 오래된| F[이미 인덱스된 경우 생략] E --> G[IndexedDB에 저장] D --> G F --> H[인덱스 현재 상태] ``` ### 성능 벤치마크 우리의 테스트 결과, 대규모에서도 뛰어난 성능을 보였습니다: ```echarts { "xAxis": { "type": "category", "data": ["1k Notes", "5k Notes", "10k Notes", "20k Notes", "50k Notes"], "axisLabel": { "color": "#666", "rotate": 0 } }, "yAxis": [ { "type": "value", "name": "Notes Count", "splitLine": { "lineStyle": { "color": "#f4f4f5" } }, "axisLabel": { "color": "#666" } }, { "type": "value", "name": "Latency (ms)", "splitLine": { "show": false }, "axisLabel": { "color": "#666" } } ], "series": [ { "name": "Notes Count", "data": [1000, 5000, 10000, 20000, 50000], "type": "bar", "itemStyle": { "color": "#eaeaea", "borderRadius": [4, 4, 0, 0] } }, { "name": "Search Latency", "data": [8, 12, 15, 22, 35], "type": "line", "yAxisIndex": 1, "smooth": true, "lineStyle": { "color": "#000", "width": 3 }, "itemStyle": { "color": "#000" }, "symbol": "circle", "symbolSize": 8 } ], "grid": { "left": "10%", "right": "10%", "bottom": "15%" }, "legend": { "data": ["Notes Count", "Search Latency"], "bottom": 0, "textStyle": { "color": "#666" } } } ``` **50,000개의 노트**가 있더라도, 검색 쿼리는 40밀리초 이내에 결과를 반환합니다. 눈 깜짝할 사이에 빠른 속도입니다. ### 메모리 효율성 검색 엔진은 최적화된 데이터 구조를 사용합니다: - **FlexSearch 문서 인덱스**: 여러 필드를 하나의 효율적인 인덱스로 결합 - **공유 노트 맵**: 노트 메타데이터에 대한 O(1) 조회 가능 - **배치 처리**: 인덱스 업데이트를 단위로 처리하여 UI 방해를 방지 - **루저 로딩**: 작업공간 전환 시 검색 인덱스에 요청 시 로드 --- ## 6부: 작업공간 관리 모범 사례 ### 효과적인 작업공간 구조 만들기 #### 권장 패턴 **패턴 1: 분야 기반 분리** ``` ├── work-engineering ├── work-marketing ├── work-hr └── personal ``` **패턴 2: 프로젝트 중심 조직** ``` ├── project-alpha ├── project-beta ├── project-gamma └── archive-2024 ``` **패턴 3: 시간적 조직** ``` ├── 2025-q1 ├── 2025-q2 ├── 2025-q3 └── 2025-q4 ``` ### 새로운 작업공간을 만들 때 다음과 같은 경우 새로운 작업공간을 만들어야 합니다: ✅ **컨텍스트 경계가 명확한 경우**: 다른 프로젝트, 팀, 생활 영역 ✅ **접근 제어가 다르게 필요한 경우**: 일부 노트는 제한된 공유가 필요함 ✅ **지식베이스가 크게 성장한 경우**: 단일 작업공간이 10,000개의 노트를 초과할 때 ✅ **협업 요구사항이 다른 경우**: 다른 주제에 대해 다른 협력자 사용 ### 단일 작업공간에 머무를 때 다음과 같은 경우 노트를 함께 유지해야 합니다: ❌ **교차 참조가 자주 일어나는 경우**: 노트가 정기적으로 서로 연결됨 ❌ **검색이 여러 주제에 걸쳐 필요한 경우**: 모든 콘텐츠를 검색하는 경우가 많음 ❌ **설정 비용이 이점보다 크지 않은 경우**: 소규모 컬렉션(<1,000 노트)의 경우 --- ## 7부: 고급 팁과 요령 ### 팁 1: 해시태그 분할 활용 NoteRich는 검색을 위해 해시태그를 자동으로 분할합니다: ``` #machine-learning → "machine"와 "learning"으로 검색 가능 ``` 이를 통해 "machine-learning" 해시태그를 검색할 때 "machine"이나 "learning"을 검색할 수 있습니다. ### 팁 2: 검색 시 첨부파일 이름 사용 첨부파일 이름은 인덱싱되고 검색 가능합니다: ``` quarterly_report.pdf → "quarterly"와 "report"와 "pdf"로 검색 가능 ``` ### 팁 3: 수학적 방정식 검색 가능 방정식 내용은 추출되고 인덱싱됩니다: ``` E = mc² → 인덱싱된 구성 요소 검색 가능 ``` ### 팁 4: 일반적인 검색에 최적화 자주 접근하는 정보를 제목에 구조화하여 정확한 일치가 가능하도록 합니다: ``` 더 나은: "Q4 Marketing Budget Analysis" 대신: "Some thoughts on numbers" ``` ### 팁 5: 정기적인 인덱스 유지 NoteRich는 자동으로 인덱싱을 처리하지만, 정기적인 재구축을 통해 성능을 최적화할 수 있습니다: 1. 설정 → 검색 2. "검색 인덱스 재구축"을 클릭 3. 완료 알림을 기다림 이 작업은 다음 경우에 권장됩니다: - 대량의 노트를 한 번에 가져오는 경우 - 주요 버전 업그레이드 후 - 눈에 띄는 검색 속도 저하 후 --- ## 8부: 일반적인 문제 해결 ### 문제: 검색 결과에 예상되는 노트가 없음 **가능한 원인:** 1. 노트가 다른 작업공간에 있음 2. 인덱스가 아직 업데이트되지 않았음 3. 노트가 초안으로 표시됨 **해결책:** - URL에서 현재 작업공간 표시기를 확인 - 인덱스가 업데이트될 때까지 몇 초 기다림 - 노트 상태를 확인(초안은 검색에서 제외) ### 문제: 작업공간 전환이 느리게 일어남 **가능한 원인:** 1. 많은 노트가 있는 큰 작업공간 2. 초기 인덱스 로드 3. 브라우저 IndexedDB 성능 **해결책:** - 초기 인덱스 캐시가 형성될 수 있도록 허용(일회성 작업) - 매우 큰 작업공간을 분할하는 것을 고려 - 브라우저에 충분한 저장 공간이 있는지 확인 ### 문제: 검색 인덱스와 일치하지 않음 **증상:** - 최근에 편집된 노트가 검색 결과에 나타나지 않음 - 삭제된 노트가 여전히 결과에 표시됨 **해결책:** ``` 설정 → 고급 → 검색 인덱스 재구축 ``` 이 작업은 현재 작업공간의 모든 노트에 대한 완전한 재인덱싱을 강제합니다. --- ## 결론: 두 번째 뇌를 구축하기 NoteRich의 작업공간과 고급 검색을 마스터하면, 노트 작성이 수동적인 저장에서 적극적인 사고 파트너로 변모합니다. 다음은 실천 계획입니다: ### 1주차: 기초 구축 - [ ] 기존 노트를 검토하여 자연스러운 작업공간 경계 파악 - [ ] 주요 컨텍스트에 따라 2-3개의 초기 작업공간 만들기 - [ ] URL 네비게이션을 사용하여 작업공간 간 전환 연습 ### 2주차: 최적화 - [ ] 다양한 검색 쿼리 패턴 실험 - [ ] 유연한 검색을 위한 OR 연산자(`|`) 사용 학습 - [ ] 검색 결과 순위와 노트 제목을 적절히 조정하기 ### 3주차: 마스터하기 - [ ] 작업공간별 특화된 작업흐름 설정 - [ ] 일관된 명명 규칙 적용 - [ ] 협력자와 작업공간 링크 공유 ### 지속적인 유지보수 - [ ] 3개월마다 작업공간 구조 검토 - [ ] 검색 성능 지표 모니터링 - [ ] 지식이 성장함에 따라 조직을 최적화 --- ## 결론: 두 번째 뇌를 구축하기