I. 소개
이 개발 보고서에서는 Notion API를 사용하여 운동 일정을 자동화하는 방법을 보여드리고자 합니다. Notion은 사용자가 데이터베이스, 노트, 작업 등을 만들고 정리할 수 있는 올인원 생산성 도구입니다. Notion API는 개발자에게 Notion의 기능에 대한 프로그래밍 방식의 액세스를 제공하여 다양한 작업을 자동화할 수 있도록 합니다.
제공된 코드 스니펫은 Notion API를 사용하여 미리 정의된 일정에 따라 데이터베이스에서 운동 이벤트를 생성하는 방법을 보여줍니다. 이 스크립트는 특정 날짜 범위 내의 기존 이벤트를 가져오고 예약된 이벤트가 없는 요일에 대해 새 이벤트를 생성합니다. 운동 일정은 각 요일을 운동 이름과 태그 목록에 매핑하는 days_of_week
사전에서 정의됩니다.
개발자는 Notion API로 워크아웃 예약 프로세스를 자동화함으로써 시간을 절약하고 수동 오류를 줄일 수 있습니다. 이 보고서는 Notion API를 설정하고 코드 스니펫의 다양한 구성 요소를 이해하는 데 도움이 되는 단계별 가이드를 제공합니다.
II. Notion API 설정
Notion API를 사용하려면 Notion 계정과 연동이 설정되어 있어야 합니다. 다음은 Notion API 인증에 대한 단계별 가이드입니다:
Notion에서 연동 만들기
- Notion에 로그인하고 화면 왼쪽 하단의 프로필 아이콘을 클릭한 다음 “연동"을 클릭하여 연동 페이지로 이동합니다.
- “새 연동 서비스 만들기” 버튼을 클릭합니다.
- 연동 서비스의 이름을 지정하고 사용할 워크스페이스를 선택합니다.
- ‘제출’ 버튼을 클릭하여 연동 서비스를 만듭니다.
연동 토큰 받기
- 연동이 생성되면 연동 이름을 클릭하여 연동 토큰을 받을 수 있습니다.
- 연동 토큰을 복사하여 코드에 사용하세요.
Notion API 패키지를 설치합니다.
터미널 또는 명령 프롬프트를 엽니다.
다음 명령을 실행하여 Notion API 패키지를 설치합니다:
pip install notion-client
Notion API 클라이언트 설정
상단에 다음 줄을 추가하여 코드에서 Notion API 클라이언트를 가져옵니다:
from notion_client import Client
다음 줄을 추가하고
<API Key>
를 연동 토큰으로 대체하여 클라이언트를 인증합니다:notion = Client(auth="<API Key>")
데이터베이스 세부 정보 설정
- 이벤트를 추가할 데이터베이스의 데이터베이스 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_ago
및 end_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_date
와 end_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