본문 바로가기

프로젝트/개인 프로젝트

노션 데이터베이스 슬랙으로 알림 받기 (1/2) - @notionhq/client로 데이터베이스 쿼리하기

DALLE를 통해 생성된 이미지입니다

 

요즘 사내에서 TIL을 하는 모임을 운영하고 있습니다

 

그래서 매일 공부한 내용들을 노션의 각자 페이지를 생성해서 관리하고 있습니다

최대한 개인의 자율에 맡기려고 하는데 그래도 서로에게 동기부여가 되기 위해서는 매일 누가 완료했는지를 공유하는 것도 하나의 방법이 될 수 있지 않을까 싶었습니다

 

그런데 다른 분들이 어떻게 하시는지 보려면 노션 페이지에 직접 들어가야 하다 보니 직접 노션을 연동하여 매일 어떤 분들이 어떤 내용을 입력했는지 확인하고 슬랙으로 알림을 받는 서버를 만들어 보려고 합니다

 

1. 노션에서 secret_token 발급받기

먼저 노션의 데이터 베이스에 접근할 수 있는 봇과 봇이 접근할 수 있는 토큰을 생성해야 합니다

노션의 Settings&Members에서 Integrations 탭에 접근하면 Develop your own integrations를 클릭합니다

 

 

여기서 Create new integration을 클릭한 후,

 

원하는 workspace에서 봇 이름과 봇 이미지 이름을 입력해줍니다

봇 이름이나 봇 이미지는 지금 입력하더라도 나중에 언제든 변경이 가능합니다

 

 

제출하게되면 token을 얻을 수 있습니다

가려진 token을 show 한 후 copy 해줍니다

이때 integration type을 지정할 수 있는데, 내부적으로 쓰는 것이기 때문에 internal로 설정합니다

 

2. 노션 데이터베이스에 권한 부여하기

이제 생성된 봇을 원하는 데이터베이스에 권한을 주어야 하는데요

 

 

위의 구조처럼 TIL이라는 컬럼과 생성일이라는 컬럼을 가진 데이터베이스가 있다고 가정해보겠습니다

이 데이터베이스 혹은 노션 페이지에서 invite 버튼을 클릭해서

 

 

방금 생성한 봇에게 수정 권한을 부여해주면 됩니다

 

 

4. 노션 데이터베이스 ID 가져오기

권한을 부여한 데이터베이스의 copy link를 클릭하면 주소를 볼 수 있는데요

주소에서 아래의 위치에 해당하는 문자열이 Database ID 입니다

https://www.notion.so/myworkspace/a8aec43384f447ed84390e8e42c2e089?v=...
                                  |--------- Database ID --------|

 

 

5. 노션 API 호출 서버 만들기

이제 데이터베이스를 쿼리해야 합니다

저는 최대한 간단히 개발하고 싶었기 때문에 이미 잘 만들어진 노션 모듈인 @notionhq/client를 사용하기로 했습니다

 

 

그러면 가장 먼저 원하는 디렉토리로 이동해서 프로젝트를 생성해줍니다

mkdir notion-example && cd notion-example
npm init
npm install

 

그 다음으로는 express와 @notionhq/client를 설치합니다

npm install express @notionhq/client

 

다 되었다면 아래의 코드를 index.js에 입력합니다

const express = require('express')
const app = express()
const { Client } = require("@notionhq/client")

const NOTION_SECRET_KEY = process.env.NOTION_SECRET_KEY
const NOTION_DATABASE_ID = process.env.NOTION_EXAMPLE_DATABASE_ID


const notion = new Client({
  auth: NOTION_SECRET_KEY
})

Date.prototype.toYYYYMMDD = function () {
  const date = new Date(this.valueOf())
  let YYYY = date.getFullYear()
  let MM = date.getMonth() + 1
  let DD = date.getDate()
  let _MM = MM >= 10 ? `${MM}` : `0${MM}`
  let _DD = DD >= 10 ? `${DD}` : `0${DD}`
  return `${YYYY}-${_MM}-${_DD}`
}

app.get('/til', async (req, res, next) => {
  const today = new Date().toYYYYMMDD()
  const response = await notion.databases.query({
    database_id: NOTION_DATABASE_ID,
    filter: {
      property: "생성일",
      created_time: {
        on_or_after: today,
      },
    },
  })
  return res.status(200).json({data: response})
})

app.listen(3000, () => {
  console.log('listening 3000...')
})

봇의 secret_key와 database_id 값은 환경변수로 처리해주었습니다

그리고 서버를 실행한 후 호출해보면 

 

{
    "data": {
        "object": "list",
        "results": [
            {
                "object": "page",
                "id": "5f0f.............",
                "created_time": "2021-09-12T12:09:00.000Z",
                "last_edited_time": "2021-09-12T13:17:00.000Z",
                "cover": null,
                "icon": null,
                "parent": {
                    "type": "database_id",
                    "database_id": "1bda............."
                },
                "archived": false,
                "properties": {
                    "생성일": {
                        "id": "Ce%3BE",
                        "type": "created_time",
                        "created_time": "2021-09-12T12:09:00.000Z"
                    },
                    "TIL": {
                        "id": "title",
                        "type": "title",
                        "title": [
                            {
                                "type": "text",
                                "text": {
                                    "content": "study",
                                    "link": null
                                },
                                "annotations": {
                                    "bold": false,
                                    "italic": false,
                                    "strikethrough": false,
                                    "underline": false,
                                    "code": false,
                                    "color": "default"
                                },
                                "plain_text": "study",
                                "href": null
                            }
                        ]
                    }
                },
                "url": "https://www.notion.so/study-5f0f............."
            }
        ],
        "next_cursor": null,
        "has_more": false
    }
}

위와 같은 결과를 얻을 수 있습니다

정상적으로 쿼리가 잘 오는 것 같아요

 

그런데 노션의 공식 문서를 참조해보면 날짜를 쿼리하는 경우에는 timezone이 UTC로 설정되어있다는 것을 알 수 있습니다

따라서 서버를 AWS lambda 라든지 해외 region에서 운영하려고 한다면 timezone 설정을 해주는 것이 좋습니다

 

루트 위치에 .env 파일을 생성하여 아래처럼 추가해줍니다

TZ=Asia/Seoul

만약 다른 timezone을 원하신다면 다른 timezone으로 설정해주시면 됩니다

이제 어떤 서버에서도 동일한 기준을 가진 쿼리를 날릴 수 있게 되었습니다

 

 

그럼 다음 글에서는 노션 데이터 베이스 쿼리의 결과를 활용하여

슬랙봇에 연동하여 알림 보내주는 것을 만들어보도록 하겠습니다 

 

[다음 글 바로가기]

https://kidneybeans2.tistory.com/23