디지털 생산성/옵시디언
옵시디언 API와 자동화
지식의 아웃소싱
2025. 2. 9. 13:36
반응형
옵시디언 API와 자동화 완벽 가이드: 워크플로우 최적화
옵시디언의 강력한 기능 중 하나는 바로 API를 통한 확장성과 자동화 가능성입니다. 이 가이드에서는 옵시디언 API를 활용한 다양한 자동화 방법과 실제 적용 사례를 상세히 알아보겠습니다.
1. API 기본 설정
API 플러그인 설치
설치 단계:
1. 설정 → 커뮤니티 플러그인
2. "Obsidian API" 검색
3. 설치 및 활성화
4. 권한 설정 확인
기본 API 구조
// 기본 API 호출 구조
const ObsidianAPI = {
app: app,
workspace: app.workspace,
vault: app.vault,
metadataCache: app.metadataCache
};
// 파일 작업 예시
async function createNote(title, content) {
try {
await app.vault.create(title + '.md', content);
} catch (error) {
console.error('노트 생성 실패:', error);
}
}
2. 자동화 스크립트 작성
QuickAdd 자동화
// 새로운 프로젝트 노트 생성
module.exports = async (params) => {
const {quickAdd} = params;
// 사용자 입력 받기
const projectName = await quickAdd.inputPrompt(
"프로젝트 이름을 입력하세요:"
);
// 템플릿 내용
const template = `---
title: ${projectName}
created: {{date}}
status: 진행중
---
# ${projectName}
## 목표
## 주요 작업
## 일정
## 참고자료
`;
// 새 노트 생성
await quickAdd.createNote({
folder: "Projects",
name: projectName,
content: template
});
}
Templater 스크립트
// 동적 템플릿 생성
<%*
// 날짜 정보 가져오기
let today = moment().format('YYYY-MM-DD');
let tomorrow = moment().add(1, 'days').format('YYYY-MM-DD');
// 제목 생성
let title = await tp.system.prompt('노트 제목 입력:');
// 프론트매터 생성
tR += `---
title: ${title}
created: ${today}
due: ${tomorrow}
tags:
status: 진행중
---
# ${title}
## 개요
## 세부 내용
## 다음 단계
`;
_%>
3. API를 활용한 데이터 처리
메타데이터 처리
// 메타데이터 추출 및 처리
async function processMetadata() {
const files = app.vault.getMarkdownFiles();
const metadata = [];
for (const file of files) {
const cache = app.metadataCache.getFileCache(file);
if (cache?.frontmatter) {
metadata.push({
title: file.basename,
...cache.frontmatter
});
}
}
return metadata;
}
// 태그 분석
async function analyzeTags() {
const files = app.vault.getMarkdownFiles();
const tagCount = {};
for (const file of files) {
const cache = app.metadataCache.getFileCache(file);
if (cache?.tags) {
cache.tags.forEach(tag => {
tagCount[tag.tag] = (tagCount[tag.tag] || 0) + 1;
});
}
}
return tagCount;
}
링크 분석
// 내부 링크 분석
async function analyzeLinks() {
const files = app.vault.getMarkdownFiles();
const linkGraph = {};
for (const file of files) {
const cache = app.metadataCache.getFileCache(file);
if (cache?.links) {
linkGraph[file.basename] = cache.links.map(link => link.link);
}
}
return linkGraph;
}
4. 커스텀 명령어 생성
명령어 등록
// 커스텀 명령어 추가
module.exports = {
onload() {
this.addCommand({
id: 'create-daily-note',
name: '데일리 노트 생성',
callback: () => this.createDailyNote(),
hotkeys: [
{
modifiers: ["Mod", "Shift"],
key: "d"
}
]
});
},
async createDailyNote() {
// 데일리 노트 생성 로직
}
};
단축키 설정
// 단축키 등록
const HOTKEYS = {
CREATE_NOTE: {
modifiers: ["Mod", "Shift"],
key: "n"
},
QUICK_CAPTURE: {
modifiers: ["Alt"],
key: "c"
}
};
5. 외부 서비스 연동
REST API 연동
// 외부 API 호출
async function fetchExternalData(url) {
try {
const response = await fetch(url, {
method: 'GET',
headers: {
'Content-Type': 'application/json'
}
});
return await response.json();
} catch (error) {
console.error('API 호출 실패:', error);
return null;
}
}
Webhook 처리
// Webhook 이벤트 처리
async function handleWebhook(event) {
const {type, data} = event;
switch (type) {
case 'note.create':
await createNoteFromWebhook(data);
break;
case 'note.update':
await updateNoteFromWebhook(data);
break;
default:
console.log('알 수 없는 이벤트 타입:', type);
}
}
6. 데이터 동기화 자동화
자동 백업
// 자동 백업 설정
async function setupAutoBackup() {
// 백업 간격 설정 (1시간)
const BACKUP_INTERVAL = 60 * 60 * 1000;
setInterval(async () => {
try {
await backupVault();
console.log('백업 완료:', new Date());
} catch (error) {
console.error('백업 실패:', error);
}
}, BACKUP_INTERVAL);
}
async function backupVault() {
// 백업 로직 구현
}
변경사항 감지
// 파일 변경 감지
const fileWatcher = {
init() {
this.watchVault();
},
watchVault() {
app.vault.on('modify', (file) => {
console.log('파일 수정됨:', file.path);
this.handleFileChange(file);
});
app.vault.on('create', (file) => {
console.log('파일 생성됨:', file.path);
this.handleNewFile(file);
});
},
async handleFileChange(file) {
// 변경사항 처리 로직
}
};
7. 작업 흐름 자동화
프로젝트 관리 자동화
// 프로젝트 상태 업데이트
async function updateProjectStatus() {
const projects = await getProjects();
for (const project of projects) {
const tasks = await getProjectTasks(project.id);
const completedTasks = tasks.filter(task => task.completed);
const progress = (completedTasks.length / tasks.length) * 100;
await updateProjectProgress(project.id, progress);
}
}
태스크 관리 자동화
// 태스크 자동화
const taskAutomation = {
async checkDueDates() {
const tasks = await this.getAllTasks();
const today = moment();
for (const task of tasks) {
if (moment(task.dueDate).isSame(today, 'day')) {
await this.sendNotification(task);
}
}
},
async sendNotification(task) {
// 알림 전송 로직
}
};
8. 문제 해결과 디버깅
로깅 시스템
// 로깅 유틸리티
const logger = {
log(message, level = 'info') {
const timestamp = new Date().toISOString();
console.log(`[${timestamp}] [${level}] ${message}`);
},
error(message, error) {
this.log(`${message}: ${error.message}`, 'error');
console.error(error);
}
};
오류 처리
// 오류 처리 래퍼
function errorHandler(fn) {
return async function(...args) {
try {
return await fn.apply(this, args);
} catch (error) {
logger.error('작업 실패', error);
throw error;
}
};
}
마무리
옵시디언 API와 자동화는 단순한 기능 확장을 넘어서 완전히 새로운 워크플로우를 만들어낼 수 있는 강력한 도구입니다. 이 가이드에서 소개한 다양한 자동화 방법과 API 활용 예시들을 기반으로 자신만의 효율적인 시스템을 구축해보세요.
특히 반복적인 작업의 자동화, 데이터 처리의 효율화, 그리고 외부 서비스와의 연동은 생산성을 크게 향상시킬 수 있는 핵심 요소입니다. 각 기능들을 적절히 조합하고 자신의 워크플로우에 맞게 최적화하면서, 더욱 효율적인 노트 관리 시스템을 만들어보세요.
이제 여러분도 옵시디언의 API와 자동화 기능을 활용할 준비가 되셨나요? 이 가이드를 기반으로 하나씩 시도해보면서, 자신만의 자동화된 워크플로우를 구축해보세요.
반응형