📋 목차
- Dataview 함수란 무엇인가?
- 함수의 기본 작동 원리
- 생성자 함수 완벽 활용법
- 숫자 연산 함수 마스터하기
- 객체, 배열, 문자열 조작 함수
- 문자열 처리 고급 기법
- 유틸리티 함수로 효율성 극대화
- 실전 활용 예제
1. Dataview 함수란 무엇인가?
Obsidian Dataview 함수는 노트 데이터를 조작하고 변환하는 강력한 도구입니다. 단순한 데이터 조회를 넘어서 필터링, 그룹화, 계산, 변환 등 복잡한 데이터 처리를 가능하게 합니다.
💡 Dataview 함수의 핵심 장점
- 유연한 데이터 조작: FROM 명령 외 모든 데이터 명령에서 사용 가능
- 표현식 기반: 리터럴, 메타데이터 필드, 다른 함수를 매개변수로 활용
- 벡터화 지원: 단일 값과 목록 모두에서 동작
- 실시간 업데이트: 노트 변경 시 자동으로 결과 갱신
🎯 활용 분야
- 프로젝트 관리 대시보드 구축
- 독서 노트 통계 분석
- 일정 및 태스크 관리
- 지식 연결망 시각화
2. 함수의 기본 작동 원리
📝 함수 구조 이해하기
모든 Dataview 함수는 다음 형식을 따릅니다:
functionname(parameter1, parameter2)
✅ 매개변수 규칙:
- 필수 매개변수: 괄호 없이 표시
- 선택적 매개변수: [parameter] 대괄호로 표시
- 표현식 사용: 리터럴, 필드, 다른 함수 모두 가능
🔄 함수 벡터화의 이해
단일 값 처리:
lower("YES") = "yes"
round(16.555555, 2) = 16.56
목록 처리 (자동 벡터화):
lower(["YES", "NO"]) = ["yes", "no"]
replace(["yes", "ree"], "e", "a") = ["yas", "raa"]
이 특성으로 대량 데이터 처리가 effortless하게 가능합니다!
3. 생성자 함수 완벽 활용법
생성자 함수는 새로운 데이터 구조를 만드는 핵심 도구입니다.
🏗️ object() - 객체 생성의 마법사
기본 사용법:
object("a", 6)
// 결과: {a: 6}
object("name", "김철수", "age", 30, "job", "개발자")
// 결과: {name: "김철수", age: 30, job: "개발자"}
💡 실전 활용 예시:
TABLE object("제목", file.name, "생성일", file.ctime, "태그수", length(file.tags)) as "노트 정보"
FROM "프로젝트"
📝 list() - 동적 목록 생성
배열 생성:
list(1, 2, 3) = [1, 2, 3]
array("월", "화", "수") = ["월", "화", "수"]
데이터 수집에 활용:
TABLE list(file.tags, file.outlinks) as "관련 정보"
📅 date() - 날짜 파싱의 달인
다양한 날짜 형식 지원:
date("2024-01-15") // 표준 ISO 형식
date("12/31/2024", "MM/dd/yyyy") // 커스텀 형식
date([[2024-01-15]]) // 데일리 노트 링크
실용적 날짜 처리:
TABLE
date(due) as "마감일",
dur(date(due) - date(today)) as "남은 시간"
WHERE due != null
4. 숫자 연산 함수 마스터하기
🧮 기본 수학 함수
반올림 계열:
round(16.555555, 2) = 16.56 // 소수점 둘째 자리
floor(12.937) = 12 // 내림
ceil(12.937) = 13 // 올림
trunc(12.937) = 12 // 소수점 제거
📊 통계 함수로 데이터 분석
기본 통계:
min([1, 2, 3, 4, 5]) = 1
max([1, 2, 3, 4, 5]) = 5
sum([1, 2, 3, 4, 5]) = 15
average([1, 2, 3, 4, 5]) = 3
💡 실전 예제 - 독서 통계:
TABLE
sum(pages) as "총 페이지",
average(pages) as "평균 페이지",
round(average(rating), 1) as "평균 평점"
FROM "독서노트"
WHERE completed = true
고급 통계 함수:
minby(this.file.tasks, (k) => k.due) // 가장 빠른 마감일
maxby(projects, (p) => p.priority) // 우선순위 최고 프로젝트
🔧 reduce() - 만능 집계 함수
다양한 연산자 지원:
reduce([100, 20, 3], "-") = 77 // 뺄셈
reduce([200, 10, 2], "/") = 10 // 나눗셈
reduce([true, false, true], "&") = false // AND 연산
reduce(["⭐", 3], "*") = "⭐⭐⭐" // 문자열 반복
5. 객체, 배열, 문자열 조작 함수
🔍 contains 계열 - 데이터 검색의 핵심
기본 검색:
contains("Hello World", "World") = true
contains([1, 2, 3], 2) = true
contains(file, "tags") = true
대소문자 구분 없는 검색:
icontains("Hello", "HELLO") = true
정확한 단어 매칭:
containsword("Hello there!", "hello") = true
containsword("Hello there!", "hell") = false
📋 배열 조작의 고수되기
정렬과 역순:
sort([3, 1, 4, 1, 5]) = [1, 1, 3, 4, 5]
reverse([1, 2, 3]) = [3, 2, 1]
필터링과 매핑:
filter([1, 2, 3, 4, 5], (x) => x > 3) = [4, 5]
map([1, 2, 3], (x) => x * 2) = [2, 4, 6]
💡 실전 활용 - 중요한 태스크 필터링:
LIST
map(
filter(file.tasks, (t) => contains(t.text, "중요")),
(t) => t.text
) as "중요 태스크"
🧹 데이터 정리 함수
null 값 제거:
nonnull([1, null, 2, null, 3]) = [1, 2, 3]
배열 평탄화:
flat([[1, 2], [3, 4], 5]) = [1, 2, 3, 4, 5]
조건부 검사:
all([true, true, false]) = false
any([true, false, false]) = true
none([false, false, false]) = true
6. 문자열 처리 고급 기법
🔤 정규표현식 마스터
패턴 테스트:
regextest("\\d+", "abc123def") = true
regexmatch("\\d+", "123") = true
regexmatch("\\d+", "abc123") = false
고급 문자열 치환:
regexreplace("2024-01-15", "(\\d{4})-(\\d{2})-(\\d{2})", "$3/$2/$1")
// 결과: "15/01/2024"
✂️ 문자열 변형 함수
대소문자 변환:
upper("hello world") = "HELLO WORLD"
lower("HELLO WORLD") = "hello world"
문자열 분할과 결합:
split("apple,banana,orange", ",") = ["apple", "banana", "orange"]
join(["apple", "banana", "orange"], " | ") = "apple | banana | orange"
💡 실전 예제 - 태그 정리:
TABLE
join(
map(file.tags, (tag) => replace(tag, "#", "")),
", "
) as "태그 목록"
📏 문자열 형식화
패딩과 자르기:
padleft("5", 3, "0") = "005"
truncate("긴 제목입니다", 8, "...") = "긴 제목입..."
substring("Hello World", 0, 5) = "Hello"
7. 유틸리티 함수로 효율성 극대화
🛡️ default() - null 값 처리의 달인
기본값 설정:
default(dateCompleted, "진행중")
default(rating, 0)
default(tags, ["미분류"])
💡 실전 활용 - 프로젝트 상태 관리:
TABLE
default(status, "시작 전") as "상태",
default(priority, "보통") as "우선순위",
default(due, "미정") as "마감일"
FROM "프로젝트"
🎲 choice() - 조건부 로직
간단한 if-else 구현:
choice(completed, "✅ 완료", "⏳ 진행중")
choice(priority > 3, "🔥 긴급", "📋 일반")
📅 날짜 포맷팅 마스터
다양한 날짜 형식:
dateformat(file.ctime, "yyyy-MM-dd") = "2024-01-15"
dateformat(file.ctime, "yyyy년 M월 d일") = "2024년 1월 15일"
dateformat(now, "HH:mm:ss") = "14:30:25"
기간 표시:
durationformat(dur("3일 7시간"), "d'일' h'시간'") = "3일 7시간"
🔗 링크 메타데이터 활용
링크 정보 추출:
meta([[프로젝트#다음 작업]]).display = "다음 작업"
meta([[프로젝트#다음 작업]]).subpath = "다음 작업"
meta([[프로젝트#다음 작업]]).type = "header"
8. 실전 활용 예제
📊 프로젝트 대시보드 구축
TABLE
choice(status = "완료", "✅",
choice(status = "진행중", "🔄", "⏸️")) as "상태",
default(priority, "보통") as "우선순위",
choice(
due != null AND due < date(today), "🚨 지연",
choice(due != null AND dur(due - date(today)).days <= 3, "⚠️ 임박", "⏳ 여유")
) as "긴급도",
dateformat(due, "MM/dd") as "마감일"
FROM "프로젝트"
WHERE !contains(file.name, "템플릿")
SORT priority DESC, due ASC
📚 독서 통계 분석
TABLE
"📖 " + string(length(
filter(file.tags, (t) => contains(t, "독서"))
)) + "권" as "독서량",
"⭐ " + string(round(
average(
map(
filter(rows, (r) => r.rating != null),
(r) => r.rating
)
), 1
)) as "평균 평점",
"📄 " + string(sum(
map(
filter(rows, (r) => r.pages != null),
(r) => r.pages
)
)) + "페이지" as "총 페이지"
FROM "독서노트"
WHERE completed = true
GROUP BY dateformat(file.ctime, "yyyy년 M월") as "월별"
SORT key DESC
📝 태스크 관리 시스템
TASK
WHERE !completed
WHERE due != null
WHERE meta(section).subpath = "다음 작업"
SORT choice(
contains(text, "긴급"), 1,
choice(contains(text, "중요"), 2, 3)
) ASC, due ASC
🔗 지식 연결망 분석
TABLE
length(file.outlinks) as "발신 링크",
length(file.inlinks) as "수신 링크",
round(
length(file.outlinks) + length(file.inlinks), 0
) as "총 연결수",
join(
slice(
sort(
map(file.outlinks, (link) => meta(link).path)
), 0, 5
), ", "
) as "주요 연결"
FROM ""
WHERE length(file.outlinks) > 0 OR length(file.inlinks) > 0
SORT (length(file.outlinks) + length(file.inlinks)) DESC
LIMIT 20
💡 Dataview 함수 활용 팁
✅ 성능 최적화 전략
- 필터링을 먼저: WHERE 절로 데이터를 먼저 줄이기
- 중첩 함수 최소화: 가독성과 성능을 위해 단순하게 구성
- null 값 처리: nonnull() 함수로 안전한 계산
- 인덱싱 활용: 자주 사용하는 필드는 인덱스 생성
🎯 디버깅 방법
- 단계별 테스트: 복잡한 함수를 부분별로 테스트
- 타입 확인: typeof() 함수로 데이터 타입 검증
- 중간 결과 출력: TABLE로 중간 계산 결과 확인
- 에러 메시지 활용: Dataview 에러 메시지를 통한 문제 파악
📈 고급 활용 패턴
조건부 집계:
sum(map(
filter(rows, (r) => r.status = "완료"),
(r) => r.points
))
동적 그룹화:
GROUP BY choice(
due != null AND due < date(today), "지연",
choice(due != null, "예정", "미정")
) as "상태별"
복합 정렬:
SORT
choice(priority = "높음", 1, choice(priority = "중간", 2, 3)),
due ASC,
file.name ASC
🎯 핵심 요약
Obsidian Dataview 함수는 단순한 데이터 조회를 넘어 노트 간 연결과 패턴을 발견하고, 자동화된 대시보드를 구축하며, 개인 지식 관리를 혁신하는 강력한 도구입니다.
💎 성공적인 활용을 위한 핵심:
- 점진적 학습: 기본 함수부터 차근차근 익히기
- 실전 적용: 실제 노트 관리에 바로 적용해보기
- 커뮤니티 활용: Obsidian 커뮤니티의 다양한 예제 참고
- 지속적 개선: 사용하면서 점진적으로 고도화
이 가이드를 통해 Dataview 함수의 진정한 파워를 경험하고, 개인 지식 관리의 새로운 차원을 열어보세요!
'지식 공유 > 옵시디언' 카테고리의 다른 글
Obsidian과 Todoist의 완벽 조합: Todoist 플러그인으로 생산성 극대화하기 (0) | 2025.07.08 |
---|---|
2025년 옵시디언 필수 플러그인 추천 8선 - 생산성 10배 높이는 완벽 가이드 (1) | 2025.07.08 |