Notion API와 Python 연동: 부서 간 업무 일지 자동 동기화 아키텍처

Notion API와 Python 연동: 부서 간 업무 일지 자동 동기화 아키텍처

"개발팀은 지라(Jira)를 쓰고, 마케팅팀은 구글 시트를 쓰고, 영업팀은 슬랙으로 보고합니다. 매주 금요일마다 이 파편화된 업무 일지를 노션(Notion) 마스터 페이지에 복사해서 붙여넣는 데만 3시간이 걸립니다."

전사적인 협업 툴로 노션을 도입한 수많은 기업이 겪는 '데이터 사일로(Data Silo)' 현상입니다. 이를 해결하기 위해 Zapier나 Make.com 같은 노코드(No-code) 툴을 도입해 보지만, 노션의 복잡한 관계형 데이터베이스(Relation)나 롤업(Rollup) 속성을 동기화하려고 하면 노코드 툴 특유의 한계에 부딪혀 에러를 뿜어내기 일쑤입니다.

진정한 자동화 아키텍트는 기성품의 한계에 타협하지 않습니다. 본 가이드에서는 노코드 툴의 비싼 요금제와 기능적 제약을 벗어던지고, Notion 공식 REST API와 Python(파이썬)을 활용해 100% 커스텀 가능한 업무 일지 자동 동기화 서버리스 스크립트를 구축하는 방법을 단호하게 제시합니다.

📌 이 글의 핵심 포인트

  • 노코드(No-code) 툴의 한계를 돌파하는 프라이빗 API(Internal Integration) 발급 및 연결
  • Python requests 라이브러리를 활용한 Notion Database CRUD(생성, 읽기, 수정, 삭제) 제어
  • 실무 트러블슈팅: API 호출 제한(Rate Limit 429) 및 페이지네이션(Pagination) 완벽 처리

1단계: 아키텍처 설계 - 프라이빗 API 통합 토큰 발급

파이썬 스크립트가 우리 회사의 노션 워크스페이스에 접근하려면 안전한 '출입증'이 필요합니다.

  1. developers.notion.com에 접속하여 '내 통합(My Integrations)' 메뉴로 이동합니다.
  2. '새 통합 만들기'를 클릭하고 워크스페이스를 선택한 뒤, 프라이빗 내부 통합 토큰(Internal Integration Token, secret_...)을 발급받습니다.
  3. 데이터를 읽고 쓸 대상 노션 데이터베이스 페이지로 이동하여, 우측 상단의 [...] 메뉴 → [연결] → 방금 만든 통합(Integration) 이름을 검색하여 권한을 부여합니다.

2단계: 완벽한 해결책 - Python 연동 스크립트 구축

이제 파이썬의 requests 라이브러리를 사용하여 노션 API와 직접 통신하는 백엔드 스크립트를 작성합니다. 아래 코드는 특정 데이터베이스에 쌓인 다른 부서의 업무 일지를 긁어오는(Query) 핵심 파이프라인입니다.


import requests
import json

NOTION_TOKEN = "secret_여기에_발급받은_토큰_입력"
DATABASE_ID = "여기에_데이터베이스_ID_입력" # URL의 ?v= 앞부분 32자리 문자열

headers = {
    "Authorization": f"Bearer {NOTION_TOKEN}",
    "Content-Type": "application/json",
    "Notion-Version": "2022-06-28"
}

def get_notion_database():
    url = f"https://api.notion.com/v1/databases/{DATABASE_ID}/query"
    
    # 예시: '진행 상태'가 '완료'인 업무만 필터링하여 가져오기
    payload = {
        "filter": {
            "property": "진행 상태",
            "status": {
                "equals": "완료"
            }
        }
    }
    
    response = requests.post(url, headers=headers, json=payload)
    
    if response.status_code == 200:
        return response.json()['results']
    else:
        print(f"🚨 에러 발생: {response.status_code} - {response.text}")
        return None

# 실행 결과 테스트
data = get_notion_database()
print(f"가져온 업무 일지 개수: {len(data)}")

이 스크립트를 AWS Lambda나 Google Cloud Functions에 올려두고 매일 밤 12시에 실행되도록 크론(Cron) 스케줄러를 걸어두면, 인간의 개입 없이 부서 간의 데이터가 자동으로 취합됩니다.

3단계: 실무 트러블슈팅 - Rate Limit 429 및 Pagination 에러 방어

파이썬을 통해 API를 직접 다룰 때 초보자가 가장 많이 겪는 참사는 HTTP 429 Too Many Requests 에러입니다. 노션 API는 1초에 3회 이상의 요청을 보내면 서버 보호를 위해 통신을 강제로 차단합니다. time.sleep(0.4)를 활용하여 요청 사이에 반드시 딜레이를 주어야 합니다.

또한, 데이터가 100개를 초과할 경우 API는 한 번에 모든 데이터를 주지 않습니다. 반드시 응답 데이터(JSON) 안의 has_more 값이 True인지 확인하고, next_cursor 값을 다음 요청의 페이로드에 담아 보내는 페이지네이션(Pagination) 루프 처리를 구현해야 데이터 누락이라는 치명적인 사고를 막을 수 있습니다.

💡 아키텍트의 시선 (Insight)

노코드 툴은 빠르고 편리하지만, 비즈니스의 데이터 구조가 복잡해지는 순간 그 자체가 거대한 기술 부채(Technical Debt)로 돌변합니다. 공식 API의 명세서(Docs)를 직접 읽고 코드로 통신하는 방법을 익히는 것은, 단순히 툴의 사용법을 넘어서 시스템 간의 대화를 조율하는 진정한 '디지털 아키텍트'로 성장하는 필수 관문입니다. 제한된 템플릿에서 벗어나 API의 무한한 자유도를 통해 당신만의 엔터프라이즈 자동화 파이프라인을 구축하십시오.

댓글

이 블로그의 인기 게시물

Zapier & Make.com 자동화의 덫: 무한 루프(Infinite Loop) 에러 완벽 방어 아키텍처

엑셀 보고서의 종말: 구글 스프레드시트와 루커 스튜디오(Looker Studio)로 실시간 대시보드 구축하기

Docker OOMKilled (Exit Code 137) 에러의 진실: 컨테이너 메모 누수 방어 및 리소스 최적화 아키텍처