최근 몇 달 동안 저는 Notion을 개인적인 지식 관리 시스템으로 사용해 왔습니다. Notion의 유연성과 사용자 정의 기능은 정말 훌륭하지만, 데이터를 분석하고 시각화하는 데는 몇 가지 제한 사항이 있다는 것을 알게 되었습니다. 그래서 데이터를 좀 더 강력한 분석 도구인 MCP(My Custom Platform)로 옮겨 보기로 했습니다. 이 글에서는 Notion 데이터를 MCP로 가져오는 과정과 그 과정에서 겪었던 경험, 그리고 앞으로 개선할 점에 대해 이야기해 보려고 합니다.
처음에는 ‘간단하겠지?’라고 생각했습니다. Notion API를 사용해서 데이터를 추출하고, MCP에 맞는 형식으로 변환해서 넣으면 끝이라고 생각했죠. 하지만 막상 시작해 보니 생각보다 복잡한 문제들이 많았습니다. 데이터 구조가 예상과 달랐고, API 사용량 제한도 있었고, 무엇보다 데이터를 변환하는 과정이 꽤나 까다로웠습니다. 그래도 포기하지 않고 하나씩 해결해 나가면서 결국에는 원하는 결과를 얻을 수 있었습니다. 이 과정에서 얻은 경험과 지식을 다른 분들과 공유하고 싶어서 이렇게 글을 쓰게 되었습니다.
이 글을 통해 Notion 데이터를 MCP와 같은 다른 플랫폼으로 옮기려는 분들에게 조금이나마 도움이 되었으면 좋겠습니다. 특히 저처럼 개발 경험이 많지 않은 분들도 쉽게 따라 할 수 있도록 최대한 자세하게 설명하려고 노력했습니다. 물론 완벽한 방법은 아닐 수도 있지만, 시행착오를 줄이고 시간을 절약하는 데 도움이 될 것이라고 생각합니다. 그럼 지금부터 저의 여정을 함께 따라가 보시죠!
데이터 추출 방법
가장 먼저 해야 할 일은 Notion에서 데이터를 추출하는 것입니다. Notion API를 사용하면 데이터베이스, 페이지, 블록 등 다양한 유형의 데이터를 가져올 수 있습니다. API를 사용하기 위해서는 먼저 Notion에 통합 앱을 등록하고 API 키를 발급받아야 합니다. 이 과정은 Notion 개발자 문서를 참고하면 쉽게 진행할 수 있습니다.
저는 Python을 사용하여 API를 호출하고 데이터를 가져왔습니다. `requests` 라이브러리를 사용하여 API 요청을 보내고, JSON 형식으로 응답을 받았습니다. Notion 데이터베이스의 모든 페이지를 가져오기 위해 `databases.query` 엔드포인트를 사용했습니다. 이때 API 사용량 제한을 고려하여 페이지네이션을 구현하는 것이 중요합니다. 한 번에 가져올 수 있는 페이지 수가 제한되어 있기 때문에, `has_more` 플래그와 `next_cursor` 값을 사용하여 다음 페이지를 계속 요청해야 합니다.
데이터를 추출할 때 주의해야 할 점은 Notion의 데이터 구조가 예상과 다를 수 있다는 것입니다. 특히 블록의 내용은 복잡한 JSON 구조로 표현되기 때문에, 필요한 정보만 추출하기 위해서는 꼼꼼한 분석이 필요합니다. 저는 각 블록의 `type` 속성을 확인하여 텍스트, 이미지, 코드 등 다양한 유형의 콘텐츠를 처리했습니다.
데이터 변환 과정
Notion에서 추출한 데이터는 MCP에 바로 사용할 수 있는 형식이 아니기 때문에 변환 과정이 필요합니다. MCP는 자체적인 데이터 모델을 가지고 있기 때문에, Notion 데이터를 이 모델에 맞게 매핑해야 합니다. 저는 이 과정을 위해 별도의 Python 스크립트를 작성했습니다.
데이터 변환 과정에서 가장 어려웠던 점은 Notion의 블록 내용을 MCP의 필드에 어떻게 매핑할 것인가였습니다. 예를 들어, Notion의 텍스트 블록은 MCP의 텍스트 필드에 쉽게 매핑할 수 있지만, Notion의 데이터베이스 링크나 콜아웃 블록은 MCP에서 어떻게 표현해야 할지 고민이 필요했습니다. 저는 각 블록 유형에 따라 적절한 변환 로직을 구현하여 이 문제를 해결했습니다.
데이터 변환 과정에서 또 다른 중요한 고려 사항은 데이터 무결성입니다. Notion 데이터가 MCP로 정확하게 옮겨졌는지 확인하기 위해, 변환된 데이터를 검증하는 단계를 추가했습니다. 예를 들어, Notion의 날짜 속성이 MCP의 날짜 필드에 올바르게 변환되었는지, Notion의 관계형 데이터베이스 링크가 MCP에서 제대로 연결되었는지 등을 확인했습니다.
MCP 데이터 저장
데이터 변환이 완료되면 MCP에 데이터를 저장해야 합니다. MCP는 다양한 데이터 저장 방식을 지원하기 때문에, 프로젝트의 요구 사항에 맞는 방법을 선택할 수 있습니다. 저는 MCP의 API를 사용하여 데이터를 저장했습니다. API를 호출하기 전에, MCP에서 사용할 API 키를 발급받고, API 엔드포인트를 확인해야 합니다.
데이터를 저장할 때 주의해야 할 점은 API 사용량 제한입니다. MCP API도 사용량 제한이 있을 수 있기 때문에, 한 번에 너무 많은 데이터를 보내지 않도록 주의해야 합니다. 저는 데이터를 작은 배치로 나누어 API를 호출하고, 각 배치 사이에 약간의 지연 시간을 두어 API 사용량 제한을 초과하지 않도록 했습니다.
데이터 저장 과정에서 발생할 수 있는 오류를 처리하는 것도 중요합니다. API 호출이 실패할 경우, 오류 메시지를 기록하고, 재시도 로직을 구현하여 데이터 손실을 최소화해야 합니다. 저는 `try-except` 블록을 사용하여 API 호출 중 발생할 수 있는 예외를 처리하고, 오류 메시지를 로깅했습니다.
자동화 및 스케줄링
Notion 데이터를 MCP로 가져오는 과정을 수동으로 반복하는 것은 매우 번거롭습니다. 따라서 이 과정을 자동화하고 스케줄링하는 것이 좋습니다. 저는 Airflow를 사용하여 데이터 추출, 변환, 저장 과정을 자동화했습니다. Airflow는 파이썬 기반의 워크플로우 관리 플랫폼으로, 복잡한 데이터 파이프라인을 쉽게 구축하고 관리할 수 있도록 도와줍니다.
Airflow DAG(Directed Acyclic Graph)를 정의하여 각 단계를 연결하고, 실행 순서를 지정했습니다. 각 단계는 Airflow Operator로 구현되며, PythonOperator를 사용하여 데이터 추출, 변환, 저장 스크립트를 실행했습니다. Airflow 스케줄러를 사용하여 DAG를 주기적으로 실행하도록 설정했습니다. 예를 들어, 매일 새벽 3시에 Notion 데이터를 MCP로 가져오도록 스케줄링할 수 있습니다.
자동화된 데이터 파이프라인을 구축하면 데이터 최신성을 유지하고, 수동 작업으로 인한 오류를 줄일 수 있습니다. 또한 Airflow의 모니터링 기능을 사용하여 데이터 파이프라인의 상태를 실시간으로 확인할 수 있습니다. 오류가 발생하면 즉시 알림을 받을 수 있도록 설정하여 신속하게 대응할 수 있습니다.
향후 개선 방향
Notion 데이터를 MCP로 가져오는 과정은 아직 완벽하지 않습니다. 앞으로 몇 가지 개선해야 할 부분이 있습니다. 먼저, 데이터 변환 로직을 좀 더 일반화하여 다양한 유형의 Notion 데이터를 처리할 수 있도록 해야 합니다. 현재는 특정 유형의 블록만 처리할 수 있기 때문에, 새로운 유형의 블록이 추가되면 변환 로직을 수정해야 합니다.
또한, 데이터 품질을 향상시키기 위해 데이터 검증 단계를 강화해야 합니다. 현재는 기본적인 데이터 검증만 수행하고 있지만, 좀 더 정교한 검증 규칙을 추가하여 데이터 오류를 사전에 방지해야 합니다. 예를 들어, 특정 필드의 값이 유효한 범위 내에 있는지, 필수 필드가 누락되지 않았는지 등을 검사할 수 있습니다.
마지막으로, 데이터 파이프라인의 성능을 최적화해야 합니다. 현재는 데이터 양이 많지 않기 때문에 큰 문제가 없지만, 데이터 양이 증가하면 파이프라인 실행 시간이 길어질 수 있습니다. 데이터 추출, 변환, 저장 단계를 병렬로 처리하거나, 캐싱 기술을 사용하여 성능을 향상시킬 수 있습니다.