티스토리 뷰
옵시디언 사용기9 - 데이터뷰 인라인함수
Kimyo 2022. 9. 14. 18:59옵시디언 데이터뷰에는 인라인쿼리(Inline Query)라는 신기한 기능이 있습니다. 인라인쿼리는 노트 중간에 일종의 함수를 입력하는 기능입니다.
예를 들어, 노트를 작성하는 도중에 486/3
를 계산하고 싶을 수 있습니다. 만약, 옵시디언 데이터뷰를 사용중이라면 =486/3
를 입력하는 것만으로 162
란 결과값을 얻을 수 있습니다.
오늘 날자를 =dateformat(date(today),"yyyy년 M월 d일")
과 같은 함수로 불러오는 등 다양한 방식으로 활용할 수 있기 때문에 익혀둘 필요가 있습니다.
목차
1. 기본 사용 방법
데이터뷰 인라인함수는 백틱(`) 사이에 인라인함수 접두사(=)를 넣어 사용합니다. 접두사의 경우 기본값이 등호인데, 원한다면 데이터뷰 환경설정에서 다른 접두사로 설정 가능합니다.
예를 들어, 옵시디언 노트 작성 중간에 다음과 같은 입력을 하는 상황을 가정해봅니다.
1번째 줄 : `=this.file.cday`
2번째 줄 : `=3+4`
그러면 아래와 같은 결과가 출력됩니다.
1번째 줄 : 2022-09-12
2번째 줄 : 7
위와 같이 데이터뷰 인라인함수를 사용하면 문서 중간에 파일의 메타데이터를 불러와 입력하거나, 간단한 수식 계산을 할 수 있습니다.
2. 노트 지정자 this
데이터뷰에 관한 지난 포스팅에서 옵시디언 데이터뷰에는 자체적인 내장 필드가 있다고 말씀드렸습니다.
인라인함수를 사용하면 위와 같은 내장필드, 프론트매터, 인라인필드에 저장되어 있는 메타데이터를 마음껏 불러올 수 있습니다.
다만, `=file.name` 과 같이 바로 데이터를 가져오려 하면 안됩니다. 제대로된 결과를 얻기 위해서는 `=this.file.name` 처럼 어떤 노트의 필드를 불러올지 지정해주어야 합니다.
예를 들어, 다음과 같이 입력하는 상황을 가정해봅시다.
1번째 줄 : `=file.name`
2번째 줄 : `=this.file.name`
그러면 다음과 같이 2번째 줄만 올바른 결과가 표시됩니다.
1번째 줄 : -
2번째 줄 : 9. 옵시디언 데이터뷰 인라인함수
여기서 this
는 인라인함수가 입력되고 있는 지금 이 노트를 의미합니다. 작성중인 노트에 있는 데이터를 가져올 때는 반드시 노트 지정자 this
를 붙여줍시다.
3. 다른 노트를 호출하는 방법
그러나 작성중인 노트가 아닌 다른 노트의 내장필드를 호출하고 싶을 때도 있습니다. 예를 들어, A노트를 작성 중에 B노트를 호출해야 한다고 가정해봅시다.
이 경우, 옵시디언의 인링크(inlink)를 거는 것과 같은 방식으로 [[노트이름]]
을 통해 원하는 노트를 호출할 수 있습니다.
예를 들어, 다음과 같은 방식으로 내장 필드를 호출할 수 있습니다.
1번째 줄 : `=this.file.name`
2번째 줄 : `=[[B]].file.name`
1번째 줄은 작성중인 노트의 이름을, 2번째 줄은 노트 B
의 파일명을 호출해줍니다.
4. 인라인쿼리 함수
옵시디언에서 자체적으로 제공하고 있는 인라인 쿼리 함수들은 다음과 같습니다.
4.1. 데이터 구성 함수
4.1.1. 날짜를 만드는 date(any)
날짜를 의미하는 text를 입력받아 날짜 형태의 데이터형을 출력합니다. 이때, text는 today, yesterday 같은 자연어이거나, "yyyy-mm-dd" 형태의 날짜여야 합니다.
예를 들어, 다음과 같이 입력할 수 있습니다.
1번째 줄 : `=date("2022-09-12")`
2번째 줄 : `=date("today")`
3번째 줄 : `=date(["yesterday", "today", "tomorrow"])`
그러면 다음과 같이 결과가 표시됩니다.
4.1.2. 기간을 만드는 dur(any)
기간을 의미하는 text를 입력받아 기간 형태의 데이터형을 출력합니다. date() 함수와 함께 사용할 때 빛을 발휘합니다.
예를 들어, 오늘을 기준으로 다음과 같이 날짜들을 입력할 수 있습니다.
3일 전 : `=date(today) - dur(3 days)`
1달 전 : `=date(today) - dur(1 month)`
1년 뒤 : `=date(today) + dur(1 year)`
위와 같이 입력한 경우 아래와 같이 출력됩니다.
dur 함수의 인자로는 year, month, day, hour, minute, second 등 날짜 및 시간과 관련된 인자들이 올 수 있습니다.
4.1.3. 숫자를 추출하는 number(string)
문자열에서 숫자만 추출하고 싶은 경우에 number 함수를 사용합니다. 숫자가 있으면 숫자를 추출하고, 없는 경우 null 을 반환합니다.
`=number("36 years old")` → 36
`=number(36)` → 36
`=number("thirty six")` → -
4.1.4. 문자로 변환하는 string(any)
어떤 값을 입력하든 string 형태의 데이터형으로 변환을 해줍니다. string 을 사용하지 않더라도 결국 문자열로 출력되기 때문에 체감되는 효과는 없습니다.
`=string(36)` → 36
`=string(date(today))` → 22-09-12
4.1.5. 내부 링크를 생성하는 link(path, 'display')
인링크를 생성합니다. 만약, 기존 노트가 있다면 연결되고, 기존 노트가 없다면 새로운 노트를 생성하여 연결합니다.
노트는 파일명만 적을 수도, 링크명을 따로 적을 수도 있습니다.
1번째 방법 : `=link("New Note Name","LinkName")`
2번째 방법 : `=link("New Note Name")`
4.1.6. 임베드를 생성하는 embed(link)
링크 함수만 따로 사용하는 경우는 보통 잘 없고, embed 함수와 함께 사용하여 노트를 삽입합니다.
아래와 같은 형태로 사용합니다.
`=embed(link(A.png))`
4.1.7. 외부 링크를 생성하는 elink(url, 'display')
외부 링크를 생성합니다. link 와 마찬가지로 링크명을 적을 수도 있습니다.
1번재 방법 : `=elink("www.google.com","google")`
1번재 방법 : `=elink("www.google.com")`
4.1.8. 변수형을 확인하는 typeof(any)
`=typeof(36)` → number
`=typeof("36 years old")` → string
`=typeof([36, 40, 50])` → array
`=typeof({a:1, b:2})` → object
`=typeof(date(today))` → date
`=typeof(dur(1 day))` → duration
4.2. 숫자 연산 함수
4.2.1. 반올림을 하는 =round(num, 'digits')
소수점 이하 N개 자리수(Digits)까지 표시되도록 반올림을 합니다. 1의 자리 이상에선 반올림을 하지 못하고, 'Digits'를 생략할 경우 소숫점만 반올림해줍니다.
`=round(55.5555,1)` → 55.6
`=round(55.5555)` → 56
4.2.2. 곱 연산을 하는 =protuct()
주로 LIST 를 입력으로 받아 곱 연산을 합니다.
`=product([1,2,3,4,5])` → 120
`=product(list(1,2,3,4,5))` → 120
4.2.3. 합 연산을 하는 =sum()
주로 LIST 를 입력으로 받아 합 연산을 합니다.
`=sum([1,2,3,4,5])` → 15
`=sum(list(1,2,3,4,5))` → 15
4.3. 조건문 함수
4.3.1. 조건을 주는 =choice(COndition, a, b)
엑셀에서 사용하는 if 함수와 같은 기능을 하는 것이 choice 함수입니다.
`=choice(date("2023-04-08")>date(today)`,"내년 이후","올해 이전")
4. 날짜 및 시간 형식
날짜 및 시간 형식 부분은 자주 쓰이는 부분이라 따로 정리하였습니다.
4.1. 날짜 및 시간 형식을 지정해주는 =dateformat(date, format)
옵시디언 데이터뷰에서 날자 형식을 지정하는 방법은 지난 포스팅에 정리했던 바가 있습니다. 그 때는 날짜에만 집중해서 포스팅을 했었는데 이번에는 시간까지 알아보겠습니다.
=dateformat(date(now),"yyyy-MM-dd") → 2022-09-12
=dateformat(this.file.ctime, "yyyy-MM-dd, HH:mm:ss") → 2022-09-12, 18:31:37
이때, Format은 Luxon date format Option 에 따라서 원하는 방식으로 조합해 사용하면 됩니다. 흔히 사용되는 토큰(token)은 다음과 같은 것들입니다.
4.2. 옵시디언 데이터뷰 날짜 관련 토큰
- 년(year) 관련
- yyyy : 4자리 연도 (예: 2022)
- yy : 2자리 연도 (예: 22)
- 월(Month) 관련
- MM : 2자리 월(예: 03)
- M: 1자리 월(예: 3)
- 일(Day) 관련
- dd: 2자리 날짜 (예: 08)
- d: 1자리 날짜 (예: 8)
- 요일(Weekday) 관련
- cccc: 요일 3자리 (예: 화요일)
- ccc: 요일 1자리 (예: 화)
- 시각(Hour) 관련
- a : 오전, 오후(예: PM)
- hh : 2자리 12시간제 시각(예: 06)
- h : 1자리 12시간제 시각(예: 6)
- HH : 2자리 24시간제 시각(예: 18)
- H : 1자리 24시간제 시각(예: 18)
4.3. 옵시디언 데이터뷰 기타 토큰
- 시간대(GMT+) 관련
- Z : 짧게 표시 (예: +9)
- ZZ : 길게 표시 (예: +09:00)
- ZZZ : 생략 표시 (예: +0900)
- ZZZZ : 완전 표시 (예: GMT+9)
- ZZZZZ : 기준 축약 표시 (예: 한국 표준시)
- z : IANA zone 표시 (예: Asia/Seoul)
- 연중 몇 번째 주(Week) 관련
- WW : 2자리 주 수(예: 37)
- W : 1자리 주 수(예: 37)
- 연중 몇 번째 일(Day) 관련
- ooo : 3자리 일수 (예: 055)
- o : 1자리 일수 (예: 55)
5. 데이터뷰 쿼리와 함께 쓰는 방법
위에서 설명한 옵시디언 인라인쿼리의 내용들은 데이터뷰 쿼리에서도 동일하게 사용할 수 있습니다.
예를 들어, 지난 며칠간 포스팅을 데이터뷰 쿼리로 불러오기 위해서는 다음과 같이 쓸 수 있습니다.
``` dataview
TABLE
FROM "POSTING/OBSIDIAN"
WHERE file.cday > (date(today) - dur(1 week))
```
이처럼 옵시디언 DATAVIEW를 사용할 때에도 내장필드나 인라인함수들이 그대로 사용되기 때문에 사용 방법을 익혀둘 필요가 있습니다.
6. 옵시디언 인라인함수 사용 주의사항
옵시디언 인라인함수는 옵시디언 데이터뷰 플러그인을 통해 마크업(MarkUp) 되기 때문에 다른 마크다운 편집기에서는 무용지물일 수 있습니다. 따라서 다른 노트 편집기나 블로그 등으로 이식될 수 있는 노트에서는 사용에 주의해야 합니다.
따라서 저는 인라인함수는 잘 사용하지 않고, 데이터뷰로 대쉬보드를 만들 때 일부 활용하는 방식으로 사용하고 있습니다.
예를 들어, 데이터뷰 대쉬보드로 파일의 글자수를 체크하고자 한다면 다음과 같이 인라인함수를 활용할 수 있습니다.
``` dataview
TABLE
round(file.size/2) as "길이"
WHERE file.name = this.file.name
```
여기서 file.size 는 노트의 용량을 byte 단위로 반환합니다. 노트(md파일)는 기본적으로 텍스트 파일이기 때문에 한글은 2byte, 숫자 및 영문은 1byte 의 용량을 차지합니다. 따라서, 한글 위주의 문서라면 나누기 2를 하여 대략적인 글자 수가 추정됩니다.