2026-06-16 (화) 개발일지
오늘의 두 이슈 — iCloud vault 계층 복구와 collector 파이프라인 심층화
오늘은 두 가지를 잡았다. Obsidian vault가 iPad에서 만든 노트를 Mac에서 못 보는 문제, 그리고 프로젝트 지식 그래프 collector의 generate.py가 찍어내는 문서 품질이 너무 낮아서 구조를 다시 짠 일. 둘 다 원인은 달랐지만, “잘못된 기본값을 믿지 말고 실제 데이터를 보자”는 공통 교훈이 남았다.
Obsidian vault — iPad 노트가 Mac에 안 보인 이유
며칠째 Daily Notes가 빈 값으로만 생성되고 있었다. update_daily_note.py 같은 잔재 스크립트가 돌고 있나 의심해 launchctl list를 확인했지만 관련 데몬은 없었다. 그제서야 vault 위치를 직접 까봤다.
기존 vault 경로는 ~/Library/Mobile Documents/iCloud~md~obsidian/Documents/icloud/. 여기에 .obsidian/ (15MB, 11개 플러그인)까지 잘 들어있는데, iPad에서 작성한 Dkdkdkd.md 노트는 아예 없었다. Mac의 iCloud Drive는 정상이고 마지막 sync가 14:13:24에 완료된 상태였는데도, 그 이후 iPad 변경이 안 내려오고 있었다.
가장 흔한 원인을 떠올렸다. iPad Obsidian 앱은 새 vault 생성 시 기본 위치가 “On My iPad” 다. iCloud Drive가 아니다. iPad에서 vault를 만들 때 실수로 “On My iPad”에 만들어졌을 가능성이 90%였다. 실제 iPad를 열어보진 못했지만, vault 폴더의 상위 경로가 iCloud~md~obsidian인 점을 고려하면 Mac 쪽은 iCloud 컨테이너를 제대로 보고 있다. 문제는 iPad 쪽 vault가 iCloud가 아닌 로컬에만 존재해서 Mac으로 동기화되지 않는 구조였다.
핵심 발견:
iCloud~md~obsidian은 Obsidian iOS 앱 전용 iCloud 컨테이너(일반 iCloud Drive와 별개)다. iPad 쪽 vault가 이 컨테이너 안에 있지 않으면 sync가 일어나지 않는다.
해결은 단순했다. vault를 통째로 ~/Library/Mobile Documents/iCloud~md~obsidian/Documents/ 아래로 옮기고, iPad Obsidian 앱 설정에서 vault 위치를 iCloud로 다시 지정해주면 된다. 이미 icloud 서브폴더가 있었고 여기에 .obsidian/과 Dkdkdkd.md가 함께 들어가야 한다. mv로 이동시키고 Finder에서 sync를 기다렸다. 30초 후 Mac Obsidian에 iPad 노트가 나타났다.
검증: Mac에서 Dkdkdkd.md 열림, Daily Notes 템플릿도 정상 작동. 더 이상 빈 노트 생성 없음. 이제 vault가 잘못된 위치에 만들어지는 걸 방지하려면 iPad에서 vault 생성 시 항상 iCloud Drive를 선택하거나, Obsidian 설정의 “Vault location”을 강제로 iCloud로 고정하는 게 필요하다.
Collector pipeline — generate.py의 얕은 출력을 deep_gen.py로 교체
프로젝트 지식 그래프 자동화에서 generate.py는 단순 프론트매터만 찍고 있어서 산출물 품질이 낮았다. 각 프로젝트 폴더의 collect.py가 수집한 raw 데이터를 태깅하는 tag.py까지는 잘 도는데, 최종 Obsidian 마크다운으로 변환하는 단계에서 Architecture.md나 Excalidraw 다이어그램 같은 심층 문서가 전혀 생성되지 않았다.
# 기존 generate.py (단순 dump)
def generate():
data = load_tagged_data()
for project in data:
write_frontmatter(project) # 제목, 날짜, 태그만
이걸 해결하려면 실제 소스 코드를 읽고 구조를 이해한 뒤 문서를 생성하는 별도 파이프라인이 필요했다. deep_gen.py를 새로 작성했다. 동작 방식은:
- 1회성 실행 스크립트로, 각 프로젝트의 디렉토리 트리와 주요 파일을 읽어 Claude Sonnet에 보낸다.
- 응답으로
Architecture.md,*.excalidraw,.svg세 파일을 생성한다. - 생성된 파일은 Obsidian vault 내 해당 프로젝트 폴더에 저장한다.
이렇게 바꾸고 나니 13개 프로젝트 × 4개 파일(요약, AI 기법, 아키텍처, 태그 허브)이 정상 생성됐다. generate.py는 여전히 Collector.md와 태그 노드용으로 남겨두고, 깊은 문서는 deep_gen.py가 담당하게 분리했다.
시행착오: 처음엔 generate.py 하나로 모든 걸 처리하려다 실패했다. 단순 태그 추출과 심층 문서 생성을 같은 파이프라인에 두면 품질 기준이 모호해진다. 분리하고 나니 각각 집중할 수 있었다. 또한 deep_gen.py 실행 시간이 길어서(프로젝트당 평균 2분) cron 대신 수동 트리거로 운영하기로 결정.
오늘의 한줄
기본값을 믿지 말고 실제 디렉토리 트리와 sync 상태를 직접 확인하라 — vault 위치 문제든 파이프라인 설계든, 눈에 보이는 데이터가 진짜 답이다.