I. 소개

이 개발 보고서에서는 Notion API를 사용하여 운동 일정을 자동화하는 방법을 보여드리고자 합니다. Notion은 사용자가 데이터베이스, 노트, 작업 등을 만들고 정리할 수 있는 올인원 생산성 도구입니다. Notion API는 개발자에게 Notion의 기능에 대한 프로그래밍 방식의 액세스를 제공하여 다양한 작업을 자동화할 수 있도록 합니다.

제공된 코드 스니펫은 Notion API를 사용하여 미리 정의된 일정에 따라 데이터베이스에서 운동 이벤트를 생성하는 방법을 보여줍니다. 이 스크립트는 특정 날짜 범위 내의 기존 이벤트를 가져오고 예약된 이벤트가 없는 요일에 대해 새 이벤트를 생성합니다. 운동 일정은 각 요일을 운동 이름과 태그 목록에 매핑하는 days_of_week 사전에서 정의됩니다.

개발자는 Notion API로 워크아웃 예약 프로세스를 자동화함으로써 시간을 절약하고 수동 오류를 줄일 수 있습니다. 이 보고서는 Notion API를 설정하고 코드 스니펫의 다양한 구성 요소를 이해하는 데 도움이 되는 단계별 가이드를 제공합니다.

II. Notion API 설정

Notion API를 사용하려면 Notion 계정과 연동이 설정되어 있어야 합니다. 다음은 Notion API 인증에 대한 단계별 가이드입니다:

  1. Notion에서 연동 만들기

    • Notion에 로그인하고 화면 왼쪽 하단의 프로필 아이콘을 클릭한 다음 “연동"을 클릭하여 연동 페이지로 이동합니다.
    • “새 연동 서비스 만들기” 버튼을 클릭합니다.
    • 연동 서비스의 이름을 지정하고 사용할 워크스페이스를 선택합니다.
    • ‘제출’ 버튼을 클릭하여 연동 서비스를 만듭니다.
  2. 연동 토큰 받기

    • 연동이 생성되면 연동 이름을 클릭하여 연동 토큰을 받을 수 있습니다.
    • 연동 토큰을 복사하여 코드에 사용하세요.
  3. Notion API 패키지를 설치합니다.

    • 터미널 또는 명령 프롬프트를 엽니다.

    • 다음 명령을 실행하여 Notion API 패키지를 설치합니다:

      pip install notion-client
      
  4. Notion API 클라이언트 설정

    • 상단에 다음 줄을 추가하여 코드에서 Notion API 클라이언트를 가져옵니다:

      from notion_client import Client
      
    • 다음 줄을 추가하고 <API Key> 를 연동 토큰으로 대체하여 클라이언트를 인증합니다:

      notion = Client(auth="<API Key>")
      
  5. 데이터베이스 세부 정보 설정

    • 이벤트를 추가할 데이터베이스의 데이터베이스 ID를 가져옵니다.
    • 코드 스니펫의 database_id 변수를 데이터베이스 ID로 바꿉니다.

제공된 코드 스니펫은 notion_client.Client 객체를 사용하여 Notion API와 상호 작용합니다. Client 객체는 API 클라이언트를 인증하는 데 사용되며 데이터베이스 및 페이지와 같은 다양한 Notion 리소스에 대한 액세스를 제공합니다.

database_id 변수는 운동 이벤트가 추가될 Notion 데이터베이스의 ID로 설정됩니다. ID는 데이터베이스의 URL에서 찾을 수 있습니다.

III. 운동 일정 정의하기

운동 일정은 코드 스니펫에서 다음 변수를 사용하여 정의됩니다:

  • start_days_ago: 일정을 시작할 오늘 날짜 이전 일수입니다.
  • end_days_after: 오늘 날짜 이후 일정을 종료할 일수입니다.
  • days_of_week: 각 요일을 운동 이름과 태그 목록에 매핑하는 사전입니다.

days_of_week 사전은 각 요일의 운동 계획을 정의하는 데 사용됩니다. 각 요일은 사전의 키이며, 해당 값은 운동 이름과 운동과 관련된 태그 목록이 포함된 또 다른 사전입니다. 예를 들어

days_of_week = {
    "Monday": {"name": "DAY 1", "tag": ["chest", "triceps"]},
    "Tuesday": {"name": "DAY 2", "tag": ["back", "biceps"]},
    "Wednesday": {"name": "DAY 3", "tag": ["lower body", "shoulder"]},
    "Thursday": {"name": "DAY 1", "tag": ["chest", "triceps"]},
    "Friday": {"name": "DAY 2", "tag": ["back", "biceps"]},
    "Saturday": {"name": "DAY 3", "tag": ["lower body", "shoulder"]},
}

이 예에서는 일정이 3일로 나뉘어 있고, 각 날마다 특정 운동과 태그가 연결되어 있습니다.

start_days_agoend_days_after 변수는 운동 스케줄의 날짜 범위를 정의하는 데 사용됩니다. start_days_ago 는 오늘 날짜 며칠 전부터 스케줄을 시작하고, end_days_after 는 오늘 날짜 며칠 후부터 스케줄을 종료할지 지정합니다.

코드 스니펫은 datetime 모듈을 사용하여 오늘 날짜를 구하고 운동 일정의 시작 날짜와 종료 날짜를 계산합니다. 시작 날짜는 오늘 날짜에서 start_days_ago 를 빼서 구하고 종료 날짜는 오늘 날짜에 end_days_after 를 더하여 구합니다. 날짜의 형식은 %Y-%m-%d 형식의 문자열로 지정됩니다.

