노션과 Slack API 연동하기|데이터 변경 알림 자동화 구축 방법
노션에서 업무를 관리하다 보면 담당자가 계속 데이터베이스를 열어보지 않으면 변경 사항을 놓치는 경우가 있습니다.
예를 들어 콘텐츠 제작 업무를 관리하면서 상태가 검토 요청으로 바뀌었는데 담당자가 이를 늦게 확인하면 다음 작업도 자연스럽게 밀리게 됩니다.
이럴 때 사용할 수 있는 방법이 Notion과 Slack을 연결해 특정 조건이 발생했을 때 메시지를 보내는 자동화입니다.
이번 예제에서는 노션 업무 데이터베이스에서 검토 요청 상태인 페이지를 확인한 뒤 Slack 채널에 알림을 보내는 기본 구조를 만들어보겠습니다.
먼저 자동화 구조부터 정합니다
이번에 만들 구조는 다음과 같습니다.
Notion 데이터 → Python에서 조건 확인 → Slack API → 채널 메시지
예를 들어 노션에 다음 데이터가 있다고 가정하겠습니다.
| 업무명 | 담당자 | 상태 |
|---|---|---|
| 상품 상세페이지 수정 | 김담당 | 진행중 |
| 블로그 원고 검토 | 이담당 | 검토 요청 |
| 이미지 제작 | 박담당 | 대기 |
여기서 블로그 원고 검토처럼 상태가 검토 요청으로 되어 있는 업무를 찾아 Slack에 알림을 보내는 것이 목표입니다.
Slack에는 다음과 비슷한 메시지가 전달됩니다.
검토가 필요한 업무가 있습니다.
업무명: 블로그 원고 검토
담당자: 이담당
상태: 검토 요청
이 정도의 작은 자동화부터 정상적으로 작동시키는 것이 좋습니다.
1. Notion Integration 준비하기
먼저 Notion API를 사용하기 위한 Integration이 필요합니다.
Integration을 만든 다음 실제로 조회할 페이지 또는 데이터베이스에 해당 Integration이 접근할 수 있도록 연결해야 합니다.
여기서 API 토큰만 발급받고 끝내면 안 됩니다.
토큰이 정상이어도 대상 데이터에 Integration의 접근 권한이 없다면 API에서 원하는 정보를 가져오지 못할 수 있습니다.
또한 발급받은 토큰은 블로그 본문이나 공개된 GitHub 저장소에 올리지 않는 것이 중요합니다.
2. Slack App 준비하기
이번에는 Slack 쪽 설정이 필요합니다.
Slack에서 App을 생성한 뒤 메시지를 보낼 수 있는 권한을 설정하고 OAuth 과정을 거쳐 사용할 토큰을 준비합니다.
그리고 메시지를 보낼 채널에서도 해당 App이 정상적으로 사용할 수 있는 상태인지 확인합니다.
실제 운영에서는 토큰을 코드에 다음처럼 직접 작성하는 것은 피하는 것이 좋습니다.
SLACK_TOKEN = "xoxb-실제토큰"
대신 환경변수를 이용합니다.
import os
SLACK_TOKEN = os.getenv("SLACK_TOKEN")
NOTION_TOKEN = os.getenv("NOTION_TOKEN")
이렇게 해두면 코드를 다른 곳에 올리더라도 토큰이 그대로 노출되는 위험을 줄일 수 있습니다.
3. 필요한 Python 라이브러리 설치
간단한 예제에서는 requests만으로도 API 요청을 만들 수 있습니다.
pip install requests
그리고 기본 모듈을 불러옵니다.
import os
import requests
NOTION_TOKEN = os.getenv("NOTION_TOKEN")
SLACK_TOKEN = os.getenv("SLACK_TOKEN")
실제 토큰이 정상적으로 들어왔는지 테스트할 때도 토큰 전체를 print()로 출력하는 것은 피하는 편이 안전합니다.
4. 노션에서 검토 요청 업무 찾기
Notion API를 통해 데이터베이스 또는 데이터 소스의 페이지를 조회합니다.
API 구조와 버전은 변경될 수 있으므로 실제 적용할 때는 현재 사용 중인 Notion API 문서의 엔드포인트와 버전을 확인해야 합니다.
개념적인 흐름은 다음과 같습니다.
NOTION_DATA_SOURCE_ID = os.getenv("NOTION_DATA_SOURCE_ID")
notion_headers = {
"Authorization": f"Bearer {NOTION_TOKEN}",
"Content-Type": "application/json",
"Notion-Version": "현재 사용하는 API 버전"
}
url = (
f"https://api.notion.com/v1/"
f"data_sources/{NOTION_DATA_SOURCE_ID}/query"
)
response = requests.post(
url,
headers=notion_headers,
json={}
)
response.raise_for_status()
data = response.json()
이제 data["results"]에 조회된 페이지가 들어옵니다.
하지만 여기서 바로 Slack 메시지를 보내면 안 됩니다.
먼저 원하는 데이터가 제대로 조회됐는지 확인하는 것이 좋습니다.
5. ‘검토 요청’ 상태만 골라내기
페이지를 하나씩 확인하면서 상태가 검토 요청인 것만 찾습니다.
review_pages = []
for page in data["results"]:
status = page["properties"]["상태"]["status"]
if status and status["name"] == "검토 요청":
review_pages.append(page)
이 단계가 상당히 중요합니다.
조건이 잘못되어 있는데 바로 Slack 발송까지 연결하면 필요하지 않은 메시지가 계속 전달될 수 있기 때문입니다.
처음 테스트할 때는 다음처럼 대상 개수부터 확인해보는 편이 좋습니다.
print("알림 대상:", len(review_pages))
예제 데이터라면 결과는 다음과 같습니다.
알림 대상: 1
여기까지 정확하다면 Slack 발송을 연결합니다.
6. Slack으로 메시지 보내기
Slack Web API를 이용해 메시지를 보내는 함수는 다음과 같이 구성할 수 있습니다.
def send_slack_message(channel, message):
url = "https://slack.com/api/chat.postMessage"
headers = {
"Authorization": f"Bearer {SLACK_TOKEN}",
"Content-Type": "application/json"
}
payload = {
"channel": channel,
"text": message
}
response = requests.post(
url,
headers=headers,
json=payload
)
response.raise_for_status()
result = response.json()
if not result.get("ok"):
raise RuntimeError(
f"Slack API 오류: {result.get('error')}"
)
return result
여기서 한 가지 주의할 부분이 있습니다.
HTTP 요청 자체가 성공했다고 해서 Slack에서 메시지 처리까지 성공했다고 단정하면 안 됩니다.
Slack API 응답의 ok 값과 오류 내용을 함께 확인하는 것이 좋습니다.
7. 노션 데이터와 Slack 메시지 연결하기
이제 앞에서 찾은 업무 정보를 메시지로 만들면 됩니다.
예를 들어 업무 제목을 가져왔다고 가정하면 다음과 같이 구성할 수 있습니다.
for page in review_pages:
title_items = page["properties"]["업무명"]["title"]
if title_items:
task_name = title_items[0]["plain_text"]
else:
task_name = "제목 없음"
message = (
"검토가 필요한 업무가 있습니다.\n"
f"업무명: {task_name}\n"
"상태: 검토 요청"
)
send_slack_message(
"#업무알림",
message
)
정상적으로 실행되면 Slack 채널에서 검토할 업무를 바로 확인할 수 있습니다.
그런데 이대로 반복 실행하면 문제가 생깁니다
여기서 실제 자동화를 만들 때 중요한 문제가 하나 생깁니다.
스크립트를 5분마다 실행한다고 가정해보겠습니다.
블로그 원고 검토의 상태가 계속 검토 요청이라면 실행할 때마다 같은 메시지가 전송될 수 있습니다.
결국 Slack에는 같은 알림이 반복해서 쌓입니다.
그래서 실제 운영에서는 이미 알림을 보낸 페이지인지 확인하는 장치가 필요합니다.
예를 들어 노션에 다음 속성을 하나 추가할 수 있습니다.
Slack 알림 완료
처음에는 체크하지 않은 상태로 두고 메시지가 정상적으로 전송되면 체크하도록 만드는 방식입니다.
그러면 조건을 다음처럼 변경할 수 있습니다.
상태 = 검토 요청
ANDSlack 알림 완료 = false
메시지 발송에 성공한 뒤에는 해당 페이지의 Slack 알림 완료를 true로 변경합니다.
이렇게 해야 같은 페이지 때문에 메시지가 계속 발송되는 문제를 줄일 수 있습니다.
‘실시간’이라는 표현도 주의해야 합니다
이 부분은 기존 글을 수정하면서 꼭 확인할 필요가 있습니다.
Python 스크립트가 5분 또는 10분마다 노션을 조회해서 변경 사항을 찾는 구조라면 엄밀하게는 실시간 이벤트 처리라기보다 주기적 확인(Polling)에 가깝습니다.
예를 들어,
5분마다 실행 → Notion 조회 → 조건 확인 → Slack 발송
구조라면 변경 직후 즉시 메시지가 오는 것을 보장하지 않습니다.
따라서 글 제목에서 무조건 실시간 알림이라고 표현하기보다 실제 구현 방식에 맞춰 설명하는 것이 정확합니다.
이 글의 제목을 **「노션과 Slack API 연동하기|데이터 변경 알림 자동화 구축 방법」**으로 바꾼 이유도 여기에 있습니다.
Slack 메시지가 오지 않을 때 확인할 것
실제로 연결하다 보면 몇 가지 오류를 자주 만나게 됩니다.
먼저 Notion 데이터가 조회되지 않는다면 Integration 권한, 대상 ID, API 버전을 확인합니다.
Notion 데이터는 정상인데 Slack 메시지만 오지 않는다면 Slack 토큰, App 권한, 채널 접근 여부, API 응답의 error 값을 확인합니다.
또 상태 이름도 확인해야 합니다.
노션에는 검토 요청이라고 되어 있는데 코드에서 검토요청이라고 작성했다면 조건에 맞는 데이터가 하나도 발견되지 않을 수 있습니다.
이런 경우 API 오류가 발생하는 것이 아니라 단순히 대상이 0건으로 처리될 수도 있어 찾기가 더 어렵습니다.
그래서 단계별 로그를 남기는 것이 좋습니다.
print("Notion 조회 성공")
print("검토 요청:", len(review_pages))
print("Slack 발송 시작")
간단한 출력만 있어도 어느 단계에서 멈췄는지 찾기가 쉬워집니다.
실제 운영에서는 실패 기록도 남겨야 합니다
테스트에서는 메시지 하나만 정상적으로 도착하면 성공처럼 보입니다.
하지만 자동화를 계속 운영한다면 이야기가 달라집니다.
네트워크 오류나 API 제한 등으로 메시지 전송이 실패할 수도 있습니다.
그래서 다음처럼 구분해서 기록하는 편이 좋습니다.
조회 성공 → 대상 발견 → Slack 발송 성공 → Notion 알림완료 업데이트
중간에 실패했다면 Slack 알림 완료를 체크하지 않습니다.
그래야 다음 실행에서 다시 처리할 수 있기 때문입니다.
마무리
Notion과 Slack을 연결하는 자동화에서 중요한 것은 단순히 메시지 한 건을 보내는 코드가 아닙니다.
어떤 조건에서 알림을 보낼 것인지, 같은 메시지가 반복되지 않도록 어떻게 처리할 것인지, 실패했을 때 어떻게 다시 처리할 것인지까지 생각해야 실제 업무에서 사용할 수 있습니다.
처음에는 데이터 한 건으로 테스트하세요.
Notion 조회 → 검토 요청 확인 → Slack 메시지 한 건 전송
여기까지 정상적으로 작동한 다음 중복 방지와 자동 실행을 추가하는 것이 안전합니다.
작은 자동화라도 이런 구조로 만들어두면 콘텐츠 검토, 고객 문의, 주문 확인, 프로젝트 승인 요청 등 다양한 업무에 응용할 수 있습니다.




댓글 0
첫 댓글을 남겨보세요.