๊ด€๋ฆฌ ๋ฉ”๋‰ด

akjfal

Notion Workspace API ์‚ฌ์šฉํ•˜๊ธฐ (2023.03 ver) ๋ณธ๋ฌธ

์นดํ…Œ๊ณ ๋ฆฌ ์—†์Œ

Notion Workspace API ์‚ฌ์šฉํ•˜๊ธฐ (2023.03 ver)

akjfal 2023. 12. 3. 13:59
๋”๋ณด๊ธฐ

๐Ÿ’ก ์•„๋ž˜ ๋‚ด์šฉ๋“ค์— ๋Œ€ํ•œ Vue์™€ ts๋ฅผ ์‚ฌ์šฉํ•œ ์˜ˆ์‹œ ์ฝ”๋“œ์ž…๋‹ˆ๋‹ค.

WorkSpace์™€ ์—ฐ๊ฒฐํ•˜๊ธฐ

workspace์— ์ ‘์†์„ ํ•œ ๋’ค ํ•ด๋‹น ์›Œํฌ์ŠคํŽ˜์ด์Šค์™€ Integrations๋ฅผ ์—ฐ๊ฒฐํ•ด์ค˜์•ผ ํ•ฉ๋‹ˆ๋‹ค.

  1. ์šฐ์ธก ์ƒ๋‹จ  ๋ฒ„ํŠผ์„ ๋ˆŒ๋Ÿฌ์ฃผ๋„๋ก ํ•ฉ๋‹ˆ๋‹ค.
  2. ์—ฐ๊ฒฐ์—์„œ ์—ฐ๊ฒฐ ์ถ”๊ฐ€๋ฅผ ํด๋ฆญ ํ•œ ๋’ค ๊ธฐ์กด์— ๋งŒ๋“ค์—ˆ๋˜ Integrations๋ฅผ ๊ฒ€์ƒ‰ํ•ด์„œ ์ถ”๊ฐ€ํ•ด์ฃผ๋„๋ก ํ•ฉ๋‹ˆ๋‹ค.
  3. ์—ฐ๊ฒฐ ์™„๋ฃŒ ์‹œ ์•„๋ž˜ ์ด๋ฏธ์ง€์™€ ๊ฐ™์ด ์—ฐ๊ฒฐ์— ํ•ญ๋ชฉ์ด ์ถ”๊ฐ€๋ฉ๋‹ˆ๋‹ค.


Table์„ ํ†ตํ•ด์„œ Database ๋งŒ๋“ค๊ธฐ

๋…ธ์…˜์—์„œ ํ…Œ์ด๋ธ” ์ƒ์„ฑ์„ ํ•  ์‹œ ์•„๋ž˜์™€ ๊ฐ™์ด ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋ฅผ ๋งŒ๋“ค ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

ํ•ด๋‹น ํ…Œ์ด๋ธ”์€ index๋ฅผ ์ถ”๊ฐ€ํ•˜๊ฑฐ๋‚˜ ์‚ญ์ œํ• ์ˆ˜๋„ ์žˆ์œผ๋ฉฐ ์ถ”ํ›„ API๋ฅผ ํ†ตํ•ด ๊ฒ€์ƒ‰์ด ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค.


API ํ˜ธ์ถœ ํ•˜๊ธฐ

Notion API๋Š” ๋‹ค์–‘ํ•œ ์˜์—ญ์œผ๋กœ ๋‚˜๋ˆ ์„œ Notion์˜ ์ •๋ณด๋ฅผ ๊ฐ€์ ธ์˜ค๋„๋ก ํ•˜๊ณ ์žˆ์Šต๋‹ˆ๋‹ค.

  1. Database
  2. Page
  3. Block
  4. Comments
  5. Users
  6. Search

๋˜ํ•œ ๊ณต์‹๋ฌธ์„œ์—์„œ JS์™€ Shell ๋ฒ„์ „ ์˜ˆ์‹œ; ๋‘๊ฐ€์ง€๊ฐ€ ์ œ๊ณตํ•ด์ฃผ๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

Object ๋ฆฌํ„ด ๊ฐ’