IV. 기존 이벤트 쿼리

새 운동 이벤트를 생성하기 전에 코드 스니펫은 정의된 날짜 범위 내의 기존 이벤트를 가져옵니다. 이는 동일한 날짜에 중복 이벤트를 생성하지 않기 위해 수행됩니다.

notion.databases.query() 메서드는 Notion 데이터베이스를 쿼리하고 기존 이벤트를 검색하는 데 사용됩니다. filter 매개변수는 쿼리에 대한 필터 조건을 지정하는 데 사용됩니다. 이 경우 필터는 코드 스니펫에 정의된 시작 날짜와 종료 날짜에 해당하는 이벤트를 검색하도록 설정됩니다. 다음은 쿼리에 사용된 필터의 예입니다:

{
    "and": [
        {"property": "Date", "date": {"on_or_after": start_date}},
        {"property": "Date", "date": {"on_or_before": end_date}}
    ]
}

이 필터는 start_dateend_date 사이에 해당하는 Date 속성을 가진 이벤트를 반환합니다.

쿼리 응답의 results 속성은 해당 날짜 범위 내의 기존 이벤트를 가져오는 데 사용됩니다. 결과는 코드 스니펫에서 나중에 사용할 수 있도록 existing_events 변수에 저장됩니다.

existing_events = notion.databases.query(
    **{
        "database_id": database_id,
        "filter": {
            "and": [
                {"property": "Date", "date": {"on_or_after": start_date}},
                {"property": "Date", "date": {"on_or_before": end_date}}
            ]
        },
    }
).get("results")

V. 새 이벤트 만들기

날짜 범위 내의 기존 이벤트가 확보되면 코드 스니펫은 일정 날짜 범위 내의 각 날짜에 대해 새 운동 이벤트를 생성합니다.

코드 스니펫은 for 루프를 사용하여 날짜 범위의 각 날짜를 반복합니다. 일요일이 아닌 각 날짜에 대해 새 이벤트가 생성됩니다:

for date in (datetime.now() + timedelta(days=n) for n in range(-start_days_ago, end_days_after + 1)):
    # skip Sundays
    if date.strftime("%A") == "Sunday":
        continue

날짜에서 요일 이름을 가져오는 데 strftime() 메서드가 사용되며, 요일 이름이 “일요일"인 경우 루프는 해당 요일을 건너뛰고 다음 날로 이동합니다.

그런 다음 코드 스니펫은 현재 날짜에 이벤트가 이미 존재하는지 확인합니다:

if any(event.get("properties").get("Date").get("date").get("start") == date.strftime("%Y-%m-%d") for event in existing_events):
    print(f"Event already exists for {date.strftime('%Y-%m-%d')}. Skipping.")
    continue

현재 날짜에 이미 이벤트가 있는 경우 루프는 해당 날짜를 건너뛰고 다음 날로 이동합니다.

현재 날짜에 이벤트가 없는 경우 해당 요일과 연결된 운동 이름과 태그를 사용하여 새 이벤트가 생성됩니다:

day_of_week = date.strftime("%A")
event_name = days_of_week[day_of_week]["name"]
event_tag = days_of_week[day_of_week]["tag"]
new_event = {
    "Name": {"title": [{"text": {"content": event_name}}]},
    "Date": {"date": {"start": date.strftime("%Y-%m-%d")}},
    "Tag": {"multi_select": [{"name": tag} for tag in event_tag]},
}
notion.pages.create(parent={"database_id": database_id}, properties=new_event)

해당 요일과 관련된 운동 이름과 태그는 days_of_week 사전에서 가져옵니다. new_event 사전은 이벤트 이름, 날짜 및 태그를 포함하는 새 이벤트의 속성을 정의하는 데 사용됩니다. notion.pages.create() 메서드는 Notion 데이터베이스에 새 이벤트를 생성하는 데 사용됩니다.

개발자는 스케줄 날짜 범위 내에서 요일별로 새 이벤트를 생성함으로써 운동 스케줄링 프로세스를 자동화하고 운동 계획이 최신의 정확한 상태로 유지되도록 할 수 있습니다.

VI. 결론

이 프로젝트에서는 Notion API를 사용하여 Notion 데이터베이스에서 운동 일정을 생성하는 프로세스를 자동화하는 방법을 보여드렸습니다. 제공한 코드 스니펫을 사용하여 특정 날짜 범위에 대한 운동 일정을 생성하고 정의된 운동 계획에 따라 데이터베이스에 새 이벤트를 자동으로 추가할 수 있습니다.

Notion API는 할 일 목록 관리, 비용 추적 또는 프로젝트 작업 구성과 같은 다양한 작업을 자동화하는 데 사용할 수 있습니다. 개발자는 Notion API를 통해 사용자 지정 통합을 구축하고 반복적인 작업을 자동화하여 시간을 절약하고 생산성을 높일 수 있습니다.

전반적으로 Notion API는 개발자가 Notion을 워크플로에 통합하고 작업을 자동화할 수 있는 강력한 도구를 제공합니다. Notion의 인기가 계속 높아짐에 따라 더 많은 개발자가 Notion API로 통합을 구축하고 작업을 자동화할 것으로 예상됩니다.

향후에는 더 많은 기능을 추가하고 다른 도구와의 통합을 통해 이 프로젝트를 확장할 계획입니다. 또한 Notion API의 다른 사용 사례를 살펴보고 워크플로우의 다른 작업을 자동화하는 데 어떻게 사용할 수 있는지 살펴볼 계획입니다.


Source code : https://github.com/hobbyworker/notion-workout-scheduler