Labs.dedesoso ACTIVITIES

대대소소의 연구소 입니다.

ABOUT US

블로거 대대소소가 운영하는 블로그입니다. 다양한 정보와 인사이트를 공유합니다.

INNOVATION

최신 기술과 트렌드를 통해 혁신적인 컨텐츠를 제공합니다.

CONTENT

유용하고 흥미로운 컨텐츠를 지속적으로 업데이트합니다.

Obsidian Dataview 함수 완벽 가이드: 데이터 조작의 모든 것

728x90

📋 목차

  1. Dataview 함수란 무엇인가?
  2. 함수의 기본 작동 원리
  3. 생성자 함수 완벽 활용법
  4. 숫자 연산 함수 마스터하기
  5. 객체, 배열, 문자열 조작 함수
  6. 문자열 처리 고급 기법
  7. 유틸리티 함수로 효율성 극대화
  8. 실전 활용 예제

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 함수 활용 팁

성능 최적화 전략

  1. 필터링을 먼저: WHERE 절로 데이터를 먼저 줄이기
  2. 중첩 함수 최소화: 가독성과 성능을 위해 단순하게 구성
  3. null 값 처리: nonnull() 함수로 안전한 계산
  4. 인덱싱 활용: 자주 사용하는 필드는 인덱스 생성

🎯 디버깅 방법

  1. 단계별 테스트: 복잡한 함수를 부분별로 테스트
  2. 타입 확인: typeof() 함수로 데이터 타입 검증
  3. 중간 결과 출력: TABLE로 중간 계산 결과 확인
  4. 에러 메시지 활용: 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 함수의 진정한 파워를 경험하고, 개인 지식 관리의 새로운 차원을 열어보세요!

 

728x90