์ผ | ์ | ํ | ์ | ๋ชฉ | ๊ธ | ํ |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |
- background: url
- Nextjs React 18
- React ๊ณ ๊ธ ์๋ด์
- notFound()
- React ๊ณ ๊ธ์๋ด์
- background setttimeout
- react-helmet
- getUTCDate
- codingtest
- next13 head
- Babel
- CSS
- React API ์ฐธ๊ณ ์
- React18
- react
- background tab
- Programmers
- Nextjs
- Render Props
- React ๊ณต์๋ฌธ์
- React 18 Nextjs
- Next13
- hook
- React 18
- background setInterval
- react hook
- Javascript
- context
- RTK Query
- ๊ณ ๊ธ์๋ด์
- Today
- Total
akjfal
Notion Workspace API ์ฌ์ฉํ๊ธฐ (2023.03 ver) ๋ณธ๋ฌธ
๐ก ์๋ ๋ด์ฉ๋ค์ ๋ํ Vue์ ts๋ฅผ ์ฌ์ฉํ ์์ ์ฝ๋์ ๋๋ค.
WorkSpace์ ์ฐ๊ฒฐํ๊ธฐ
workspace์ ์ ์์ ํ ๋ค ํด๋น ์ํฌ์คํ์ด์ค์ Integrations๋ฅผ ์ฐ๊ฒฐํด์ค์ผ ํฉ๋๋ค.
- ์ฐ์ธก ์๋จ … ๋ฒํผ์ ๋๋ฌ์ฃผ๋๋ก ํฉ๋๋ค.
- ์ฐ๊ฒฐ์์ ์ฐ๊ฒฐ ์ถ๊ฐ๋ฅผ ํด๋ฆญ ํ ๋ค ๊ธฐ์กด์ ๋ง๋ค์๋ Integrations๋ฅผ ๊ฒ์ํด์ ์ถ๊ฐํด์ฃผ๋๋ก ํฉ๋๋ค.
- ์ฐ๊ฒฐ ์๋ฃ ์ ์๋ ์ด๋ฏธ์ง์ ๊ฐ์ด ์ฐ๊ฒฐ์ ํญ๋ชฉ์ด ์ถ๊ฐ๋ฉ๋๋ค.
Table์ ํตํด์ Database ๋ง๋ค๊ธฐ
๋ ธ์ ์์ ํ ์ด๋ธ ์์ฑ์ ํ ์ ์๋์ ๊ฐ์ด ๋ฐ์ดํฐ๋ฒ ์ด์ค๋ฅผ ๋ง๋ค ์ ์์ต๋๋ค.
ํด๋น ํ ์ด๋ธ์ index๋ฅผ ์ถ๊ฐํ๊ฑฐ๋ ์ญ์ ํ ์๋ ์์ผ๋ฉฐ ์ถํ API๋ฅผ ํตํด ๊ฒ์์ด ๊ฐ๋ฅํฉ๋๋ค.
API ํธ์ถ ํ๊ธฐ
Notion API๋ ๋ค์ํ ์์ญ์ผ๋ก ๋๋ ์ Notion์ ์ ๋ณด๋ฅผ ๊ฐ์ ธ์ค๋๋ก ํ๊ณ ์์ต๋๋ค.
- Database
- Page
- Block
- Comments
- Users
- 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๋ฅผ ํธ์ถํ๊ธฐ ์ํด์๋ ์ฐ์ ํ ํฐ ๊ฐ๋ค์ ๊ฐ์ ธ์์ผ ํฉ๋๋ค.
- secrets Token : Integrations ์ค์ ํ์ด์ง์์ ๊ฐ์ ธ์ฌ ์ ์์ต๋๋ค.
- 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๊ฐ ์กด์ฌํฉ๋๋ค.