πŸ“Notion API

10_2pangΒ·2023λ…„ 6μ›” 5일
0

βš½οΈνŠΈλŸ¬λΈ”μŠˆνŒ…

λͺ©λ‘ 보기
62/94
post-thumbnail

πŸ‘¨β€πŸ’»Β νŠΈλŸ¬λΈ”μŠˆνŒ…


1️⃣ API μ ‘κ·Ό


μ°Έκ³ ν…Œλ§ˆ : https://jamstackthemes.dev/theme/notion-blog-nextjs-coral/

  • λ…Έμ…˜ SDK μ ‘κ·Ό
yarn add @notionhq/client
  • λ…Έμ…˜ API λ₯Ό μ„€μ •ν•˜μ—¬ 닀뀄보기 ❓그렇닀면,Β lib 와 pages/api 쀑 μ–΄λŠ 디렉토리λ₯Ό μ‚¬μš©ν•΄μ•Όν• κΉŒ
    • lib β†’ ν΄λΌμ΄μ–ΈνŠΈ 츑에 도움이 λ˜λŠ” μœ ν‹Έλ¦¬ν‹° κΈ°λŠ₯용
    • pages/api β†’ μ„œλ²„ 츑에 API μ—”λ“œν¬μΈνŠΈ μš©λ„
  • κΈ°μ‘΄ ν…Œλ§ˆμ˜ 경우, ν¬μŠ€νŠΈκΈ€μ˜ λ“€μ—¬μ“°κΈ°κ°€ λ˜μ–΄μžˆμ„ 경우 데이터λ₯Ό λ½‘μ•„λ‚΄μ˜€μ§€ λͺ»ν–ˆλ‹€. ❓has_child 속성을 μ΄μš©ν•˜μ—¬, λͺ¨λ“  λ…Έλ“œλ₯Ό νƒμƒ‰ν•˜κ²Œ ν•œλ‹€λ©΄ κ°€λŠ₯ν•˜μ§€ μ•Šμ„κΉŒ
    import { Client } from "@notionhq/client";
    
    const notion = new Client({
      auth: process.env.NOTION_TOKEN,
    });
    
    export const getBlocks = async (blockId) => {
      blockId = blockId.replaceAll("-", "");
    	// μƒˆλ‘œμš΄ newObj 에 blockId 에 ν•΄λ‹Ήν•˜λŠ” λΈ”λŸ­μ„ μ „λΆ€ μΆ”κ°€ν•œλ‹€.
    	// λ„ˆλ¬΄ λ§Žμ€ λ°μ΄ν„°λ‘œ 인해 κ³ΌλΆ€ν•˜λ₯Ό λ°©μ§€ν•˜κΈ°μœ„ν•΄ depth 2 κΉŒμ§€λ§Œ 뽑아낸닀.
      async function flattenBlocks(blockId, depth = 0) {
        const blockData = await notion.blocks.children.list({ block_id: blockId });
        const newObj = [];
    
        for (let block of blockData.results) {
          newObj.push({ ...block, depth });
    
          if (depth < 2 && block.has_children) {
            const childBlockData = await notion.blocks.children.list({ block_id: block.id });
    
            for (let childBlock of childBlockData.results) {
              newObj.push({ ...childBlock, depth: depth + 1 });
    
              if (childBlock.has_children) {
    																																	// λ“€μ—¬μ“°κΈ°λ₯Ό μ•ŒκΈ°μœ„ν•΄ μΆ”κ°€
                const grandChildren = await flattenBlocks(childBlock.id, depth + 1);
                newObj.push(...grandChildren);
              }
            }
          }
        }
    
        return newObj;
      }
    
      const flattenedBlocks = await flattenBlocks(blockId);
      return flattenedBlocks;
    }; 
    이후, 각 λΈ”λŸ­μ— ν•΄λ‹Ήν•˜λŠ” ν˜•μ‹μœΌλ‘œ 좜λ ₯ν•œλ‹€.
    const renderBlock = (block) => {
    	// 각 λΈ”λŸ­μ˜ μš”μ†Œλ‘œ type(type에 λ”°λ₯Έ return을 μœ„ν•΄)
    	// id (μœ λ‹ˆν¬ν•œ key값을 μ μš©ν• λ•Œ λ“±λ“±..)
    	// depth (λ“€μ—¬μ“°κΈ°κ°€ 될 경우, 띄어쓰기λ₯Ό ν•΄μ£Όλ €κ³  )
      const { type, id, depth } = block;
      const value = block[type];
    	// 띄어쓰기 μŠ€νƒ€μΌμ„ μƒλ‹¨νƒœκ·Έμ— μΆ”κ°€
      const indentStyle = { paddingLeft: `${depth * 10}px` };
      switch (type) {
        case "paragraph":
          return (
            <p style={indentStyle}>
              <Text text={value.rich_text} />
            </p>
          );
        case "heading_1":
          return (
            <h1 style={indentStyle}>
              <Text text={value.rich_text} />
            </h1>
          );
    ...

πŸ˜’Β μ²˜μŒμ— ν–ˆμ„λ•Œ, μ–΄λ €μš΄μ 

  • 처음 λ‹€λ€„λ³΄λŠ” API λ‹€ λ³΄λ‹ˆ, μ „λΆ€ μ½”λ“œλ₯Ό λœ―μ–΄λ³΄μ•˜λ‹€.
  • 각 block 을 ν•˜λ‚˜λ‘œ λͺ¨μœΌλŠ”λ°, 뎁슀λ₯Ό μ„€μ •ν•˜μ§€ μ•Šκ³  κ³„μ†ν•΄μ„œ notion API λ₯Ό λ„ˆλ¬΄ 많이 λΆˆλŸ¬μ˜€λ‹€λ³΄λ‹ˆ 였λ₯˜κ°€ λ°œμƒν•˜μ—¬μ„œ μ‰½μ§€μ•Šμ•˜λ‹€.
profile
μ£Όλ‹ˆμ–΄ ν”„λ‘ νŠΈμ—”λ“œ 개발자 이광렬 μž…λ‹ˆλ‹€ 🌸

0개의 λŒ“κΈ€