GithubXDiscord

customization-guide > Notionpresso 구조 이해와 커스터마이징

Notionpresso 구조 이해와 커스터마이징

Notionpresso을 효과적으로 커스터마이징하기 위해서는 먼저 기본 구조와 데이터 흐름을 이해해야 합니다. 이 섹션에서는 Notion 데이터의 구조를 살펴보고, 이를 바탕으로 커스텀 컴포넌트를 만드는 방법을 설명합니다.

데이터 구조 이해하기

Notionpresso이 사용하는 Notion 데이터는 JSON 형식으로 구성되며, 페이지 정보와 각 블록의 세부 내용을 포함합니다. 이 구조를 이해하는 것이 효과적인 커스터마이징의 첫 걸음입니다.

기본 데이터 구조

{
  "object": "page",
  "id": "page-id",
  "created_time": "2024-09-20T13:54:00.000Z",
  "last_edited_time": "2024-09-21T04:28:00.000Z",
  "cover": null,
  "icon": null,
  "parent": {
    "type": "page_id",
    "page_id": "parent-page-id"
  },
  "properties": {
    "title": {
      "id": "title",
      "type": "title",
      "title": [
        {
          "type": "text",
          "text": {
            "content": "페이지 제목",
            "link": null
          },
          "annotations": {
            "bold": false,
            "italic": false,
            "color": "default"
          },
          "plain_text": "페이지 제목"
        }
      ]
    }
  },
  "blocks": [
    {
      "object": "block",
      "id": "block-id-1",
      "type": "toggle",
      "toggle": {
        "rich_text": [
          {
            "type": "text",
            "text": {
              "content": "토글 내용",
              "link": null
            },
            "annotations": {
              "bold": false,
              "italic": false,
              "color": "default"
            },
            "plain_text": "토글 내용"
          }
        ],
        "color": "default"
      },
      "blocks": [
        {
          "object": "block",
          "id": "block-id-2",
          "type": "paragraph",
          "paragraph": {
            "rich_text": [
              {
                "type": "text",
                "text": {
                  "content": "토글 내부 단락",
                  "link": null
                },
                "annotations": {
                  "bold": false,
                  "italic": false,
                  "color": "default"
                },
                "plain_text": "토글 내부 단락"
              }
            ],
            "color": "default"
          }
        }
      ]
    }
  ]
}

주요 구조 요소

  1. 페이지 메타데이터: id, created_time, last_edited_time, parent 등 페이지의 기본 정보를 포함합니다.

  2. cover와 icon: 페이지의 커버 이미지와 아이콘 정보입니다. 커스텀 디자인을 적용할 때 이 정보를 활용할 수 있습니다.

  3. properties: 페이지의 속성 정보로, 주로 페이지 제목(title)이 포함됩니다. 커스텀 헤더를 만들 때 이 정보를 사용할 수 있습니다.

  4. blocks: 페이지 내용을 구성하는 블록들의 배열입니다. 각 블록은 다음 구조를 가집니다:

    • object: 항상 "block"
    • id: 블록의 고유 식별자
    • type: 블록의 타입 (예: "toggle", "paragraph", "heading_1" 등)
    • [type]: 블록 타입에 해당하는 키로, 해당 블록의 구체적인 내용을 포함합니다.
    • blocks: 하위 블록들의 배열. 이를 통해 재귀적인 구조를 형성합니다.
  5. 재귀적 구조: blocks 배열 내의 각 블록은 다시 blocks 배열을 가질 수 있어, 중첩된 구조를 표현할 수 있습니다. 이는 토글, 목록 등의 중첩된 콘텐츠를 커스터마이징할 때 중요합니다.

  6. rich_text: 대부분의 텍스트 콘텐츠는 rich_text 배열로 표현되며, 텍스트의 스타일 정보(annotations)를 포함합니다. 이를 통해 텍스트 스타일을 세밀하게 커스터마이징할 수 있습니다.

커스터마이징을 위한 컴포넌트 구조

Notionpresso의 기본적인 컴포넌트 구조는 다음과 같습니다:

┌────────────────────────────────────────────────────────────────┐
│                           <Notion>                             │
│  ┌────────────────────────────────────────────────────────┐    │
│  │                        <Cover />                       │    │
│  │                  // Page cover image                   │    │
│  └────────────────────────────────────────────────────────┘    │
│                                                                │
│               ┌────────────────────────────┐                   │
│               │           <Body>           │                   │
│               │  ┌──────────────────────┐  │                   │
│               │  │      <Title />       │  │                   │
│               │  │    // Page title     │  │                   │
│               │  └──────────────────────┘  │                   │
│               │  ┌──────────────────────┐  │                   │
│               │  │      <Blocks>        │  │                   │
│               │  │ ┌──────────────────┐ │  │                   │
│               │  │ │<Block type="...">│ │  │                   │
│               │  │ │  // e.g. Heading │ │  │                   │
│               │  │ └──────────────────┘ │  │                   │
│               │  │ ┌──────────────────┐ │  │                   │
│               │  │ │<Block type="...">│ │  │                   │
│               │  │ │   // e.g. Para   │ │  │                   │
│               │  │ └──────────────────┘ │  │                   │
│               │  │         ...          │  │                   │
│               │  │  // More blocks      │  │                   │
│               │  └──────────────────────┘  │                   │
│               └────────────────────────────┘                   │
│                                                                │
└────────────────────────────────────────────────────────────────┘

이 구조에서 <Body> 컴포넌트는 전체 너비의 약 60%를 차지하며 중앙에 정렬됩니다. 이 레이아웃을 기반으로 각 컴포넌트를 커스터마이징할 수 있습니다.

커스터마이징 전략

  1. 블록별 커스텀 컴포넌트: 각 블록 타입(paragraph, heading_1, toggle 등)에 대해 커스텀 컴포넌트를 만들어 기본 스타일과 동작을 오버라이드할 수 있습니다.

  2. 스타일 커스터마이징: CSS 변수와 클래스를 활용하여 전체적인 디자인을 조정할 수 있습니다.

  3. 레이아웃 수정: <Body> 컴포넌트의 너비나 정렬을 조정하여 전체 레이아웃을 변경할 수 있습니다.

  4. 재귀적 렌더링 활용: 중첩된 블록 구조를 활용하여 복잡한 레이아웃이나 인터랙션을 구현할 수 있습니다.

  5. 메타데이터 활용: 페이지의 메타데이터, 커버 이미지, 아이콘 등을 활용하여 풍부한 UI를 구성할 수 있습니다.

이러한 구조와 전략을 이해하면, Notionpresso을 기반으로 고도로 커스터마이즈된 Notion 기반 웹사이트를 만들 수 있습니다. 다음 섹션에서는 각 요소별 구체적인 커스터마이징 방법을 살펴보겠습니다.