{
    "object": "page" // page, block, comment ๋“ฑ,
    "id": "id_123", // id
    "parent": { // ์ถœ์ฒ˜
        "type": "page_id",
        "page_id": "page_id_123"
    },
    "discussion_id": "discussion_id_123",
    "created_time": "2022-07-15T21:17:00.000Z",
    "last_edited_time": "2022-07-15T21:17:00.000Z",
    "created_by": {
        "object": "user",
        "id": "id_123"
    },
    "heading_2": [ // ์—”ํ„ฐ๊ฐ€ ๋‚˜์˜ค๊ธฐ ์ „๊นŒ์ง€ ๋ธ”๋ก
				// page์˜ ๊ฒฝ์šฐ properites๊ฐ€ ๋‚˜์˜ด
				// comments์˜ ๊ฒฝ์šฐ rich_text๊ฐ€ ๋ฐ”๋กœ ๋‚˜์˜ด 
        "rich_text": [{ // ํ•œ ์ค„์—๋„ ์—ฌ๋Ÿฌ ์†์„ฑ์ด ๋‚˜์˜ฌ ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ array๋กœ ๋„˜์–ด์˜ด
            "type": "text",
            "text": {
                "content": "Hello world",
                "link": null
            },
            "annotations": { // text ์†์„ฑ๊ฐ’์œผ๋กœ css๊ฐ’
                "bold": false,
                "italic": false,
                "strikethrough": false,
                "underline": false,
                "code": false, // ํšŒ์ƒ‰ ๋ฐ”ํƒ•์— ๋นจ๊ฐ„ ๊ธ€์”จ (ctrl + e)
                "color": "default" //  notion์—์„œ ์‚ฌ์šฉํ•˜๋Š” ์ •ํ•ด์ง„ ์ƒ‰
            },
            "plain_text": "Hello world",
            "href": null
        }]
    ]
}
๋”๋ณด๊ธฐ

Notion API๋Š” ์„œ๋ฒ„์—์„œ๋งŒ ์‚ฌ์šฉํ•˜๋„๋ก ์„ค๊ณ„๋˜์–ด์ ธ ์žˆ์Šต๋‹ˆ๋‹ค.


Database

database๋ฅผ ํ˜ธ์ถœํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” ์šฐ์„  ํ† ํฐ ๊ฐ’๋“ค์„ ๊ฐ€์ ธ์™€์•ผ ํ•ฉ๋‹ˆ๋‹ค.

  1. secrets Token : Integrations ์„ค์ • ํŽ˜์ด์ง€์—์„œ ๊ฐ€์ ธ์˜ฌ ์ˆ˜ ์ž‡์Šต๋‹ˆ๋‹ค.
  2. Database Id : TableํŽ˜์ด์ง€์—์„œ ๊ณต์œ ํ•˜๊ธฐ๋ฅผ ๋ˆ„๋ฅด๋ฉด URL์ด ๋ณต์‚ฌ๋˜๋Š”๋ฐ https://notion.so/`databaseId` ?v=…์ด ๋‚˜์˜ค๊ฒŒ ๋ฉ๋‹ˆ๋‹ค. ํ•ด๋‹น URL์—์„œ database ID๋ผ๊ณ  ์ ํžŒ ๋ถ€๋ถ„์ด Id๊ฐ’์ž…๋‹ˆ๋‹ค.

๊ฐ’์„ ํ˜ธ์ถœํ•  ๋•Œ Notion์—์„œ ์ œ๊ณตํ•˜๋Š” ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜๋„, API๋ฅผ ๋‚ ๋ฆด ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค.

Database Query

์›ํ•˜๋Š” ๊ฐ’์„ ๊ฐ€์ ธ์˜ค๊ธฐ ์œ„ํ•ด filter์™€ sort ๋‘๊ฐ€์ง€๋ฅผ ์ฟผ๋ฆฌ์—์„œ ์ œ๊ณตํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

import { Client } from '@notionhq/client';

const notion = new Client({auth: process.env.NOTION_KEY});
const databaseId = process.env.NOTION_DATABASE_LIST_ID;
(async () => const response = await notion.databases.query({
  database_id: databaseId,
  filter: {
		propery: 'title',
		title: {
			equals: '์ œ๋ชฉ์ž…๋‹ˆ๋‹ค'
		}
	},
  sorts: [
    {
      timestamp: 'created_time',
      direction: 'descending',
    },
  ],
}))();

์ด์™ธ์—๋„

  • database ์ƒ์„ฑ
  • database ์—…๋ฐ์ดํŠธ
  • database ๊ฐ€์ ธ์˜ค๊ธฐ

API๊ฐ€ ์กด์žฌํ•ฉ๋‹ˆ๋‹ค.


Page

Notion์˜ ๊ธ€์€ ํฌ๊ฒŒ 2๊ฐ€์ง€ ์˜์—ญ์œผ๋กœ ๋‚˜๋‰˜์–ด์ ธ ์žˆ์Šต๋‹ˆ๋‹ค.

API๋ฅผ ํ†ตํ•ด์„œ ํŽ˜์ด์ง€๋ฅผ ํ˜ธ์ถœํ•  ์‹œ page properties๋งŒ ํ˜ธ์ถœ๋˜์–ด์„œ ์†์„ฑ๊ณผ ์ œ๋ชฉ ๊ฐ’๋“ค์„ ์•Œ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

const { Client } = require('@notionhq/client');

