Obsidian Dataview로 저장된 웹 콘텐츠 쿼리하기
몇 주째 Obsidian에 웹 콘텐츠를 저장해왔습니다. 볼트에 50개, 어쩌면 100개의 클리핑된 기사가 있습니다. 하지만 원하는 것을 찾으려면 폴더를 스크롤하거나 전체 텍스트 검색에 의존해야 합니다.
Dataview가 이를 바꿉니다. 마크다운 파일을 데이터베이스처럼 다룹니다 — 메타데이터로 쿼리하고, 태그로 필터링하고, 날짜로 정렬하고, 자동으로 업데이트되는 대시보드를 구축합니다.
웹 클립에 맞게 설정하는 방법을 소개합니다.
Dataview가 하는 일
Dataview는 SQL과 유사한 구문을 사용해 노트를 쿼리할 수 있는 Obsidian 플러그인입니다. 모든 마크다운 파일이 하나의 행이 됩니다. 모든 프론트매터 필드가 열이 됩니다. 모든 쿼리는 실시간으로 자동 업데이트되는 표를 반환합니다.
기반: 프론트매터
Dataview의 힘은 클리핑된 파일의 일관된 프론트매터에 달려 있습니다. Save로 웹 콘텐츠를 저장할 때 이 메타데이터를 추가하세요:
---
title: "React Server Components: A Complete Guide"
source: "https://example.com/rsc-guide"
clipped: 2026-03-15
type: article
status: unread
tags: [react, server-components, performance]
rating:
---
웹 클립을 쿼리 가능하게 만드는 필드:
- clipped — 저장한 날짜
- type — article, tutorial, documentation, paper, thread
- status — unread, reading, read, processed
- rating — 읽은 후 1-5 (처음에는 비워두세요)
- tags — 다루는 주제
필수 쿼리
읽기 대기열
모든 미읽음 클립을 최신순으로 보기:
```dataview
TABLE title, type, clipped
FROM "clips"
WHERE status = "unread"
SORT clipped DESC
```
최근 읽은 것
지난 30일 동안 처리한 내용:
```dataview
TABLE title, rating, tags
FROM "clips"
WHERE status = "read" AND clipped >= date(today) - dur(30 days)
SORT rating DESC
```
주제별 최고 콘텐츠
특정 주제에서 가장 높은 평점의 클립 찾기:
```dataview
TABLE title, rating, source
FROM "clips"
WHERE contains(tags, "react") AND rating >= 4
SORT rating DESC
```
콘텐츠 유형 분류
각 유형별로 얼마나 저장했는지:
```dataview
TABLE length(rows) AS Count
FROM "clips"
GROUP BY type
SORT length(rows) DESC
```
처리가 필요한 클립
아직 검토하지 않은 저장 콘텐츠 찾기:
```dataview
TABLE title, type, clipped
FROM "clips"
WHERE !rating
SORT clipped ASC
LIMIT 10
```
리서치 대시보드 구축
모든 쿼리를 집계하는 Dashboard.md 노트를 만드세요:
# Research Dashboard
## 읽기 대기열 ({{date}})
### 미읽음 기사
(여기에 dataview 쿼리)
### 진행 중
(여기에 dataview 쿼리)
## 이번 주 저장
(여기에 dataview 쿼리)
## 최고 평점 콘텐츠
(여기에 dataview 쿼리)
## 주제별
(여기에 dataview 쿼리)
이 대시보드는 열 때마다 자동으로 업데이트됩니다. 수동 관리가 필요 없습니다.
고급: 인라인 쿼리
Dataview는 노트 내에서 인라인 쿼리도 지원합니다. 어디서든 클립 수나 메타데이터를 참조할 수 있습니다:
이번 달에 `= length(filter(pages("clips"), (p) => p.status = "read"))` 개의 기사를
저장했으며, 평균 평점은
`= round(average(filter(pages("clips"), (p) => p.rating).rating), 1)`입니다.
일반 텍스트로 렌더링됩니다: “이번 달에 23개의 기사를 저장했으며, 평균 평점은 3.8입니다.”
복잡한 쿼리를 위한 DataviewJS
더 복잡한 분석을 위해 DataviewJS(JavaScript)를 사용하세요:
```dataviewjs
// 지난 8주 동안 주별 클립 표시
const clips = dv.pages('"clips"')
.where(p => p.clipped)
.sort(p => p.clipped, 'desc');
const weeks = {};
for (const clip of clips) {
const week = clip.clipped.toFormat("yyyy-'W'WW");
weeks[week] = (weeks[week] || 0) + 1;
}
dv.table(
["Week", "Clips Saved"],
Object.entries(weeks).slice(0, 8).map(([week, count]) => [week, count])
);
```
깔끔한 데이터를 위한 팁
템플릿 사용
모든 저장이 일관되도록 미리 채워진 프론트매터로 클립 템플릿을 만드세요:
---
title: ""
source: ""
clipped: {{date}}
type: article
status: unread
tags: []
rating:
---
태그 표준화
표준 세트를 정하고 지키세요. React나 reactjs가 아닌 react. perf나 web-performance가 아닌 performance. 일관성 없는 태그는 Dataview 쿼리를 망칩니다.
읽은 후 상태 업데이트
status 필드는 업데이트해야만 작동합니다. 클립 읽기를 마치면 10초만 내어 status: unread를 status: read로 바꾸고 평점을 추가하세요.
소스 URL 유지
source 필드로 항상 원본으로 돌아갈 수 있습니다. Dataview가 클릭 가능한 링크로 렌더링할 수 있습니다:
```dataview
TABLE title, "[Link](" + source + ")" AS Source
FROM "clips"
WHERE status = "read"
SORT clipped DESC
LIMIT 20
```
깔끔한 마크다운이 중요한 이유
Dataview는 프론트매터를 쿼리하지만, 클립 콘텐츠도 정기적으로 검색합니다. 여기서 Save의 깔끔한 추출이 빛을 발합니다.
볼트에서 “server components streaming”을 검색할 때, 클립에서 관련 단락을 찾고 싶습니다 — 내비게이션 메뉴, 쿠키 배너, 사이드바 위젯이 아니라. 깔끔한 마크다운은 깔끔한 검색 결과를 의미합니다.
시작하기
- Obsidian에서 Dataview 플러그인 설치 (커뮤니티 플러그인 → “Dataview” 검색)
- 깔끔한 웹 클리핑을 위해 Save 설치
- 위의 템플릿을 사용해 다음 5개 클립에 프론트매터 추가
- 읽기 대기열 쿼리로 Dashboard 노트 만들기
- 볼트가 파일 더미에서 쿼리 가능한 지식 베이스로 변환되는 것을 지켜보세요