글 데이터 증가에 따라 느려진 로딩 속도 저하 해결하기(feat. Obsidian)
Description: Obsidian digital garden이라는 플러그인을 쓰면서 최근 데이터가 점점 커질수록 로딩 속도가 느려지는 퍼포먼스 이슈를 해결하는 과정이 담긴 트러블슈팅 글입니다.
현재 노트: KR-010.00 d
상위 분류: KR-010.00
문제 상황
Obsidian으로 웹에 호스팅하고있는 환경에서 digital-garden 플러그인이 작성된 글들을 검사하는 과정이 점점 길어지다 어느새 30초가 넘는 시간이 소모되기 시작했습니다. 최근들어 급격하게 느려지기 시작하다가 이제는 문제가 생길 정도가 됐기에 해결하기로 했습니다.
현상 분석
먼저 Obsidian에서 Obsidian내에서 ctrl + shift + I
를 통해 개발자도구를 열 수 있고 여기서 console 로그를 확인합니다.
plugin:digitalgarden:2557 DG: Mon, 17 Mar 2025 16:54:21 GMT dvapi.tryEvaluate did not yield any result Error: Cannot call type 'null' as
invokeConsoleMethod @ plugin:digitalgarden:2557
eval @ plugin:digitalgarden:2595
invoke @ plugin:digitalgarden:2514
__async @ plugin:digitalgarden:74
...
fulfilled @ plugin:digitalgarden:77
Promise.then
step @ plugin:digitalgarden:89
fulfilled @ plugin:digitalgarden:77
특정 에러와 경고가 몇개 확인이 됐으며 단순한 2가지 정도의 오류가 여러번 반복되는 형태였습니다.
여기서 언급된 플러그인의 해당 코드를 개발자도구에서 추가로 확인합니다.
{ .block-language-dataview}`
);
} catch (e) {
console.log(e);
new import_obsidian2.Notice(
...
...;
if (!result) {
result = tryEval(query);
}
if (!result) {
result = yield tryExecuteJs(query, file, dvApi);
}
replacedText = replacedText.replace(
code,
result != null ? result : "Unable to render query"
);
...
해당 코드를 확인해봐도 특정 시간이 많이 걸리는 코드라던가 또는 예외처리가 없는 코드레벨의 문제는 아닌것 처럼 보입니다. 이에 따라 console로그를 다시 확인하고 claude같은 AI에게 물어보며 원인을 추정해봅니다
포인트는 같은 오류가 18번 정도 반복되는 블럭 단위가 여러번 반복 됨
콘솔 에러에서는 특히 특정 렌더가 불가능하다는 메시지가 많이 보였습니다.
즉 시간이 많이 걸리는 이유는 렌더 결과를 찾지 못해 promise 체인이 dv.current
라는문법을 못찾으면서 promise체인이 18번 넘게 발생 한다는 인사이트를 가지고 추적합니다.
처음에는 오류의 종류에 포커싱을 두었지만 이제는 오류의 크기와 걸리는 시간을 기준으로 생각해봅니다.
해당 원인을 추정한 근거
최근 dv.current
라는 특별한 Obsidian을 사용하기 시작함최근 들어 점점 느려짐
해결책으로 모든 dv.current
datview 제거해봅니다.
그 결과 로딩속도가 약 5초로 확 줄어듬
여전히 옵시디언 개발자 도구에서 warning이 뜨긴하지만, 가장 중요한 로딩 속도가 5초이내로 해결됐습니다.
추가로 dv.title
이라는 옵시디언 추가 문법 약 25개 제거
렌더에서 이렇게 문제가 생겼다면 최근에 dv.current
이외에 dv.title
이라는 임의의 문법도 사용했는데, 해당 렌더도 로딩 시간을 늘리는 원인이라 생각해 대부분 삭제해봅니다.
최종 로딩시간 약 3초
결론
Obsidian이라는 프로덕트와 복잡한 플러그인을 사용하는 환경에서 데이터의 증가에 따라 로딩속도가 저하되는 경험과 이를 해결한 경험.
트러블슈팅을 하는데 결정적 단서를 제공한 로그
plugin:digitalgarden:2557 DG: Tue, 18 Mar 2025 02:09:46 GMT dvapi.tryEvaluate did not yield any result Error: Cannot call type 'null' as a function
at Failure.orElseThrow (plugin:dataview:7452:19)
at DataviewApi.tryEvaluate (plugin:dataview:19401:63)
at tryDVEvaluate (plugin:digitalgarden:10863:34)
at DataviewCompiler.eval (plugin:digitalgarden:10801:20)
at Generator.next (<anonymous>)
at eval (plugin:digitalgarden:90:61)
at new Promise (<anonymous>)
at __async (plugin:digitalgarden:74:10)
at eval (plugin:digitalgarden:10699:41)
at GardenPageCompiler.eval (plugin:digitalgarden:17175:50)
invokeConsoleMethod @ plugin:digitalgarden:2557
eval @ plugin:digitalgarden:2595
invoke @ plugin:digitalgarden:2514
warn @ plugin:digitalgarden:2496
eval @ plugin:digitalgarden:2441
tryDVEvaluate @ plugin:digitalgarden:10868
eval @ plugin:digitalgarden:10801
eval @ plugin:digitalgarden:90
__async @ plugin:digitalgarden:74
eval @ plugin:digitalgarden:10699
eval @ plugin:digitalgarden:17175
eval @ plugin:digitalgarden:90
__async @ plugin:digitalgarden:74
eval @ plugin:digitalgarden:17173
eval @ plugin:digitalgarden:17126
fulfilled @ plugin:digitalgarden:77
Promise.then
step @ plugin:digitalgarden:89
eval @ plugin:digitalgarden:90
__async @ plugin:digitalgarden:74
eval @ plugin:digitalgarden:17124
eval @ plugin:digitalgarden:17123
eval @ plugin:digitalgarden:90
__async @ plugin:digitalgarden:74
eval @ plugin:digitalgarden:17122
eval @ plugin:digitalgarden:17637
fulfilled @ plugin:digitalgarden:77
Promise.then
step @ plugin:digitalgarden:89
eval @ plugin:digitalgarden:90
__async @ plugin:digitalgarden:74
generateMarkdown @ plugin:digitalgarden:17613
eval @ plugin:digitalgarden:17019
eval @ plugin:digitalgarden:90
__async @ plugin:digitalgarden:74
compile @ plugin:digitalgarden:17018
eval @ plugin:digitalgarden:23331
fulfilled @ plugin:digitalgarden:77
Promise.then
step @ plugin:digitalgarden:89
fulfilled @ plugin:digitalgarden:77
Promise.then
step @ plugin:digitalgarden:89
fulfilled @ plugin:digitalgarden:77
Promise.then
step @ plugin:digitalgarden:89
fulfilled @ plugin:digitalgarden:77
Promise.then
step @ plugin:digitalgarden:89
fulfilled @ plugin:digitalgarden:77
Promise.then
step @ plugin:digitalgarden:89
fulfilled @ plugin:digitalgarden:77
Promise.then
step @ plugin:digitalgarden:89
fulfilled @ plugin:digitalgarden:77
Promise.then
step @ plugin:digitalgarden:89
fulfilled @ plugin:digitalgarden:77
Promise.then
step @ plugin:digitalgarden:89
fulfilled @ plugin:digitalgarden:77
Promise.then
step @ plugin:digitalgarden:89
fulfilled @ plugin:digitalgarden:77
Promise.then
step @ plugin:digitalgarden:89
fulfilled @ plugin:digitalgarden:77
Promise.then
step @ plugin:digitalgarden:89
fulfilled @ plugin:digitalgarden:77
Promise.then
step @ plugin:digitalgarden:89
fulfilled @ plugin:digitalgarden:77
Promise.then
step @ plugin:digitalgarden:89
fulfilled @ plugin:digitalgarden:77
Promise.then
step @ plugin:digitalgarden:89
fulfilled @ plugin:digitalgarden:77
Promise.then
step @ plugin:digitalgarden:89
fulfilled @ plugin:digitalgarden:77
Promise.then
step @ plugin:digitalgarden:89
fulfilled @ plugin:digitalgarden:77
Promise.then
step @ plugin:digitalgarden:89
fulfilled @ plugin:digitalgarden:77
2plugin:digitalgarden:2557 DG: Tue, 18 Mar 2025 02:09:46 GMT dvapi.tryEvaluate did not yield any result Error: Cannot call type 'null' as a function
at Failure.orElseThrow (plugin:dataview:7452:19)
at DataviewApi.tryEvaluate (plugin:dataview:19401:63)
at tryDVEvaluate (plugin:digitalgarden:10863:34)
at DataviewCompiler.eval (plugin:digitalgarden:10801:20)
at Generator.next (<anonymous>)
at eval (plugin:digitalgarden:90:61)
at new Promise (<anonymous>)
at __async (plugin:digitalgarden:74:10)
at eval (plugin:digitalgarden:10699:41)
at GardenPageCompiler.eval (plugin:digitalgarden:17175:50)
invokeConsoleMethod @ plugin:digitalgarden:2557
eval @ plugin:digitalgarden:2595
invoke @ plugin:digitalgarden:2514
warn @ plugin:digitalgarden:2496
eval @ plugin:digitalgarden:2441
tryDVEvaluate @ plugin:digitalgarden:10868
eval @ plugin:digitalgarden:10801
eval @ plugin:digitalgarden:90
__async @ plugin:digitalgarden:74
eval @ plugin:digitalgarden:10699
eval @ plugin:digitalgarden:17175
eval @ plugin:digitalgarden:90
__async @ plugin:digitalgarden:74
eval @ plugin:digitalgarden:17173
eval @ plugin:digitalgarden:17126
fulfilled @ plugin:digitalgarden:77
Promise.then
step @ plugin:digitalgarden:89
eval @ plugin:digitalgarden:90
__async @ plugin:digitalgarden:74
eval @ plugin:digitalgarden:17124
eval @ plugin:digitalgarden:17123
eval @ plugin:digitalgarden:90
__async @ plugin:digitalgarden:74
eval @ plugin:digitalgarden:17122
eval @ plugin:digitalgarden:17637
fulfilled @ plugin:digitalgarden:77
Promise.then
step @ plugin:digitalgarden:89
eval @ plugin:digitalgarden:90
__async @ plugin:digitalgarden:74
generateMarkdown @ plugin:digitalgarden:17613
eval @ plugin:digitalgarden:17019
eval @ plugin:digitalgarden:90
__async @ plugin:digitalgarden:74
compile @ plugin:digitalgarden:17018
eval @ plugin:digitalgarden:23331
fulfilled @ plugin:digitalgarden:77
Promise.then
step @ plugin:digitalgarden:89
fulfilled @ plugin:digitalgarden:77
Promise.then
step @ plugin:digitalgarden:89
fulfilled @ plugin:digitalgarden:77
Promise.then
step @ plugin:digitalgarden:89
fulfilled @ plugin:digitalgarden:77
Promise.then
step @ plugin:digitalgarden:89
fulfilled @ plugin:digitalgarden:77
Promise.then
step @ plugin:digitalgarden:89
fulfilled @ plugin:digitalgarden:77
Promise.then
step @ plugin:digitalgarden:89
fulfilled @ plugin:digitalgarden:77
Promise.then
step @ plugin:digitalgarden:89
fulfilled @ plugin:digitalgarden:77
Promise.then
step @ plugin:digitalgarden:89
fulfilled @ plugin:digitalgarden:77
Promise.then
step @ plugin:digitalgarden:89
fulfilled @ plugin:digitalgarden:77
Promise.then
step @ plugin:digitalgarden:89
fulfilled @ plugin:digitalgarden:77
Promise.then
step @ plugin:digitalgarden:89
fulfilled @ plugin:digitalgarden:77
Promise.then
step @ plugin:digitalgarden:89
fulfilled @ plugin:digitalgarden:77
Promise.then
step @ plugin:digitalgarden:89
fulfilled @ plugin:digitalgarden:77
Promise.then
step @ plugin:digitalgarden:89
fulfilled @ plugin:digitalgarden:77
Promise.then
step @ plugin:digitalgarden:89
fulfilled @ plugin:digitalgarden:77
Promise.then
step @ plugin:digitalgarden:89
fulfilled @ plugin:digitalgarden:77
Promise.then
step @ plugin:digitalgarden:89
fulfilled @ plugin:digitalgarden:77
Promise.then
step @ plugin:digitalgarden:89
fulfilled @ plugin:digitalgarden:77
plugin:digitalgarden:17263 can't find transcluded file filename