디지털 생산성/옵시디언

옵시디언 API와 자동화

지식의 아웃소싱 2025. 2. 9. 13:36
반응형

옵시디언 API와 자동화 완벽 가이드: 워크플로우 최적화

옵시디언의 강력한 기능 중 하나는 바로 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와 자동화 기능을 활용할 준비가 되셨나요? 이 가이드를 기반으로 하나씩 시도해보면서, 자신만의 자동화된 워크플로우를 구축해보세요.

반응형