const notion = new Client({auth: process.env.NOTION_KEY});
(async () => {
	// page id๋ฅผ ๊ฐ€์ ธ์˜ค๊ธฐ ์œ„ํ•œ database ํ˜ธ์ถœ 
	const response = await notion.databases.query({
	  database_id: databaseId,
	  filter: {
	    property: 'title',
	    title: {
	      equals: title,
	    },
	  },
	});
	const pageId = response.results[0].id;
	const page = await notion.pages.retrieve({
	  page_id: pageId,
	});
})();
  • page ๊ฐ€์ ธ์˜ค๊ธฐ
  • page ์ƒ์„ฑ
  • page ์—…๋ฐ์ดํŠธ
  • page ์†์„ฑ ๊ฐ€์ ธ์˜ค๊ธฐ

API๊ฐ€ ์กด์žฌํ•ฉ๋‹ˆ๋‹ค.


Blocks

Page์™€ ์œ ์‚ฌํ•˜์ง€๋งŒ Pageํ˜ธ์ถœ์˜ ๊ฒฝ์šฐ properity๋งŒ ๋„˜์–ด์™”๋‹ค๋ฉด block์€ content์˜ ๋‚ด์šฉ์ด ๋„˜์–ด์˜ต๋‹ˆ๋‹ค.

const { Client } = require('@notionhq/client');

const notion = new Client({auth: process.env.NOTION_KEY});
(async () => {
	// page id๋ฅผ ๊ฐ€์ ธ์˜ค๊ธฐ ์œ„ํ•œ database ํ˜ธ์ถœ 
	const response = await notion.databases.query({
	  database_id: databaseId,
	  filter: {
	    property: 'title',
	    title: {
	      equals: title,
	    },
	  },
	});
	const pageId = response.results[0].id;
	const block = await notion.blocks.children.list({
    block_id: pageId,
  });
})();
  • block ๊ฐ€์ ธ์˜ค๊ธฐ
  • block ์ƒ์„ฑ
  • block ์—…๋ฐ์ดํŠธ
  • block์˜ chlidren ํ˜ธ์ถœํ•˜๊ธฐ
  • ์‚ญ์ œํ•˜๊ธฐ
  • children ์ถ”๊ฐ€ํ•˜๊ธฐ

API๊ฐ€ ์กด์žฌํ•ฉ๋‹ˆ๋‹ค.


Comments

Comments๋Š” Notion Page๋‚˜ Block์— ๋‹ฌ์•„ ๋†“์€ ๋Œ“๊ธ€์„ ๊ฐ€์ ธ์˜ค๋ฉฐ, ์ดˆ๊ธฐ Integrates์—์„œ ์„ค์ •ํ•ด๋‘” ๊ธฐ๋Šฅ๋“ค์„ ๋”ฐ๋ผ๊ฐ‘๋‹ˆ๋‹ค.

const { Client } = require('@notionhq/client');

const notion = new Client({ auth: process.env.NOTION_API_KEY });

(async () => {
	const response = await notion.databases.query({
	  database_id: databaseId,
	  filter: {
	    property: 'title',
	    title: {
	      equals: title,
	    },
	  },
	});
	const pageId = response.results[0].id;
  const response = await notion.comments.list({ block_id: pageId });
  console.log(response);
})();
  • Comment ์ƒ์„ฑ
  • Comment ๊ฐ€์ ธ์˜ค๊ธฐ

API๊ฐ€ ์กด์žฌํ•ฉ๋‹ˆ๋‹ค.


Users

์œ ์ €์˜ ์ •๋ณด๋ฅผ ๊ฐ€์ ธ์˜ค๋Š” API์ž…๋‹ˆ๋‹ค.

  • Use 1๋ช…์˜ ์ •๋ณด๊ฐ€์ ธ์˜ค๊ธฐ
  • ์›Œํฌ์ŠคํŽ˜์ด์Šค์˜ ๋ชจ๋“  ์œ ์ € ์ •๋ณด ๊ฐ€์ ธ์˜ค๊ธฐ
  • ๋ด‡ ์‚ฌ์šฉ์ž ๊ฒ€์ƒ‰

API๊ฐ€ ์กด์žฌํ•ฉ๋‹ˆ๋‹ค.


Search

๊ณต์œ ๋˜๋Š” ๋ชจ๋“  ํŽ˜์ด์ง€, DB, ํ•˜์œ„ํŽ˜์ด์ง€, ํ•˜์œ„ DB๋ฅผ ๊ฒ€์ƒ‰ํ•ฉ๋‹ˆ๋‹ค. ์ด๋Š” DB๋‚˜ ํŽ˜์ด์ง€ ์ฟผ๋ฆฌ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ์— ๊ฐ€์žฅ ์ •ํ™•ํ•œ ๊ฐ’์„ ์–ป์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

  • ์ •๋ณด ์ฐพ๊ธฐ

API๊ฐ€ ์กด์žฌํ•ฉ๋‹ˆ๋‹ค.

Comments