본문 바로가기

프로젝트/개인 프로젝트

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

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

 

1년만에 2탄으로 돌아왔습니다...

 

포함하는 내용 및 포함하지 않는 내용

1편에서는 로컬 서버에서 노션 데이터베이스를 쿼리하고, 데이터를 받아오는 것까지 진행했습니다.

2편에서는 지난 글에 이어서 아래의 두가지 내용을 진행하려고 합니다.

 

1. 로컬 서버를 AWS Lambda(이하 람다)로 업로드

2. 람다에서 실행된 결과를 슬랙으로 전송

 

다만, 이 글에서는 람다의 구체적인 동작 원리에 대한 설명은 하지 않을 예정입니다.

 

prerequisite

아래의 내용은 준비되어 있다고 가정합니다.

  • AWS 계정
  • aws-cli
  • 슬랙 웹훅 URL

 

step 1. 로컬 서버를 람다로 올리기

1. 기존 서버를 노션에 올릴 수 있게 변형하기

지난 글에서 이용한 노드 서버를 활용해서 람다에 올릴 예정인데요.

프로젝트는 1편을 통해 생성되어 있다는 가정 하에, 람다를 위한 버전으로 조금 변경해보겠습니다.

 

 index.js

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}`
}

const getNotionDatabase = async () => {
  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})
}


exports.handler = async (event) => {
  const notionData = await getNotionDatabase()
  console.log(notionData)
};

 

2. AWS 웹 콘솔에서 람다 생성

웹 콘솔에서 람다를 직접 생성합니다.

 

3. 작성한 코드를 람다로 업로드

먼저 현재 디렉토리의 파일들을 압축합니다.

zip -r function.zip .

 

그 다음 아래의 명령어를 입력해 해당 람다로 압축한 파일을 업로드 합니다.

aws lambda update-function-code --function-name {{함수명}} --zip-
file fileb://function.zip

 

로컬의 패키지들을 업로드 하는 일이 잦다면, 미리 명령어를 세팅할 수도 있습니다.

 

추가로, 람다에서 노션의 환경변수들도 람다 웹 콘솔 화면에서 [구성] - [환경변수] 에서 등록해줍니다. 이것도 aws-cli나 다른 방법을 통해 등록해줄 순 있지만, 가장 간단한 방법은 웹 콘솔에서 직접 등록해주는 방법이 아닐까 싶습니다.

 

 

4. 람다 함수 수정

기존 함수에서 응답을 살펴보면 기존 응답에서는 userId 까지만 확인이 가능합니다.

하지만 제가 알고 싶은 건 유저가 등록한 실제 이름인데요.

그를 위해 아래와 같이 notion API 를 추가로 호출하고, 이름 목록을 리턴하게 합니다.

const { Client } = require("@notionhq/client")
const { IncomingWebhook } = require('@slack/webhook')

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}`
}

const getCompletedTILer = async () => {
  const today = new Date().toYYYYMMDD()
  const response = await notion.databases.query({
    database_id: NOTION_DATABASE_ID,
    filter: {
      property: "생성일",
      created_time: {
        on_or_after: today,
      },
    },
  })

  const nameList = await Promise.all(response.results.map(async (result) => {
    const user_id = result.created_by.id
    const userData = await notion.users.retrieve({user_id})
    return userData.name
  }))

  return nameList
}


exports.handler = async (event) => {
    const notionData = await getCompletedTILer()
    console.log(notionData)
};

이제 이런 응답을 보내면 ['이름'] 과 같은 형태의 이름 목록을 리턴받을 수 있습니다.

 

 

step 2. 람다에서 실행된 결과를 슬랙으로 전송

1. 슬랙 의존성 설치하기

슬랙 패키지로 @slack/webhook 을 추가로 설치하겠습니다.

npm i @slack/webhook

 

2. 슬랙 메시지 전송을 위한 코드

아래와 같이 추가로 임포트할 수 있게 하고 환경변수도 추가로 등록해줍니다.

const { IncomingWebhook } = require('@slack/webhook')

// ...

const SLACK_URL = process.env.SLACK_URL

마지막으로 아래와 같이 슬랙 메시지를 전송하는 부분만 추가해주면 완성입니다.

const sendSlackMessage = async (nameList) => {
  await webhook.send(`오늘 TIL 은 총 ${nameList.length} 명이 등록했습니다: ${nameList.join(", ")}`)
}


exports.handler = async (event) => {
    const nameList = await getCompletedTILer()
    await sendSlackMessage(nameList)
};

 

3. 메시지 전송

그러면 아래와 같이 슬랙으로 매일 저녁 10시마다 알림을 받을 수 있게 되었습니다!

 

 

 

 

 * 완성된 버전의 코드는 깃헙 에서도 확인하실 수 있습니다.