diff --git a/.changeset/stupid-beds-stare.md b/.changeset/stupid-beds-stare.md new file mode 100644 index 0000000..de3ea25 --- /dev/null +++ b/.changeset/stupid-beds-stare.md @@ -0,0 +1,5 @@ +--- +"notion-to-jsx": patch +--- + +add video block support with YouTube embed functionality diff --git a/apps/renderer-storybook/scripts/fetchNotionBlocks.ts b/apps/renderer-storybook/scripts/fetchNotionBlocks.ts index 2d64d00..1b6c54c 100644 --- a/apps/renderer-storybook/scripts/fetchNotionBlocks.ts +++ b/apps/renderer-storybook/scripts/fetchNotionBlocks.ts @@ -12,7 +12,7 @@ const __dirname = dirname(__filename); dotenv.config({ path: resolve(__dirname, '../.env.local') }); // 페이지 ID -const PAGE_ID = '56874170f8d44bcc996ebe4e43f67930'; +const PAGE_ID = 'b71705621e0d4f8bae2a65cb2715757e'; // ? using this script : pnpx tsx scripts/fetchNotionBlocks.ts async function fetchAndSaveBlocks() { diff --git a/apps/renderer-storybook/src/sample-data/notionBlocks.json b/apps/renderer-storybook/src/sample-data/notionBlocks.json index f6c47a1..6a24c6c 100644 --- a/apps/renderer-storybook/src/sample-data/notionBlocks.json +++ b/apps/renderer-storybook/src/sample-data/notionBlocks.json @@ -1,13 +1,13 @@ [ { "object": "block", - "id": "4c17d007-359d-4942-a28c-212a1e8e3019", + "id": "9dc999ab-9de6-4536-b76a-02561e5f19f8", "parent": { "type": "page_id", - "page_id": "56874170-f8d4-4bcc-996e-be4e43f67930" + "page_id": "b7170562-1e0d-4f8b-ae2a-65cb2715757e" }, - "created_time": "2023-09-11T11:30:00.000Z", - "last_edited_time": "2023-12-01T11:46:00.000Z", + "created_time": "2023-07-02T08:40:00.000Z", + "last_edited_time": "2023-07-02T08:40:00.000Z", "created_by": { "object": "user", "id": "5146391e-8b65-47f2-83b6-2bfe81194f32" @@ -25,7 +25,7 @@ { "type": "text", "text": { - "content": "요즘 React, Next에서 상태 관리를 위한 라이브러리나 Context API를 사용하는 것은 거의 필수적이다.\n하지만 왜 Context API 대신 다른 상태 관리 라이브러리를 쓰는 지, 각 라이브러리가 어떠한 컨셉을 가지고 있는 지에 대해 정리해 본 적이 없어서 이번 기회에 정리해보려 한다.", + "content": "2021년도를 정리할 겸 오랜만의 포스팅이다!", "link": null }, "annotations": { @@ -36,7 +36,7 @@ "code": false, "color": "default" }, - "plain_text": "요즘 React, Next에서 상태 관리를 위한 라이브러리나 Context API를 사용하는 것은 거의 필수적이다.\n하지만 왜 Context API 대신 다른 상태 관리 라이브러리를 쓰는 지, 각 라이브러리가 어떠한 컨셉을 가지고 있는 지에 대해 정리해 본 적이 없어서 이번 기회에 정리해보려 한다.", + "plain_text": "2021년도를 정리할 겸 오랜만의 포스팅이다!", "href": null } ], @@ -45,13 +45,13 @@ }, { "object": "block", - "id": "8d169f29-e4aa-452f-8ef1-4c74bb7face9", + "id": "f755ecfb-92b8-48d2-92e5-6f7bf50715c6", "parent": { "type": "page_id", - "page_id": "56874170-f8d4-4bcc-996e-be4e43f67930" + "page_id": "b7170562-1e0d-4f8b-ae2a-65cb2715757e" }, - "created_time": "2023-11-30T02:05:00.000Z", - "last_edited_time": "2023-11-30T07:13:00.000Z", + "created_time": "2023-07-02T08:40:00.000Z", + "last_edited_time": "2023-07-02T08:40:00.000Z", "created_by": { "object": "user", "id": "5146391e-8b65-47f2-83b6-2bfe81194f32" @@ -63,13 +63,13 @@ "has_children": false, "archived": false, "in_trash": false, - "type": "heading_1", - "heading_1": { + "type": "paragraph", + "paragraph": { "rich_text": [ { "type": "text", "text": { - "content": "Context API", + "content": "정말 오랜만에 써서 어떻게 쓰는지도 쬐끔 헤맸당 ㅠ", "link": null }, "annotations": { @@ -80,23 +80,22 @@ "code": false, "color": "default" }, - "plain_text": "Context API", + "plain_text": "정말 오랜만에 써서 어떻게 쓰는지도 쬐끔 헤맸당 ㅠ", "href": null } ], - "is_toggleable": false, "color": "default" } }, { "object": "block", - "id": "804242d8-bab5-447f-9ec6-1b06f1fc28d9", + "id": "ae48d701-b383-44b6-b2e5-8de6f90483be", "parent": { "type": "page_id", - "page_id": "56874170-f8d4-4bcc-996e-be4e43f67930" + "page_id": "b7170562-1e0d-4f8b-ae2a-65cb2715757e" }, - "created_time": "2023-11-30T02:12:00.000Z", - "last_edited_time": "2023-11-30T02:12:00.000Z", + "created_time": "2023-07-02T08:40:00.000Z", + "last_edited_time": "2023-07-02T08:40:00.000Z", "created_by": { "object": "user", "id": "5146391e-8b65-47f2-83b6-2bfe81194f32" @@ -108,30 +107,57 @@ "has_children": false, "archived": false, "in_trash": false, - "type": "quote", - "quote": { + "type": "paragraph", + "paragraph": { "rich_text": [ { "type": "text", "text": { - "content": "Context", + "content": "우선 한 해를 어떻게 보냈는지 한번 살펴보았다.", "link": null }, "annotations": { "bold": false, - "italic": true, + "italic": false, "strikethrough": false, "underline": false, "code": false, "color": "default" }, - "plain_text": "Context", + "plain_text": "우선 한 해를 어떻게 보냈는지 한번 살펴보았다.", "href": null - }, + } + ], + "color": "default" + } + }, + { + "object": "block", + "id": "71e87ad5-e9d6-4850-a3f7-8fa4a55edb6b", + "parent": { + "type": "page_id", + "page_id": "b7170562-1e0d-4f8b-ae2a-65cb2715757e" + }, + "created_time": "2023-07-02T08:40:00.000Z", + "last_edited_time": "2023-07-02T08:40:00.000Z", + "created_by": { + "object": "user", + "id": "5146391e-8b65-47f2-83b6-2bfe81194f32" + }, + "last_edited_by": { + "object": "user", + "id": "5146391e-8b65-47f2-83b6-2bfe81194f32" + }, + "has_children": false, + "archived": false, + "in_trash": false, + "type": "paragraph", + "paragraph": { + "rich_text": [ { "type": "text", "text": { - "content": " lets the parent component make some information available to any component in the tree below it—no matter how deep—without passing it explicitly through props.", + "content": "현재 다니는 아이겐코리아에서 프론트 엔지니어로 일하게 되었는데, 회사에서 프론트 개발 담당이 혼자라 내가 잘하고 있는 건지 의문이 많았다.", "link": null }, "annotations": { @@ -142,7 +168,7 @@ "code": false, "color": "default" }, - "plain_text": " lets the parent component make some information available to any component in the tree below it—no matter how deep—without passing it explicitly through props.", + "plain_text": "현재 다니는 아이겐코리아에서 프론트 엔지니어로 일하게 되었는데, 회사에서 프론트 개발 담당이 혼자라 내가 잘하고 있는 건지 의문이 많았다.", "href": null } ], @@ -151,13 +177,13 @@ }, { "object": "block", - "id": "99c24ce0-c364-4350-a1f0-64c22b707d08", + "id": "0058bb65-c1a9-4eb3-ab54-cf5b66bb14a1", "parent": { "type": "page_id", - "page_id": "56874170-f8d4-4bcc-996e-be4e43f67930" + "page_id": "b7170562-1e0d-4f8b-ae2a-65cb2715757e" }, - "created_time": "2023-11-30T02:12:00.000Z", - "last_edited_time": "2023-12-01T11:47:00.000Z", + "created_time": "2023-07-02T08:40:00.000Z", + "last_edited_time": "2023-07-02T08:40:00.000Z", "created_by": { "object": "user", "id": "5146391e-8b65-47f2-83b6-2bfe81194f32" @@ -175,7 +201,7 @@ { "type": "text", "text": { - "content": "공식 문서를 보면 Context는 상위 컴포넌트에서 하위컴포넌트로 사용할 수 있는 정보를 전달해 주는 역할을 한다고 적혀있다.", + "content": "그래서 IT 동아리에 가입하기로 마음 먹었다.", "link": null }, "annotations": { @@ -186,7 +212,7 @@ "code": false, "color": "default" }, - "plain_text": "공식 문서를 보면 Context는 상위 컴포넌트에서 하위컴포넌트로 사용할 수 있는 정보를 전달해 주는 역할을 한다고 적혀있다.", + "plain_text": "그래서 IT 동아리에 가입하기로 마음 먹었다.", "href": null } ], @@ -195,13 +221,13 @@ }, { "object": "block", - "id": "dd5fb2a8-ba45-41e6-9380-3ad86b121b39", + "id": "92f75f19-6f1b-498e-a92e-386ecf8b5fd0", "parent": { "type": "page_id", - "page_id": "56874170-f8d4-4bcc-996e-be4e43f67930" + "page_id": "b7170562-1e0d-4f8b-ae2a-65cb2715757e" }, - "created_time": "2023-11-30T02:15:00.000Z", - "last_edited_time": "2023-12-01T11:47:00.000Z", + "created_time": "2023-07-02T08:40:00.000Z", + "last_edited_time": "2023-07-02T08:40:00.000Z", "created_by": { "object": "user", "id": "5146391e-8b65-47f2-83b6-2bfe81194f32" @@ -219,7 +245,43 @@ { "type": "text", "text": { - "content": "정보를 전달하는 방법으로는 “props drilling”이 있을 텐데 Depth가 매우 깊은 컴포넌트면 props를 계속 하위로 넘겨줘야 한다. 하지만 Context를 사용하면 props drilling이 아니라 다른 방식으로 정보를 전달할 수 있다.", + "content": "여러 가지 좋은 IT 동아리가 많은데 내가 가입하려고 한 동아리는 ", + "link": null + }, + "annotations": { + "bold": false, + "italic": false, + "strikethrough": false, + "underline": false, + "code": false, + "color": "default" + }, + "plain_text": "여러 가지 좋은 IT 동아리가 많은데 내가 가입하려고 한 동아리는 ", + "href": null + }, + { + "type": "text", + "text": { + "content": "DND", + "link": { + "url": "https://dnd.ac/" + } + }, + "annotations": { + "bold": false, + "italic": false, + "strikethrough": false, + "underline": false, + "code": false, + "color": "default" + }, + "plain_text": "DND", + "href": "https://dnd.ac/" + }, + { + "type": "text", + "text": { + "content": "였다.", "link": null }, "annotations": { @@ -230,7 +292,7 @@ "code": false, "color": "default" }, - "plain_text": "정보를 전달하는 방법으로는 “props drilling”이 있을 텐데 Depth가 매우 깊은 컴포넌트면 props를 계속 하위로 넘겨줘야 한다. 하지만 Context를 사용하면 props drilling이 아니라 다른 방식으로 정보를 전달할 수 있다.", + "plain_text": "였다.", "href": null } ], @@ -239,13 +301,13 @@ }, { "object": "block", - "id": "cbf325da-f845-470a-8d99-3dbe6889d422", + "id": "d1174914-bcdb-4e4f-b2b6-894f2a9c47ad", "parent": { "type": "page_id", - "page_id": "56874170-f8d4-4bcc-996e-be4e43f67930" + "page_id": "b7170562-1e0d-4f8b-ae2a-65cb2715757e" }, - "created_time": "2023-11-30T02:18:00.000Z", - "last_edited_time": "2025-04-14T14:09:00.000Z", + "created_time": "2023-07-04T08:13:00.000Z", + "last_edited_time": "2023-07-04T08:13:00.000Z", "created_by": { "object": "user", "id": "5146391e-8b65-47f2-83b6-2bfe81194f32" @@ -262,25 +324,25 @@ "caption": [], "type": "file", "file": { - "url": "https://www.notion.so/image/https%3A%2F%2Fprod-files-secure.s3.us-west-2.amazonaws.com%2Fcd7314a5-d906-43b0-81e7-42eff82c02a3%2F5e43b581-9173-4898-85e7-1addb7cf754b%2FUntitled.png?table=block&id=cbf325da-f845-470a-8d99-3dbe6889d422&cache=v2", - "expiry_time": "2025-04-14T15:12:43.676Z" + "url": "https://www.notion.so/image/https%3A%2F%2Fprod-files-secure.s3.us-west-2.amazonaws.com%2Fcd7314a5-d906-43b0-81e7-42eff82c02a3%2F0577b2e9-27ed-4b6f-be73-9429c1096263%2Fdnd.png?table=block&id=d1174914-bcdb-4e4f-b2b6-894f2a9c47ad&cache=v2", + "expiry_time": "2025-06-04T13:30:24.012Z" }, "format": { - "block_width": 1100, - "block_height": 449, - "block_aspect_ratio": 2.4498886414253898 + "block_width": 2190, + "block_height": 788, + "block_aspect_ratio": 2.779187817258883 } } }, { "object": "block", - "id": "9b36c383-f5bf-46cd-9ac3-063367d337a1", + "id": "32d369a2-e03f-4ab1-a915-d1cef3d3ee4b", "parent": { "type": "page_id", - "page_id": "56874170-f8d4-4bcc-996e-be4e43f67930" + "page_id": "b7170562-1e0d-4f8b-ae2a-65cb2715757e" }, - "created_time": "2023-11-30T02:19:00.000Z", - "last_edited_time": "2023-11-30T07:13:00.000Z", + "created_time": "2023-07-02T08:40:00.000Z", + "last_edited_time": "2023-07-02T08:40:00.000Z", "created_by": { "object": "user", "id": "5146391e-8b65-47f2-83b6-2bfe81194f32" @@ -292,13 +354,13 @@ "has_children": false, "archived": false, "in_trash": false, - "type": "heading_2", - "heading_2": { + "type": "paragraph", + "paragraph": { "rich_text": [ { "type": "text", "text": { - "content": "사용법", + "content": "DND는 개발자와 디자이너라면 누구나 참여할 수 있는 IT비영리단체이다.", "link": null }, "annotations": { @@ -309,23 +371,22 @@ "code": false, "color": "default" }, - "plain_text": "사용법", + "plain_text": "DND는 개발자와 디자이너라면 누구나 참여할 수 있는 IT비영리단체이다.", "href": null } ], - "is_toggleable": false, "color": "default" } }, { "object": "block", - "id": "17fbaaa0-e82c-476b-8d54-b1e8b917a4c5", + "id": "d2623c06-4075-4e17-badc-ab4dba60b5f1", "parent": { "type": "page_id", - "page_id": "56874170-f8d4-4bcc-996e-be4e43f67930" + "page_id": "b7170562-1e0d-4f8b-ae2a-65cb2715757e" }, - "created_time": "2023-11-30T02:19:00.000Z", - "last_edited_time": "2023-12-05T05:13:00.000Z", + "created_time": "2023-07-02T08:40:00.000Z", + "last_edited_time": "2023-07-02T08:40:00.000Z", "created_by": { "object": "user", "id": "5146391e-8b65-47f2-83b6-2bfe81194f32" @@ -334,16 +395,16 @@ "object": "user", "id": "5146391e-8b65-47f2-83b6-2bfe81194f32" }, - "has_children": true, + "has_children": false, "archived": false, "in_trash": false, - "type": "numbered_list_item", - "numbered_list_item": { + "type": "paragraph", + "paragraph": { "rich_text": [ { "type": "text", "text": { - "content": "Context를 생성하고 export한다.", + "content": "내가 지원한 4기는 면접은 따로 없었고 서류로만 최종 합격을 받을 수 있었다.", "link": null }, "annotations": { @@ -354,68 +415,22 @@ "code": false, "color": "default" }, - "plain_text": "Context를 생성하고 export한다.", + "plain_text": "내가 지원한 4기는 면접은 따로 없었고 서류로만 최종 합격을 받을 수 있었다.", "href": null } ], "color": "default" - }, - "children": [ - { - "object": "block", - "id": "54b83f83-7eac-4585-a5f5-112cbb8735e9", - "parent": { - "type": "block_id", - "block_id": "17fbaaa0-e82c-476b-8d54-b1e8b917a4c5" - }, - "created_time": "2023-12-01T11:47:00.000Z", - "last_edited_time": "2023-12-05T05:13:00.000Z", - "created_by": { - "object": "user", - "id": "5146391e-8b65-47f2-83b6-2bfe81194f32" - }, - "last_edited_by": { - "object": "user", - "id": "5146391e-8b65-47f2-83b6-2bfe81194f32" - }, - "has_children": false, - "archived": false, - "in_trash": false, - "type": "paragraph", - "paragraph": { - "rich_text": [ - { - "type": "text", - "text": { - "content": "export const MyContext = createContext(defaultValue)", - "link": null - }, - "annotations": { - "bold": false, - "italic": false, - "strikethrough": false, - "underline": false, - "code": true, - "color": "default" - }, - "plain_text": "export const MyContext = createContext(defaultValue)", - "href": null - } - ], - "color": "default" - } - } - ] + } }, { "object": "block", - "id": "9ced63c1-83cb-46ee-9e23-a28dd142ade3", + "id": "7203ea90-c2f7-42c6-8313-542a5395c0fc", "parent": { "type": "page_id", - "page_id": "56874170-f8d4-4bcc-996e-be4e43f67930" + "page_id": "b7170562-1e0d-4f8b-ae2a-65cb2715757e" }, - "created_time": "2023-11-30T02:21:00.000Z", - "last_edited_time": "2023-11-30T02:22:00.000Z", + "created_time": "2023-07-02T08:40:00.000Z", + "last_edited_time": "2023-07-02T08:40:00.000Z", "created_by": { "object": "user", "id": "5146391e-8b65-47f2-83b6-2bfe81194f32" @@ -427,47 +442,13 @@ "has_children": false, "archived": false, "in_trash": false, - "type": "numbered_list_item", - "numbered_list_item": { + "type": "paragraph", + "paragraph": { "rich_text": [ { "type": "text", "text": { - "content": "자식 컴포넌트에 ", - "link": null - }, - "annotations": { - "bold": false, - "italic": false, - "strikethrough": false, - "underline": false, - "code": false, - "color": "default" - }, - "plain_text": "자식 컴포넌트에 ", - "href": null - }, - { - "type": "text", - "text": { - "content": "useContext(MyContext)", - "link": null - }, - "annotations": { - "bold": false, - "italic": false, - "strikethrough": false, - "underline": false, - "code": true, - "color": "default" - }, - "plain_text": "useContext(MyContext)", - "href": null - }, - { - "type": "text", - "text": { - "content": " 훅을 전달한다.", + "content": "대학 시절에는 아는 친구들로만 팀을 구성해서 프로젝트를 한 것이 대부분이라 처음으로 모르는 분들과 프로젝트를 진행해볼 수 있는 경험을 쌓을 수 있었다.", "link": null }, "annotations": { @@ -478,7 +459,7 @@ "code": false, "color": "default" }, - "plain_text": " 훅을 전달한다.", + "plain_text": "대학 시절에는 아는 친구들로만 팀을 구성해서 프로젝트를 한 것이 대부분이라 처음으로 모르는 분들과 프로젝트를 진행해볼 수 있는 경험을 쌓을 수 있었다.", "href": null } ], @@ -487,13 +468,13 @@ }, { "object": "block", - "id": "0fc8c66c-99f9-4214-b00e-5ce8688a31a3", + "id": "2cb7cbe0-2d82-4cdb-914c-0b5fd795a603", "parent": { "type": "page_id", - "page_id": "56874170-f8d4-4bcc-996e-be4e43f67930" + "page_id": "b7170562-1e0d-4f8b-ae2a-65cb2715757e" }, - "created_time": "2023-11-30T02:22:00.000Z", - "last_edited_time": "2023-11-30T02:23:00.000Z", + "created_time": "2023-07-02T08:40:00.000Z", + "last_edited_time": "2023-07-02T08:40:00.000Z", "created_by": { "object": "user", "id": "5146391e-8b65-47f2-83b6-2bfe81194f32" @@ -505,81 +486,13 @@ "has_children": false, "archived": false, "in_trash": false, - "type": "numbered_list_item", - "numbered_list_item": { + "type": "paragraph", + "paragraph": { "rich_text": [ { "type": "text", "text": { - "content": "부모 컴포넌트에서 ", - "link": null - }, - "annotations": { - "bold": false, - "italic": false, - "strikethrough": false, - "underline": false, - "code": false, - "color": "default" - }, - "plain_text": "부모 컴포넌트에서 ", - "href": null - }, - { - "type": "text", - "text": { - "content": "children", - "link": null - }, - "annotations": { - "bold": false, - "italic": false, - "strikethrough": false, - "underline": false, - "code": true, - "color": "default" - }, - "plain_text": "children", - "href": null - }, - { - "type": "text", - "text": { - "content": " 을 ", - "link": null - }, - "annotations": { - "bold": false, - "italic": false, - "strikethrough": false, - "underline": false, - "code": false, - "color": "default" - }, - "plain_text": " 을 ", - "href": null - }, - { - "type": "text", - "text": { - "content": "", - "link": null - }, - "annotations": { - "bold": false, - "italic": false, - "strikethrough": false, - "underline": false, - "code": true, - "color": "default" - }, - "plain_text": "", - "href": null - }, - { - "type": "text", - "text": { - "content": " 로 감싼다.", + "content": "또한 비대면으로 매주 저녁에 화상회의로 프로젝트를 진행했다.", "link": null }, "annotations": { @@ -590,7 +503,7 @@ "code": false, "color": "default" }, - "plain_text": " 로 감싼다.", + "plain_text": "또한 비대면으로 매주 저녁에 화상회의로 프로젝트를 진행했다.", "href": null } ], @@ -599,13 +512,13 @@ }, { "object": "block", - "id": "39e3e989-0d8c-4287-aa31-ada7fddbc47e", + "id": "736c513a-b38c-4874-a588-46cb8c827158", "parent": { "type": "page_id", - "page_id": "56874170-f8d4-4bcc-996e-be4e43f67930" + "page_id": "b7170562-1e0d-4f8b-ae2a-65cb2715757e" }, - "created_time": "2023-11-30T05:26:00.000Z", - "last_edited_time": "2023-11-30T07:13:00.000Z", + "created_time": "2023-07-02T08:40:00.000Z", + "last_edited_time": "2023-07-02T08:40:00.000Z", "created_by": { "object": "user", "id": "5146391e-8b65-47f2-83b6-2bfe81194f32" @@ -617,13 +530,13 @@ "has_children": false, "archived": false, "in_trash": false, - "type": "heading_2", - "heading_2": { + "type": "paragraph", + "paragraph": { "rich_text": [ { "type": "text", "text": { - "content": "예시", + "content": "당시에는 프론트를 시작한 지 한 2개월도 채 되지 않았다.", "link": null }, "annotations": { @@ -634,49 +547,22 @@ "code": false, "color": "default" }, - "plain_text": "예시", + "plain_text": "당시에는 프론트를 시작한 지 한 2개월도 채 되지 않았다.", "href": null } ], - "is_toggleable": false, "color": "default" } }, { "object": "block", - "id": "daac85e7-8528-40ae-96c2-501a556f91d0", - "parent": { - "type": "page_id", - "page_id": "56874170-f8d4-4bcc-996e-be4e43f67930" - }, - "created_time": "2023-11-30T04:58:00.000Z", - "last_edited_time": "2023-12-02T07:08:00.000Z", - "created_by": { - "object": "user", - "id": "5146391e-8b65-47f2-83b6-2bfe81194f32" - }, - "last_edited_by": { - "object": "user", - "id": "5146391e-8b65-47f2-83b6-2bfe81194f32" - }, - "has_children": false, - "archived": false, - "in_trash": false, - "type": "embed", - "embed": { - "caption": [], - "url": "https://codesandbox.io/embed/yww5jw?view=Editor+%2B+Preview&module=%2Fsrc%2FApp.js&hidenavigation=1&expanddevtools=1" - } - }, - { - "object": "block", - "id": "5bf62c7f-10c6-4e7d-8972-1c7f24db31c5", + "id": "486cfd4a-7532-4509-bbda-486e92337c9f", "parent": { "type": "page_id", - "page_id": "56874170-f8d4-4bcc-996e-be4e43f67930" + "page_id": "b7170562-1e0d-4f8b-ae2a-65cb2715757e" }, - "created_time": "2023-11-30T03:30:00.000Z", - "last_edited_time": "2023-11-30T07:13:00.000Z", + "created_time": "2023-07-02T08:40:00.000Z", + "last_edited_time": "2023-07-02T08:40:00.000Z", "created_by": { "object": "user", "id": "5146391e-8b65-47f2-83b6-2bfe81194f32" @@ -688,40 +574,39 @@ "has_children": false, "archived": false, "in_trash": false, - "type": "heading_3", - "heading_3": { + "type": "paragraph", + "paragraph": { "rich_text": [ { "type": "text", "text": { - "content": "전체 코드", + "content": "또한 프론트 엔지니어로 참가해서 진행한 프로젝트이고, 디자이너와 협업을 한 것도 처음이다.", "link": null }, "annotations": { - "bold": true, + "bold": false, "italic": false, "strikethrough": false, "underline": false, "code": false, "color": "default" }, - "plain_text": "전체 코드", + "plain_text": "또한 프론트 엔지니어로 참가해서 진행한 프로젝트이고, 디자이너와 협업을 한 것도 처음이다.", "href": null } ], - "is_toggleable": false, "color": "default" } }, { "object": "block", - "id": "4cb55a7e-482d-42f8-9e29-95f28da9bf15", + "id": "0e2980fa-3fff-444b-9f07-71e82d536da5", "parent": { "type": "page_id", - "page_id": "56874170-f8d4-4bcc-996e-be4e43f67930" + "page_id": "b7170562-1e0d-4f8b-ae2a-65cb2715757e" }, - "created_time": "2023-09-11T11:30:00.000Z", - "last_edited_time": "2023-11-30T06:17:00.000Z", + "created_time": "2023-07-02T08:40:00.000Z", + "last_edited_time": "2023-07-02T08:40:00.000Z", "created_by": { "object": "user", "id": "5146391e-8b65-47f2-83b6-2bfe81194f32" @@ -733,14 +618,13 @@ "has_children": false, "archived": false, "in_trash": false, - "type": "code", - "code": { - "caption": [], + "type": "paragraph", + "paragraph": { "rich_text": [ { "type": "text", "text": { - "content": "// context.js\nimport { createContext, useContext, useMemo, useState } from \"react\";\n\nconst initialState = {\n name: \"binary\",\n};\n\nconst MyContext = createContext(null);\n\nexport const MyProvider = ({ children }) => {\n const [state, setState] = useState(initialState);\n\n const value = useMemo(() => ({ state, setState }), [state, setState]);\n\n return {children};\n};\n\nexport const useMyContext = () => {\n const context = useContext(MyContext);\n if (context === null) {\n throw new Error();\n }\n return context;\n};", + "content": "지금 코드를 보면 부족한 점도 많지만, 프로젝트를 진행하며 자신감도 많이 얻을 수 있었고 전 직장에서 활용한 AWS로 배포도 해볼 수 있었다.", "link": null }, "annotations": { @@ -751,22 +635,22 @@ "code": false, "color": "default" }, - "plain_text": "// context.js\nimport { createContext, useContext, useMemo, useState } from \"react\";\n\nconst initialState = {\n name: \"binary\",\n};\n\nconst MyContext = createContext(null);\n\nexport const MyProvider = ({ children }) => {\n const [state, setState] = useState(initialState);\n\n const value = useMemo(() => ({ state, setState }), [state, setState]);\n\n return {children};\n};\n\nexport const useMyContext = () => {\n const context = useContext(MyContext);\n if (context === null) {\n throw new Error();\n }\n return context;\n};", + "plain_text": "지금 코드를 보면 부족한 점도 많지만, 프로젝트를 진행하며 자신감도 많이 얻을 수 있었고 전 직장에서 활용한 AWS로 배포도 해볼 수 있었다.", "href": null } ], - "language": "typescript" + "color": "default" } }, { "object": "block", - "id": "a506d9cc-3c89-4c88-ab0e-f7958ad510f7", + "id": "7abfb316-12e7-4810-9d0f-45ed440af60b", "parent": { "type": "page_id", - "page_id": "56874170-f8d4-4bcc-996e-be4e43f67930" + "page_id": "b7170562-1e0d-4f8b-ae2a-65cb2715757e" }, - "created_time": "2023-11-30T02:24:00.000Z", - "last_edited_time": "2023-11-30T06:17:00.000Z", + "created_time": "2023-07-04T08:13:00.000Z", + "last_edited_time": "2023-07-04T08:13:00.000Z", "created_by": { "object": "user", "id": "5146391e-8b65-47f2-83b6-2bfe81194f32" @@ -778,40 +662,30 @@ "has_children": false, "archived": false, "in_trash": false, - "type": "code", - "code": { + "type": "image", + "image": { "caption": [], - "rich_text": [ - { - "type": "text", - "text": { - "content": "// App.js\nimport { useState } from \"react\";\nimport { MyProvider, useMyContext } from \"./context\";\n\nexport default function App() {\n const [count, setCount] = useState(0);\n\n return (\n
\n \n \n \n\n \n
\n );\n}\n\nconst MyComponent = () => {\n console.log(\"MyComponent render\");\n const { state } = useMyContext();\n\n return (\n
\n

name : {state.name}

\n
\n );\n};", - "link": null - }, - "annotations": { - "bold": false, - "italic": false, - "strikethrough": false, - "underline": false, - "code": false, - "color": "default" - }, - "plain_text": "// App.js\nimport { useState } from \"react\";\nimport { MyProvider, useMyContext } from \"./context\";\n\nexport default function App() {\n const [count, setCount] = useState(0);\n\n return (\n
\n \n \n \n\n \n
\n );\n}\n\nconst MyComponent = () => {\n console.log(\"MyComponent render\");\n const { state } = useMyContext();\n\n return (\n
\n

name : {state.name}

\n
\n );\n};", - "href": null - } - ], - "language": "typescript" + "type": "file", + "file": { + "url": "https://www.notion.so/image/https%3A%2F%2Fprod-files-secure.s3.us-west-2.amazonaws.com%2Fcd7314a5-d906-43b0-81e7-42eff82c02a3%2Ff53fcb3a-8881-4f95-9c1e-b3fff1ec80fa%2Fzzomssa_1.png?table=block&id=7abfb316-12e7-4810-9d0f-45ed440af60b&cache=v2", + "expiry_time": "2025-06-04T13:30:24.051Z" + }, + "format": { + "block_width": 2192, + "block_height": 1218, + "block_aspect_ratio": 1.799671592775041 + } } }, { "object": "block", - "id": "8bbdd5ee-9eab-4903-a849-9e88a7e18e13", + "id": "2604456c-773f-47d9-9751-f553b0d95989", "parent": { "type": "page_id", - "page_id": "56874170-f8d4-4bcc-996e-be4e43f67930" + "page_id": "b7170562-1e0d-4f8b-ae2a-65cb2715757e" }, - "created_time": "2023-09-24T08:11:00.000Z", - "last_edited_time": "2023-12-01T11:50:00.000Z", + "created_time": "2023-07-02T08:40:00.000Z", + "last_edited_time": "2023-07-02T08:40:00.000Z", "created_by": { "object": "user", "id": "5146391e-8b65-47f2-83b6-2bfe81194f32" @@ -829,7 +703,7 @@ { "type": "text", "text": { - "content": "위 코드에서 버튼을 누르면 ", + "content": "이커머스 쇼핑몰은 기획전을 통해 상품을 싸게 판다. ", "link": null }, "annotations": { @@ -840,30 +714,32 @@ "code": false, "color": "default" }, - "plain_text": "위 코드에서 버튼을 누르면 ", + "plain_text": "이커머스 쇼핑몰은 기획전을 통해 상품을 싸게 판다. ", "href": null }, { "type": "text", "text": { - "content": "App", - "link": null + "content": "관련 링크", + "link": { + "url": "https://dnd.ac/project/16" + } }, "annotations": { "bold": false, "italic": false, "strikethrough": false, "underline": false, - "code": true, + "code": false, "color": "default" }, - "plain_text": "App", - "href": null + "plain_text": "관련 링크", + "href": "https://dnd.ac/project/16" }, { "type": "text", "text": { - "content": " 컴포넌트가 리렌더링되는 것이기 때문에 당연히 자식 컴포넌트인\n", + "content": "", "link": null }, "annotations": { @@ -874,13 +750,40 @@ "code": false, "color": "default" }, - "plain_text": " 컴포넌트가 리렌더링되는 것이기 때문에 당연히 자식 컴포넌트인\n", + "plain_text": "", "href": null - }, + } + ], + "color": "default" + } + }, + { + "object": "block", + "id": "e0aefc69-b4d7-441e-84b8-8601a3199170", + "parent": { + "type": "page_id", + "page_id": "b7170562-1e0d-4f8b-ae2a-65cb2715757e" + }, + "created_time": "2023-07-02T08:40:00.000Z", + "last_edited_time": "2023-07-02T08:40:00.000Z", + "created_by": { + "object": "user", + "id": "5146391e-8b65-47f2-83b6-2bfe81194f32" + }, + "last_edited_by": { + "object": "user", + "id": "5146391e-8b65-47f2-83b6-2bfe81194f32" + }, + "has_children": false, + "archived": false, + "in_trash": false, + "type": "paragraph", + "paragraph": { + "rich_text": [ { "type": "text", "text": { - "content": "MyProvider", + "content": "여러 개의 쇼핑몰을 크롤링해 하나의 사이트에서 보여주자!라는 취지로 만든 프로젝트 ", "link": null }, "annotations": { @@ -888,33 +791,33 @@ "italic": false, "strikethrough": false, "underline": false, - "code": true, + "code": false, "color": "default" }, - "plain_text": "MyProvider", + "plain_text": "여러 개의 쇼핑몰을 크롤링해 하나의 사이트에서 보여주자!라는 취지로 만든 프로젝트 ", "href": null }, { "type": "text", "text": { - "content": " , ", + "content": "쫌싸", "link": null }, "annotations": { - "bold": false, + "bold": true, "italic": false, "strikethrough": false, "underline": false, "code": false, "color": "default" }, - "plain_text": " , ", + "plain_text": "쫌싸", "href": null }, { "type": "text", "text": { - "content": "MyComponent", + "content": "이다.", "link": null }, "annotations": { @@ -922,27 +825,10 @@ "italic": false, "strikethrough": false, "underline": false, - "code": true, + "code": false, "color": "default" }, - "plain_text": "MyComponent", - "href": null - }, - { - "type": "text", - "text": { - "content": " 가 리렌더링된다. ", - "link": null - }, - "annotations": { - "bold": false, - "italic": false, - "strikethrough": false, - "underline": false, - "code": false, - "color": "default" - }, - "plain_text": " 가 리렌더링된다. ", + "plain_text": "이다.", "href": null } ], @@ -951,13 +837,13 @@ }, { "object": "block", - "id": "13876262-cc6b-4cdf-8336-2c0fe7757632", + "id": "6d8b3b91-5875-4b96-861f-8bdb52a6bef2", "parent": { "type": "page_id", - "page_id": "56874170-f8d4-4bcc-996e-be4e43f67930" + "page_id": "b7170562-1e0d-4f8b-ae2a-65cb2715757e" }, - "created_time": "2023-11-30T03:21:00.000Z", - "last_edited_time": "2023-12-01T11:50:00.000Z", + "created_time": "2023-07-02T08:40:00.000Z", + "last_edited_time": "2023-07-02T08:40:00.000Z", "created_by": { "object": "user", "id": "5146391e-8b65-47f2-83b6-2bfe81194f32" @@ -975,41 +861,7 @@ { "type": "text", "text": { - "content": "이를 해결하려면 ", - "link": null - }, - "annotations": { - "bold": false, - "italic": false, - "strikethrough": false, - "underline": false, - "code": false, - "color": "default" - }, - "plain_text": "이를 해결하려면 ", - "href": null - }, - { - "type": "text", - "text": { - "content": "MyComponent", - "link": null - }, - "annotations": { - "bold": false, - "italic": false, - "strikethrough": false, - "underline": false, - "code": true, - "color": "default" - }, - "plain_text": "MyComponent", - "href": null - }, - { - "type": "text", - "text": { - "content": " 를 메모이제이션 해주면 될 것 같다!\n", + "content": "좋은 사람들과 프로젝트에 대해 고민하며 디자이너의 생각, 백엔드의 생각에 대해 알 수 있는 아주 좋은 경험이었다.", "link": null }, "annotations": { @@ -1020,24 +872,7 @@ "code": false, "color": "default" }, - "plain_text": " 를 메모이제이션 해주면 될 것 같다!\n", - "href": null - }, - { - "type": "text", - "text": { - "content": "const MyMemoComponent = memo(MyComponent);", - "link": null - }, - "annotations": { - "bold": false, - "italic": false, - "strikethrough": false, - "underline": false, - "code": true, - "color": "default" - }, - "plain_text": "const MyMemoComponent = memo(MyComponent);", + "plain_text": "좋은 사람들과 프로젝트에 대해 고민하며 디자이너의 생각, 백엔드의 생각에 대해 알 수 있는 아주 좋은 경험이었다.", "href": null } ], @@ -1046,13 +881,13 @@ }, { "object": "block", - "id": "570da78c-fb2d-49e1-b019-ee2a4dfb4314", + "id": "9a6dbb69-6818-4b6b-ab8b-13d9ddb99bc9", "parent": { "type": "page_id", - "page_id": "56874170-f8d4-4bcc-996e-be4e43f67930" + "page_id": "b7170562-1e0d-4f8b-ae2a-65cb2715757e" }, - "created_time": "2023-11-30T03:34:00.000Z", - "last_edited_time": "2023-12-01T11:53:00.000Z", + "created_time": "2023-07-02T08:40:00.000Z", + "last_edited_time": "2023-07-02T08:40:00.000Z", "created_by": { "object": "user", "id": "5146391e-8b65-47f2-83b6-2bfe81194f32" @@ -1070,7 +905,7 @@ { "type": "text", "text": { - "content": "위 코드에서 이제 이름을 바꿀 수 있는 컴포넌트를 만들어 보자!", + "content": "다음으로는 회사에서 주최하는 양성 프로그램에 지원해보기로 했다.", "link": null }, "annotations": { @@ -1081,7 +916,7 @@ "code": false, "color": "default" }, - "plain_text": "위 코드에서 이제 이름을 바꿀 수 있는 컴포넌트를 만들어 보자!", + "plain_text": "다음으로는 회사에서 주최하는 양성 프로그램에 지원해보기로 했다.", "href": null } ], @@ -1090,13 +925,13 @@ }, { "object": "block", - "id": "45b31d11-c961-4ab5-9fe0-56a1f9ae48a4", + "id": "a62bc6fd-4ed0-410a-8dd9-16ba1ade58a8", "parent": { "type": "page_id", - "page_id": "56874170-f8d4-4bcc-996e-be4e43f67930" + "page_id": "b7170562-1e0d-4f8b-ae2a-65cb2715757e" }, - "created_time": "2023-11-30T03:34:00.000Z", - "last_edited_time": "2023-11-30T06:17:00.000Z", + "created_time": "2023-07-02T08:40:00.000Z", + "last_edited_time": "2023-07-02T08:40:00.000Z", "created_by": { "object": "user", "id": "5146391e-8b65-47f2-83b6-2bfe81194f32" @@ -1108,14 +943,13 @@ "has_children": false, "archived": false, "in_trash": false, - "type": "code", - "code": { - "caption": [], + "type": "paragraph", + "paragraph": { "rich_text": [ { "type": "text", "text": { - "content": "const NameChangeComponent = () => {\n console.log(\"NameChangeComponent render\");\n const { setState } = useMyContext();\n\n return (\n
\n \n
\n );\n};", + "content": "여러군데를 찾아보고 지원하였고 결국 빗썸 테크 아카데미를 하기로 했다.", "link": null }, "annotations": { @@ -1126,22 +960,83 @@ "code": false, "color": "default" }, - "plain_text": "const NameChangeComponent = () => {\n console.log(\"NameChangeComponent render\");\n const { setState } = useMyContext();\n\n return (\n
\n \n
\n );\n};", + "plain_text": "여러군데를 찾아보고 지원하였고 결국 빗썸 테크 아카데미를 하기로 했다.", "href": null } ], - "language": "typescript" + "color": "default" + } + }, + { + "object": "block", + "id": "786c28f5-9df1-4697-ba73-c89718d61baf", + "parent": { + "type": "page_id", + "page_id": "b7170562-1e0d-4f8b-ae2a-65cb2715757e" + }, + "created_time": "2023-07-06T13:16:00.000Z", + "last_edited_time": "2023-07-06T13:16:00.000Z", + "created_by": { + "object": "user", + "id": "5146391e-8b65-47f2-83b6-2bfe81194f32" + }, + "last_edited_by": { + "object": "user", + "id": "5146391e-8b65-47f2-83b6-2bfe81194f32" + }, + "has_children": false, + "archived": false, + "in_trash": false, + "type": "paragraph", + "paragraph": { + "rich_text": [], + "color": "default" + } + }, + { + "object": "block", + "id": "6c4ad75b-5b02-4b54-bcd5-da4f88263b81", + "parent": { + "type": "page_id", + "page_id": "b7170562-1e0d-4f8b-ae2a-65cb2715757e" + }, + "created_time": "2023-07-04T08:13:00.000Z", + "last_edited_time": "2023-07-04T08:15:00.000Z", + "created_by": { + "object": "user", + "id": "5146391e-8b65-47f2-83b6-2bfe81194f32" + }, + "last_edited_by": { + "object": "user", + "id": "5146391e-8b65-47f2-83b6-2bfe81194f32" + }, + "has_children": false, + "archived": false, + "in_trash": false, + "type": "image", + "image": { + "caption": [], + "type": "file", + "file": { + "url": "https://www.notion.so/image/https%3A%2F%2Fprod-files-secure.s3.us-west-2.amazonaws.com%2Fcd7314a5-d906-43b0-81e7-42eff82c02a3%2Fd5d3e4af-503c-42f5-8118-c493d3bae6ae%2Fbithumb.png?table=block&id=6c4ad75b-5b02-4b54-bcd5-da4f88263b81&cache=v2", + "expiry_time": "2025-06-04T13:30:24.024Z" + }, + "format": { + "block_width": 1490, + "block_height": 688, + "block_aspect_ratio": 2.1656976744186047 + } } }, { "object": "block", - "id": "7b7407a7-3f33-485a-97d3-e51eadd99d2f", + "id": "fac8faf0-1f93-4951-87c9-fb7a7c518ab7", "parent": { "type": "page_id", - "page_id": "56874170-f8d4-4bcc-996e-be4e43f67930" + "page_id": "b7170562-1e0d-4f8b-ae2a-65cb2715757e" }, - "created_time": "2023-11-30T04:46:00.000Z", - "last_edited_time": "2023-11-30T04:54:00.000Z", + "created_time": "2023-07-02T08:40:00.000Z", + "last_edited_time": "2023-07-02T08:40:00.000Z", "created_by": { "object": "user", "id": "5146391e-8b65-47f2-83b6-2bfe81194f32" @@ -1159,109 +1054,7 @@ { "type": "text", "text": { - "content": "위 컴포넌트를 ", - "link": null - }, - "annotations": { - "bold": false, - "italic": false, - "strikethrough": false, - "underline": false, - "code": false, - "color": "default" - }, - "plain_text": "위 컴포넌트를 ", - "href": null - }, - { - "type": "text", - "text": { - "content": "MyProvider", - "link": null - }, - "annotations": { - "bold": false, - "italic": false, - "strikethrough": false, - "underline": false, - "code": true, - "color": "default" - }, - "plain_text": "MyProvider", - "href": null - }, - { - "type": "text", - "text": { - "content": " 하위로 추가하고 Change Name 버튼을 클릭하면 ", - "link": null - }, - "annotations": { - "bold": false, - "italic": false, - "strikethrough": false, - "underline": false, - "code": false, - "color": "default" - }, - "plain_text": " 하위로 추가하고 Change Name 버튼을 클릭하면 ", - "href": null - }, - { - "type": "text", - "text": { - "content": "NameChangeComponent", - "link": null - }, - "annotations": { - "bold": false, - "italic": false, - "strikethrough": false, - "underline": false, - "code": true, - "color": "default" - }, - "plain_text": "NameChangeComponent", - "href": null - }, - { - "type": "text", - "text": { - "content": " , ", - "link": null - }, - "annotations": { - "bold": false, - "italic": false, - "strikethrough": false, - "underline": false, - "code": false, - "color": "default" - }, - "plain_text": " , ", - "href": null - }, - { - "type": "text", - "text": { - "content": "MyComponent", - "link": null - }, - "annotations": { - "bold": false, - "italic": false, - "strikethrough": false, - "underline": false, - "code": true, - "color": "default" - }, - "plain_text": "MyComponent", - "href": null - }, - { - "type": "text", - "text": { - "content": " 둘 다 리렌더가 일어나는 것을 확인할 수 있다.", + "content": "4주 동안 프론트엔드 강사님이 수업해주시고 3주 동안 팀을 이루어 프로젝트를 진행하는 방식이었다.", "link": null }, "annotations": { @@ -1272,7 +1065,7 @@ "code": false, "color": "default" }, - "plain_text": " 둘 다 리렌더가 일어나는 것을 확인할 수 있다.", + "plain_text": "4주 동안 프론트엔드 강사님이 수업해주시고 3주 동안 팀을 이루어 프로젝트를 진행하는 방식이었다.", "href": null } ], @@ -1281,13 +1074,13 @@ }, { "object": "block", - "id": "a6316958-3c64-47e2-8b8c-caa95fa73ab6", + "id": "e43241c2-44ba-4410-a33b-1bc63e506e80", "parent": { "type": "page_id", - "page_id": "56874170-f8d4-4bcc-996e-be4e43f67930" + "page_id": "b7170562-1e0d-4f8b-ae2a-65cb2715757e" }, - "created_time": "2023-11-30T06:18:00.000Z", - "last_edited_time": "2023-11-30T07:13:00.000Z", + "created_time": "2023-07-04T08:13:00.000Z", + "last_edited_time": "2023-07-06T13:16:00.000Z", "created_by": { "object": "user", "id": "5146391e-8b65-47f2-83b6-2bfe81194f32" @@ -1299,13 +1092,83 @@ "has_children": false, "archived": false, "in_trash": false, - "type": "heading_2", - "heading_2": { + "type": "image", + "image": { + "caption": [], + "type": "file", + "file": { + "url": "https://www.notion.so/image/https%3A%2F%2Fprod-files-secure.s3.us-west-2.amazonaws.com%2Fcd7314a5-d906-43b0-81e7-42eff82c02a3%2F93966659-5fd2-4029-bf61-f51ffce457c4%2Fclone_coin1.png?table=block&id=e43241c2-44ba-4410-a33b-1bc63e506e80&cache=v2", + "expiry_time": "2025-06-04T13:30:24.012Z" + }, + "format": { + "block_width": 1628, + "block_height": 892, + "block_aspect_ratio": 1.8251121076233183 + } + } + }, + { + "object": "block", + "id": "c4fc97b7-c42d-48d4-904e-33961436b946", + "parent": { + "type": "page_id", + "page_id": "b7170562-1e0d-4f8b-ae2a-65cb2715757e" + }, + "created_time": "2023-07-04T08:14:00.000Z", + "last_edited_time": "2023-07-06T13:16:00.000Z", + "created_by": { + "object": "user", + "id": "5146391e-8b65-47f2-83b6-2bfe81194f32" + }, + "last_edited_by": { + "object": "user", + "id": "5146391e-8b65-47f2-83b6-2bfe81194f32" + }, + "has_children": false, + "archived": false, + "in_trash": false, + "type": "image", + "image": { + "caption": [], + "type": "file", + "file": { + "url": "https://www.notion.so/image/https%3A%2F%2Fprod-files-secure.s3.us-west-2.amazonaws.com%2Fcd7314a5-d906-43b0-81e7-42eff82c02a3%2Fc04ed1d3-a82c-4aaa-b239-fd2d69aeefe6%2Fclone_coin2.png?table=block&id=c4fc97b7-c42d-48d4-904e-33961436b946&cache=v2", + "expiry_time": "2025-06-04T13:30:24.055Z" + }, + "format": { + "block_width": 1608, + "block_height": 882, + "block_aspect_ratio": 1.8231292517006803 + } + } + }, + { + "object": "block", + "id": "1814e6c1-3834-46eb-9e3d-8aec782614f6", + "parent": { + "type": "page_id", + "page_id": "b7170562-1e0d-4f8b-ae2a-65cb2715757e" + }, + "created_time": "2023-07-02T08:40:00.000Z", + "last_edited_time": "2023-07-02T08:40:00.000Z", + "created_by": { + "object": "user", + "id": "5146391e-8b65-47f2-83b6-2bfe81194f32" + }, + "last_edited_by": { + "object": "user", + "id": "5146391e-8b65-47f2-83b6-2bfe81194f32" + }, + "has_children": false, + "archived": false, + "in_trash": false, + "type": "paragraph", + "paragraph": { "rich_text": [ { "type": "text", "text": { - "content": "문제점", + "content": "우리가 기획한 서비스는 투자 고수들의 매수, 매도를 똑같이 따라서 투자할 수 있는 Copy Trading 플랫폼이다.", "link": null }, "annotations": { @@ -1316,23 +1179,22 @@ "code": false, "color": "default" }, - "plain_text": "문제점", + "plain_text": "우리가 기획한 서비스는 투자 고수들의 매수, 매도를 똑같이 따라서 투자할 수 있는 Copy Trading 플랫폼이다.", "href": null } ], - "is_toggleable": false, "color": "default" } }, { "object": "block", - "id": "e97de952-9ce8-4e0b-a00d-1fb3785aa352", + "id": "575140ac-e527-4a76-9e64-05159a0991e3", "parent": { "type": "page_id", - "page_id": "56874170-f8d4-4bcc-996e-be4e43f67930" + "page_id": "b7170562-1e0d-4f8b-ae2a-65cb2715757e" }, - "created_time": "2023-11-30T04:54:00.000Z", - "last_edited_time": "2023-11-30T04:57:00.000Z", + "created_time": "2023-07-02T08:40:00.000Z", + "last_edited_time": "2023-07-02T08:40:00.000Z", "created_by": { "object": "user", "id": "5146391e-8b65-47f2-83b6-2bfe81194f32" @@ -1350,7 +1212,7 @@ { "type": "text", "text": { - "content": "Context value를 메모이제이션해도 ", + "content": "플랫폼 내에서 자칭 고수라고 말하는 사람들에게는 자신을 알리고 증명할 수 있는 장소이고 일반 사용자에게는 고수들의 투자를 따라 하면서 리스크를 줄일 수 있는 투자 방식을 제안한다.", "link": null }, "annotations": { @@ -1361,98 +1223,69 @@ "code": false, "color": "default" }, - "plain_text": "Context value를 메모이제이션해도 ", + "plain_text": "플랫폼 내에서 자칭 고수라고 말하는 사람들에게는 자신을 알리고 증명할 수 있는 장소이고 일반 사용자에게는 고수들의 투자를 따라 하면서 리스크를 줄일 수 있는 투자 방식을 제안한다.", "href": null - }, - { - "type": "text", - "text": { - "content": "state", - "link": null - }, - "annotations": { - "bold": false, - "italic": false, - "strikethrough": false, - "underline": false, - "code": true, - "color": "default" - }, - "plain_text": "state", - "href": null - }, - { - "type": "text", - "text": { - "content": " 또는 ", - "link": null - }, - "annotations": { - "bold": false, - "italic": false, - "strikethrough": false, - "underline": false, - "code": false, - "color": "default" - }, - "plain_text": " 또는 ", - "href": null - }, - { - "type": "text", - "text": { - "content": "setState", - "link": null - }, - "annotations": { - "bold": false, - "italic": false, - "strikethrough": false, - "underline": false, - "code": true, - "color": "default" - }, - "plain_text": "setState", - "href": null - }, - { - "type": "text", - "text": { - "content": " 가 변경되면 value의 Reference 값이 바뀌기 때문에 ", - "link": null - }, - "annotations": { - "bold": false, - "italic": false, - "strikethrough": false, - "underline": false, - "code": false, - "color": "default" - }, - "plain_text": " 가 변경되면 value의 Reference 값이 바뀌기 때문에 ", - "href": null - }, - { - "type": "text", - "text": { - "content": "useMyContext", - "link": null - }, - "annotations": { - "bold": false, - "italic": false, - "strikethrough": false, - "underline": false, - "code": true, - "color": "default" - }, - "plain_text": "useMyContext", - "href": null - }, + } + ], + "color": "default" + } + }, + { + "object": "block", + "id": "7cf59074-e660-4c59-baf0-dab254dea6d5", + "parent": { + "type": "page_id", + "page_id": "b7170562-1e0d-4f8b-ae2a-65cb2715757e" + }, + "created_time": "2023-07-04T08:16:00.000Z", + "last_edited_time": "2023-07-04T08:16:00.000Z", + "created_by": { + "object": "user", + "id": "5146391e-8b65-47f2-83b6-2bfe81194f32" + }, + "last_edited_by": { + "object": "user", + "id": "5146391e-8b65-47f2-83b6-2bfe81194f32" + }, + "has_children": false, + "archived": false, + "in_trash": false, + "type": "video", + "video": { + "caption": [], + "type": "external", + "external": { + "url": "https://youtu.be/y3DQ_3xDilI" + } + } + }, + { + "object": "block", + "id": "9d279484-7645-4dd3-bd9e-b9ae5a643a59", + "parent": { + "type": "page_id", + "page_id": "b7170562-1e0d-4f8b-ae2a-65cb2715757e" + }, + "created_time": "2023-07-02T08:40:00.000Z", + "last_edited_time": "2023-07-02T08:40:00.000Z", + "created_by": { + "object": "user", + "id": "5146391e-8b65-47f2-83b6-2bfe81194f32" + }, + "last_edited_by": { + "object": "user", + "id": "5146391e-8b65-47f2-83b6-2bfe81194f32" + }, + "has_children": false, + "archived": false, + "in_trash": false, + "type": "paragraph", + "paragraph": { + "rich_text": [ { "type": "text", "text": { - "content": " 를 사용하는 Component는 모두 리렌더가 일어나는 것이다.", + "content": "Socket을 활용한 통신은 처리해본 경험은 없었는데 클론 코인 프로젝트에서 Socket 통신을 마음껏 활용해볼 수 있었다.", "link": null }, "annotations": { @@ -1463,7 +1296,7 @@ "code": false, "color": "default" }, - "plain_text": " 를 사용하는 Component는 모두 리렌더가 일어나는 것이다.", + "plain_text": "Socket을 활용한 통신은 처리해본 경험은 없었는데 클론 코인 프로젝트에서 Socket 통신을 마음껏 활용해볼 수 있었다.", "href": null } ], @@ -1472,13 +1305,13 @@ }, { "object": "block", - "id": "d2482a2c-f737-4792-8d13-550536a5284e", + "id": "b4c122d3-04be-40d3-8095-35af3edbecd7", "parent": { "type": "page_id", - "page_id": "56874170-f8d4-4bcc-996e-be4e43f67930" + "page_id": "b7170562-1e0d-4f8b-ae2a-65cb2715757e" }, - "created_time": "2023-11-30T05:04:00.000Z", - "last_edited_time": "2023-11-30T06:21:00.000Z", + "created_time": "2023-07-02T08:40:00.000Z", + "last_edited_time": "2023-07-02T08:40:00.000Z", "created_by": { "object": "user", "id": "5146391e-8b65-47f2-83b6-2bfe81194f32" @@ -1496,7 +1329,7 @@ { "type": "text", "text": { - "content": "리렌더를 회피하기 위해 아래처럼 Context를 분리할 수 있지만 이는 Provider Hell을 야기한다.", + "content": "팀원 중에 전 회사 분이 있었다. ㅎㅎ 역시 세상은 너무 좁다 ㅋ-ㅋ", "link": null }, "annotations": { @@ -1507,7 +1340,7 @@ "code": false, "color": "default" }, - "plain_text": "리렌더를 회피하기 위해 아래처럼 Context를 분리할 수 있지만 이는 Provider Hell을 야기한다.", + "plain_text": "팀원 중에 전 회사 분이 있었다. ㅎㅎ 역시 세상은 너무 좁다 ㅋ-ㅋ", "href": null } ], @@ -1516,13 +1349,13 @@ }, { "object": "block", - "id": "6595b98f-62fb-4a7c-bfc2-4b20ea2d9503", + "id": "c79406db-f30d-4f24-be05-6d4c8e31dfb2", "parent": { "type": "page_id", - "page_id": "56874170-f8d4-4bcc-996e-be4e43f67930" + "page_id": "b7170562-1e0d-4f8b-ae2a-65cb2715757e" }, - "created_time": "2023-11-30T05:04:00.000Z", - "last_edited_time": "2023-11-30T06:17:00.000Z", + "created_time": "2023-07-02T08:40:00.000Z", + "last_edited_time": "2023-07-02T08:40:00.000Z", "created_by": { "object": "user", "id": "5146391e-8b65-47f2-83b6-2bfe81194f32" @@ -1534,14 +1367,13 @@ "has_children": false, "archived": false, "in_trash": false, - "type": "code", - "code": { - "caption": [], + "type": "paragraph", + "paragraph": { "rich_text": [ { "type": "text", "text": { - "content": "const Provider = ({ children }) => {\n const [state, setState] = useState('a');\n \n return (\n \n \n {children}\n \n \n )\n}", + "content": "DND에서 한 프로젝트는 프론트를 이제 막 시작할 때라 내가 생각했을 때는 난이도 있는 구현을 많이 하지 못했다.", "link": null }, "annotations": { @@ -1552,22 +1384,22 @@ "code": false, "color": "default" }, - "plain_text": "const Provider = ({ children }) => {\n const [state, setState] = useState('a');\n \n return (\n \n \n {children}\n \n \n )\n}", + "plain_text": "DND에서 한 프로젝트는 프론트를 이제 막 시작할 때라 내가 생각했을 때는 난이도 있는 구현을 많이 하지 못했다.", "href": null } ], - "language": "typescript" + "color": "default" } }, { "object": "block", - "id": "b5c5c3e3-2fb4-48b0-8474-07350d397b92", + "id": "31be5869-9727-4fda-8228-afab96854e95", "parent": { "type": "page_id", - "page_id": "56874170-f8d4-4bcc-996e-be4e43f67930" + "page_id": "b7170562-1e0d-4f8b-ae2a-65cb2715757e" }, - "created_time": "2023-11-30T05:02:00.000Z", - "last_edited_time": "2023-11-30T06:20:00.000Z", + "created_time": "2023-07-02T08:40:00.000Z", + "last_edited_time": "2023-07-02T08:40:00.000Z", "created_by": { "object": "user", "id": "5146391e-8b65-47f2-83b6-2bfe81194f32" @@ -1585,7 +1417,7 @@ { "type": "text", "text": { - "content": "이러한 문제는 리액트 커뮤니티(RFC 등)에서도 활발하게 논의되고 있지만 아직 리액트에 반영되지는 않았다. (4년째..)", + "content": "프론트를 시작한 지 7개월이 조금 넘은 상태에서 빗썸 테크 아카데미를 시작해서 DND때보다는 조금 더 난이도 있는 비즈니스 로직 처리, Socket 통신 등등 그동안 공부해온 것들을 활용해보고 다시 생각할 좋은 기회였다.", "link": null }, "annotations": { @@ -1596,7 +1428,7 @@ "code": false, "color": "default" }, - "plain_text": "이러한 문제는 리액트 커뮤니티(RFC 등)에서도 활발하게 논의되고 있지만 아직 리액트에 반영되지는 않았다. (4년째..)", + "plain_text": "프론트를 시작한 지 7개월이 조금 넘은 상태에서 빗썸 테크 아카데미를 시작해서 DND때보다는 조금 더 난이도 있는 비즈니스 로직 처리, Socket 통신 등등 그동안 공부해온 것들을 활용해보고 다시 생각할 좋은 기회였다.", "href": null } ], @@ -1605,13 +1437,13 @@ }, { "object": "block", - "id": "aee09a6f-2f72-4f21-b86d-28e35c415a89", + "id": "8889028d-8ffa-45a3-b683-441e687b830a", "parent": { "type": "page_id", - "page_id": "56874170-f8d4-4bcc-996e-be4e43f67930" + "page_id": "b7170562-1e0d-4f8b-ae2a-65cb2715757e" }, - "created_time": "2023-11-30T05:02:00.000Z", - "last_edited_time": "2023-11-30T05:03:00.000Z", + "created_time": "2023-07-02T08:40:00.000Z", + "last_edited_time": "2023-07-02T08:40:00.000Z", "created_by": { "object": "user", "id": "5146391e-8b65-47f2-83b6-2bfe81194f32" @@ -1629,24 +1461,7 @@ { "type": "text", "text": { - "content": "RFC:", - "link": null - }, - "annotations": { - "bold": true, - "italic": false, - "strikethrough": false, - "underline": false, - "code": false, - "color": "default" - }, - "plain_text": "RFC:", - "href": null - }, - { - "type": "text", - "text": { - "content": " ", + "content": "맞다..! AWS 자격증도 땄다! ", "link": null }, "annotations": { @@ -1657,25 +1472,27 @@ "code": false, "color": "default" }, - "plain_text": " ", + "plain_text": "맞다..! AWS 자격증도 땄다! ", "href": null }, { "type": "text", "text": { - "content": "Context Selectors", - "link": null + "content": "링크", + "link": { + "url": "https://binary01.me/posts/AWS_Solutions_Architect_End" + } }, "annotations": { - "bold": true, + "bold": false, "italic": false, "strikethrough": false, "underline": false, "code": false, "color": "default" }, - "plain_text": "Context Selectors", - "href": null + "plain_text": "링크", + "href": "https://binary01.me/posts/AWS_Solutions_Architect_End" } ], "color": "default" @@ -1683,38 +1500,57 @@ }, { "object": "block", - "id": "2a7d38ae-5d5f-4d44-a245-03e010547d34", + "id": "4d807c7d-0092-444e-af4a-7d2e9a99d2e8", "parent": { "type": "page_id", - "page_id": "56874170-f8d4-4bcc-996e-be4e43f67930" + "page_id": "b7170562-1e0d-4f8b-ae2a-65cb2715757e" }, - "created_time": "2023-11-30T05:02:00.000Z", - "last_edited_time": "2025-04-14T14:09:00.000Z", + "created_time": "2023-07-02T08:40:00.000Z", + "last_edited_time": "2023-07-02T08:40:00.000Z", "created_by": { "object": "user", "id": "5146391e-8b65-47f2-83b6-2bfe81194f32" }, "last_edited_by": { "object": "user", - "id": "553d6fc6-e170-4227-8810-0540e2142f82" + "id": "5146391e-8b65-47f2-83b6-2bfe81194f32" }, "has_children": false, "archived": false, "in_trash": false, - "type": "link_preview", - "link_preview": { - "url": "https://github.com/reactjs/rfcs/pull/119" + "type": "paragraph", + "paragraph": { + "rich_text": [ + { + "type": "text", + "text": { + "content": "빗썸 테크 아카데미가 끝나고 회사에서는 차세대 프로젝트를 진행하고 있었다.", + "link": null + }, + "annotations": { + "bold": false, + "italic": false, + "strikethrough": false, + "underline": false, + "code": false, + "color": "default" + }, + "plain_text": "빗썸 테크 아카데미가 끝나고 회사에서는 차세대 프로젝트를 진행하고 있었다.", + "href": null + } + ], + "color": "default" } }, { "object": "block", - "id": "e3742aa9-02c3-4d77-b33f-51e7c86161d6", + "id": "b53200b5-6138-45d2-bf8c-249489874b51", "parent": { "type": "page_id", - "page_id": "56874170-f8d4-4bcc-996e-be4e43f67930" + "page_id": "b7170562-1e0d-4f8b-ae2a-65cb2715757e" }, - "created_time": "2023-11-30T06:18:00.000Z", - "last_edited_time": "2023-11-30T07:13:00.000Z", + "created_time": "2023-07-02T08:40:00.000Z", + "last_edited_time": "2023-07-02T08:40:00.000Z", "created_by": { "object": "user", "id": "5146391e-8b65-47f2-83b6-2bfe81194f32" @@ -1726,13 +1562,13 @@ "has_children": false, "archived": false, "in_trash": false, - "type": "heading_2", - "heading_2": { + "type": "paragraph", + "paragraph": { "rich_text": [ { "type": "text", "text": { - "content": "해결 방안", + "content": "프론트엔드 개발을 혼자 진행하다 보니 일의 양도 많고 어떻게 구현 해야 할까? 에 대한 고민도 많았다.", "link": null }, "annotations": { @@ -1743,23 +1579,22 @@ "code": false, "color": "default" }, - "plain_text": "해결 방안", + "plain_text": "프론트엔드 개발을 혼자 진행하다 보니 일의 양도 많고 어떻게 구현 해야 할까? 에 대한 고민도 많았다.", "href": null } ], - "is_toggleable": false, "color": "default" } }, { "object": "block", - "id": "044098f5-eeeb-40c0-9d4e-d1ad1a0985a7", + "id": "7b156205-7d78-4d84-b16b-8187d0f0589d", "parent": { "type": "page_id", - "page_id": "56874170-f8d4-4bcc-996e-be4e43f67930" + "page_id": "b7170562-1e0d-4f8b-ae2a-65cb2715757e" }, - "created_time": "2023-09-11T11:30:00.000Z", - "last_edited_time": "2023-11-30T05:53:00.000Z", + "created_time": "2023-07-02T08:40:00.000Z", + "last_edited_time": "2023-07-02T08:40:00.000Z", "created_by": { "object": "user", "id": "5146391e-8b65-47f2-83b6-2bfe81194f32" @@ -1777,24 +1612,7 @@ { "type": "text", "text": { - "content": "use-context-selector", - "link": null - }, - "annotations": { - "bold": false, - "italic": false, - "strikethrough": false, - "underline": false, - "code": true, - "color": "default" - }, - "plain_text": "use-context-selector", - "href": null - }, - { - "type": "text", - "text": { - "content": " 는 Selector를 통해 값을 가져오는 방식으로 문제를 해결한다.", + "content": "일정은 계속 다가오는데 어떻게 해야 할지도 모르는 상황에서 스트레스를 많이 받았다…", "link": null }, "annotations": { @@ -1805,7 +1623,7 @@ "code": false, "color": "default" }, - "plain_text": " 는 Selector를 통해 값을 가져오는 방식으로 문제를 해결한다.", + "plain_text": "일정은 계속 다가오는데 어떻게 해야 할지도 모르는 상황에서 스트레스를 많이 받았다…", "href": null } ], @@ -1814,13 +1632,13 @@ }, { "object": "block", - "id": "6d4f7b3f-abb4-4926-ab3a-755677ce28b7", + "id": "66dadc4f-4d73-4eaa-958f-675bd69f1391", "parent": { "type": "page_id", - "page_id": "56874170-f8d4-4bcc-996e-be4e43f67930" + "page_id": "b7170562-1e0d-4f8b-ae2a-65cb2715757e" }, - "created_time": "2023-11-30T05:27:00.000Z", - "last_edited_time": "2023-11-30T05:27:00.000Z", + "created_time": "2023-07-02T08:40:00.000Z", + "last_edited_time": "2023-07-02T08:40:00.000Z", "created_by": { "object": "user", "id": "5146391e-8b65-47f2-83b6-2bfe81194f32" @@ -1832,29 +1650,39 @@ "has_children": false, "archived": false, "in_trash": false, - "type": "bookmark", - "bookmark": { - "caption": [], - "url": "https://www.npmjs.com/package/use-context-selector", - "metadata": { - "title": "use-context-selector", - "description": "React useContextSelector hook in userland. Latest version: 2.0.0, last published: a year ago. Start using use-context-selector in your project by running `npm i use-context-selector`. There are 194 other projects in the npm registry using use-context-selector.", - "image": "https://static-production.npmjs.com/338e4905a2684ca96e08c7780fc68412.png", - "siteName": "npm", - "url": "https://www.npmjs.com/package/use-context-selector", - "favicon": "https://www.google.com/s2/favicons?domain=www.npmjs.com&sz=64" - } + "type": "paragraph", + "paragraph": { + "rich_text": [ + { + "type": "text", + "text": { + "content": "(결국 해결하긴 했다. 역시 스트레스를 받는 만큼 성장하는 것인가…)", + "link": null + }, + "annotations": { + "bold": false, + "italic": false, + "strikethrough": false, + "underline": false, + "code": false, + "color": "default" + }, + "plain_text": "(결국 해결하긴 했다. 역시 스트레스를 받는 만큼 성장하는 것인가…)", + "href": null + } + ], + "color": "default" } }, { "object": "block", - "id": "1ea38e6b-cff4-4811-9559-303b5138135e", + "id": "9fc6eb20-fea7-4dd1-bbe0-c97fed8736f7", "parent": { "type": "page_id", - "page_id": "56874170-f8d4-4bcc-996e-be4e43f67930" + "page_id": "b7170562-1e0d-4f8b-ae2a-65cb2715757e" }, - "created_time": "2023-09-11T11:30:00.000Z", - "last_edited_time": "2023-11-30T06:22:00.000Z", + "created_time": "2023-07-02T08:40:00.000Z", + "last_edited_time": "2023-07-02T08:40:00.000Z", "created_by": { "object": "user", "id": "5146391e-8b65-47f2-83b6-2bfe81194f32" @@ -1872,7 +1700,7 @@ { "type": "text", "text": { - "content": "위 라이브러리와 Context API 사용하여 문제를 해결할 수도 있지만 같은 문제를 해결할 수 있으며 더 많은 기능을 제공하는 상태 관리 라이브러리를 사용하지 않을 이유는 없다.", + "content": "사수까지는 아니더라도 같이 의논하고 좋은 피드백을 주고받을 수 있는 프론트엔드 동료가 있으면 좋겠다는 생각을 자주 했다.", "link": null }, "annotations": { @@ -1883,7 +1711,7 @@ "code": false, "color": "default" }, - "plain_text": "위 라이브러리와 Context API 사용하여 문제를 해결할 수도 있지만 같은 문제를 해결할 수 있으며 더 많은 기능을 제공하는 상태 관리 라이브러리를 사용하지 않을 이유는 없다.", + "plain_text": "사수까지는 아니더라도 같이 의논하고 좋은 피드백을 주고받을 수 있는 프론트엔드 동료가 있으면 좋겠다는 생각을 자주 했다.", "href": null } ], @@ -1892,13 +1720,13 @@ }, { "object": "block", - "id": "93c97068-fb1c-481b-837c-0c9b42eb702c", + "id": "dcee615b-b06d-4e58-8845-9b519c5201f9", "parent": { "type": "page_id", - "page_id": "56874170-f8d4-4bcc-996e-be4e43f67930" + "page_id": "b7170562-1e0d-4f8b-ae2a-65cb2715757e" }, - "created_time": "2023-11-30T05:28:00.000Z", - "last_edited_time": "2023-11-30T07:13:00.000Z", + "created_time": "2023-07-02T08:40:00.000Z", + "last_edited_time": "2023-07-02T08:40:00.000Z", "created_by": { "object": "user", "id": "5146391e-8b65-47f2-83b6-2bfe81194f32" @@ -1910,13 +1738,13 @@ "has_children": false, "archived": false, "in_trash": false, - "type": "heading_1", - "heading_1": { + "type": "paragraph", + "paragraph": { "rich_text": [ { "type": "text", "text": { - "content": "전역 상태 관리 라이브러리", + "content": "그러던 중 여기저기에서 면접을 봐보라고 연락도 오고 해서 몇 군데 면접을 보았다.", "link": null }, "annotations": { @@ -1927,23 +1755,22 @@ "code": false, "color": "default" }, - "plain_text": "전역 상태 관리 라이브러리", + "plain_text": "그러던 중 여기저기에서 면접을 봐보라고 연락도 오고 해서 몇 군데 면접을 보았다.", "href": null } ], - "is_toggleable": false, "color": "default" } }, { "object": "block", - "id": "54b7a0be-b7be-49a1-9d39-b608ef463437", + "id": "9079ea5c-7ea1-4776-a8b8-64363fc6607f", "parent": { "type": "page_id", - "page_id": "56874170-f8d4-4bcc-996e-be4e43f67930" + "page_id": "b7170562-1e0d-4f8b-ae2a-65cb2715757e" }, - "created_time": "2023-11-30T05:36:00.000Z", - "last_edited_time": "2023-12-01T11:54:00.000Z", + "created_time": "2023-07-02T08:40:00.000Z", + "last_edited_time": "2023-07-02T08:40:00.000Z", "created_by": { "object": "user", "id": "5146391e-8b65-47f2-83b6-2bfe81194f32" @@ -1961,7 +1788,7 @@ { "type": "text", "text": { - "content": "전역 상태 관리 라이브러리는 웹 애플리케이션에서 상태를 중앙에서 관리하기 위해 사용되는 도구이다. 여러 컴포넌트가 있고 이 컴포넌트 간에 데이터를 공유해야 할 때 전역 상태 관리 라이브러리가 유용하게 사용될 수 있다.", + "content": "과제와 코딩테스트를 통과 후 면접을 보았다. 그런데 면접에서 아주 그냥 탈탈 털려버렸다.", "link": null }, "annotations": { @@ -1972,7 +1799,7 @@ "code": false, "color": "default" }, - "plain_text": "전역 상태 관리 라이브러리는 웹 애플리케이션에서 상태를 중앙에서 관리하기 위해 사용되는 도구이다. 여러 컴포넌트가 있고 이 컴포넌트 간에 데이터를 공유해야 할 때 전역 상태 관리 라이브러리가 유용하게 사용될 수 있다.", + "plain_text": "과제와 코딩테스트를 통과 후 면접을 보았다. 그런데 면접에서 아주 그냥 탈탈 털려버렸다.", "href": null } ], @@ -1981,13 +1808,13 @@ }, { "object": "block", - "id": "0caf3bdf-d96b-4ee1-bfb3-5780dc35446a", + "id": "3e6e66ad-445a-4324-b61a-d70b62a38727", "parent": { "type": "page_id", - "page_id": "56874170-f8d4-4bcc-996e-be4e43f67930" + "page_id": "b7170562-1e0d-4f8b-ae2a-65cb2715757e" }, - "created_time": "2023-11-30T05:51:00.000Z", - "last_edited_time": "2023-11-30T07:14:00.000Z", + "created_time": "2023-07-02T08:40:00.000Z", + "last_edited_time": "2023-07-02T08:40:00.000Z", "created_by": { "object": "user", "id": "5146391e-8b65-47f2-83b6-2bfe81194f32" @@ -1999,13 +1826,13 @@ "has_children": false, "archived": false, "in_trash": false, - "type": "heading_2", - "heading_2": { + "type": "paragraph", + "paragraph": { "rich_text": [ { "type": "text", "text": { - "content": "Trends", + "content": "아.. 내가 아직 많이 부족한 게 많구나라는 생각이 들었다.", "link": null }, "annotations": { @@ -2016,23 +1843,22 @@ "code": false, "color": "default" }, - "plain_text": "Trends", + "plain_text": "아.. 내가 아직 많이 부족한 게 많구나라는 생각이 들었다.", "href": null } ], - "is_toggleable": false, "color": "default" } }, { "object": "block", - "id": "437a15d3-c6f8-44b5-baac-52a5c91e4de9", + "id": "23630de2-2e2f-49ea-9e32-949f062a96c3", "parent": { "type": "page_id", - "page_id": "56874170-f8d4-4bcc-996e-be4e43f67930" + "page_id": "b7170562-1e0d-4f8b-ae2a-65cb2715757e" }, - "created_time": "2023-11-30T07:57:00.000Z", - "last_edited_time": "2025-04-14T14:09:00.000Z", + "created_time": "2023-07-02T08:40:00.000Z", + "last_edited_time": "2023-07-02T08:40:00.000Z", "created_by": { "object": "user", "id": "5146391e-8b65-47f2-83b6-2bfe81194f32" @@ -2044,30 +1870,39 @@ "has_children": false, "archived": false, "in_trash": false, - "type": "image", - "image": { - "caption": [], - "type": "file", - "file": { - "url": "https://www.notion.so/image/https%3A%2F%2Fprod-files-secure.s3.us-west-2.amazonaws.com%2Fcd7314a5-d906-43b0-81e7-42eff82c02a3%2F35cb51f8-eeca-4c21-8951-ee9f8358cbb6%2FUntitled.png?table=block&id=437a15d3-c6f8-44b5-baac-52a5c91e4de9&cache=v2", - "expiry_time": "2025-04-14T15:12:43.726Z" - }, - "format": { - "block_width": 1200, - "block_height": 675, - "block_aspect_ratio": 1.7777777777777777 - } + "type": "paragraph", + "paragraph": { + "rich_text": [ + { + "type": "text", + "text": { + "content": "그때부터 안 갈 회사이더라도 무조건 면접을 많이 봐보자는 목표로 여기저기 면접을 11월에 엄청 많이 본 것 같다.", + "link": null + }, + "annotations": { + "bold": false, + "italic": false, + "strikethrough": false, + "underline": false, + "code": false, + "color": "default" + }, + "plain_text": "그때부터 안 갈 회사이더라도 무조건 면접을 많이 봐보자는 목표로 여기저기 면접을 11월에 엄청 많이 본 것 같다.", + "href": null + } + ], + "color": "default" } }, { "object": "block", - "id": "3c8ed758-8132-4660-997d-1d8074c8b7d9", + "id": "55dff194-abdc-4532-a298-96eabff81a2f", "parent": { "type": "page_id", - "page_id": "56874170-f8d4-4bcc-996e-be4e43f67930" + "page_id": "b7170562-1e0d-4f8b-ae2a-65cb2715757e" }, - "created_time": "2023-11-30T05:51:00.000Z", - "last_edited_time": "2025-04-14T14:09:00.000Z", + "created_time": "2023-07-02T08:40:00.000Z", + "last_edited_time": "2023-07-02T08:40:00.000Z", "created_by": { "object": "user", "id": "5146391e-8b65-47f2-83b6-2bfe81194f32" @@ -2079,30 +1914,39 @@ "has_children": false, "archived": false, "in_trash": false, - "type": "image", - "image": { - "caption": [], - "type": "file", - "file": { - "url": "https://www.notion.so/image/https%3A%2F%2Fprod-files-secure.s3.us-west-2.amazonaws.com%2Fcd7314a5-d906-43b0-81e7-42eff82c02a3%2F8fe2c22b-50c8-4ec2-bb8e-419f891c32d7%2FUntitled.png?table=block&id=3c8ed758-8132-4660-997d-1d8074c8b7d9&cache=v2", - "expiry_time": "2025-04-14T15:12:43.729Z" - }, - "format": { - "block_width": 940, - "block_height": 450, - "block_aspect_ratio": 2.088888888888889 - } + "type": "paragraph", + "paragraph": { + "rich_text": [ + { + "type": "text", + "text": { + "content": "(그중 마음에 드는 한 회사에 운 좋게 합격했는데 처우가 맞지 않아서 못가게되었다… 너무 아쉬워ㅓ ㅠ)", + "link": null + }, + "annotations": { + "bold": false, + "italic": false, + "strikethrough": false, + "underline": false, + "code": false, + "color": "default" + }, + "plain_text": "(그중 마음에 드는 한 회사에 운 좋게 합격했는데 처우가 맞지 않아서 못가게되었다… 너무 아쉬워ㅓ ㅠ)", + "href": null + } + ], + "color": "default" } }, { "object": "block", - "id": "09bd31e9-0624-40bf-9227-7889e99805ca", + "id": "83a72e14-48d5-4112-8f50-99cfb137b3d4", "parent": { "type": "page_id", - "page_id": "56874170-f8d4-4bcc-996e-be4e43f67930" + "page_id": "b7170562-1e0d-4f8b-ae2a-65cb2715757e" }, - "created_time": "2023-11-30T05:36:00.000Z", - "last_edited_time": "2023-12-01T11:54:00.000Z", + "created_time": "2023-07-02T08:40:00.000Z", + "last_edited_time": "2023-07-02T08:40:00.000Z", "created_by": { "object": "user", "id": "5146391e-8b65-47f2-83b6-2bfe81194f32" @@ -2120,7 +1964,7 @@ { "type": "text", "text": { - "content": "많은 라이브러리가 있지만 주류인 Flux, Atomic 패턴을 가진(혹은 유사한) 라이브러리에 대해 설명한다.\n(Proxy (Mobx, Valtio)는 다음 기회에..)", + "content": "면접에 내가 제대로 답변 못 한 부분들은 기억이 또렷하게 더 잘나는 거 같다. 그런 리스트들을 노션에 하나둘씩 채워나갔다.", "link": null }, "annotations": { @@ -2131,7 +1975,7 @@ "code": false, "color": "default" }, - "plain_text": "많은 라이브러리가 있지만 주류인 Flux, Atomic 패턴을 가진(혹은 유사한) 라이브러리에 대해 설명한다.\n(Proxy (Mobx, Valtio)는 다음 기회에..)", + "plain_text": "면접에 내가 제대로 답변 못 한 부분들은 기억이 또렷하게 더 잘나는 거 같다. 그런 리스트들을 노션에 하나둘씩 채워나갔다.", "href": null } ], @@ -2140,13 +1984,13 @@ }, { "object": "block", - "id": "b4f81a39-6247-44a4-957c-ffc25455dae8", + "id": "2ffbd85c-b4ab-4b3c-a3e2-31fa69f222fa", "parent": { "type": "page_id", - "page_id": "56874170-f8d4-4bcc-996e-be4e43f67930" + "page_id": "b7170562-1e0d-4f8b-ae2a-65cb2715757e" }, - "created_time": "2023-11-30T05:28:00.000Z", - "last_edited_time": "2023-11-30T07:14:00.000Z", + "created_time": "2023-07-02T08:40:00.000Z", + "last_edited_time": "2023-07-02T08:40:00.000Z", "created_by": { "object": "user", "id": "5146391e-8b65-47f2-83b6-2bfe81194f32" @@ -2158,13 +2002,13 @@ "has_children": false, "archived": false, "in_trash": false, - "type": "heading_2", - "heading_2": { + "type": "paragraph", + "paragraph": { "rich_text": [ { "type": "text", "text": { - "content": "Flux (Redux, Zustand)", + "content": "그러던 중! 12월에 갑자기 전 회사에서 파견 가서 알게 된 좋은 개발자 한 분이 추천서를 넣어준다고 하셔서 감사하게도 면접 기회가 있었고 중학교 친구도 자기 회사에 추천해주어서 또 면접 기회를 얻었다.", "link": null }, "annotations": { @@ -2175,23 +2019,22 @@ "code": false, "color": "default" }, - "plain_text": "Flux (Redux, Zustand)", + "plain_text": "그러던 중! 12월에 갑자기 전 회사에서 파견 가서 알게 된 좋은 개발자 한 분이 추천서를 넣어준다고 하셔서 감사하게도 면접 기회가 있었고 중학교 친구도 자기 회사에 추천해주어서 또 면접 기회를 얻었다.", "href": null } ], - "is_toggleable": false, "color": "default" } }, { "object": "block", - "id": "5e4f6bea-67c3-44db-84eb-8f971efe690c", + "id": "0db1efff-9166-45bd-925d-08c77ea8ffb1", "parent": { "type": "page_id", - "page_id": "56874170-f8d4-4bcc-996e-be4e43f67930" + "page_id": "b7170562-1e0d-4f8b-ae2a-65cb2715757e" }, - "created_time": "2023-11-30T05:52:00.000Z", - "last_edited_time": "2023-12-02T07:10:00.000Z", + "created_time": "2023-07-02T08:40:00.000Z", + "last_edited_time": "2023-07-02T08:40:00.000Z", "created_by": { "object": "user", "id": "5146391e-8b65-47f2-83b6-2bfe81194f32" @@ -2209,7 +2052,7 @@ { "type": "text", "text": { - "content": "Flux 패턴은 2014년 페이스북 컨퍼런스에서 발표된 Architecture이다.\n기존의 MVC 패턴은 데이터 흐름이 양방향이기 때문에 복잡성과 예측 불가능성이 증가하는 문제가 있었다.\n이를 해결하기 위해 나온 Flux 패턴은 단방향 데이터 흐름을 도입하여 상태 관리를 간소화하고 예측할 수 있는 방식으로 처리할 수 있도록 설계되었다.", + "content": "연락 온 곳도 있고 내가 지원한 곳도 있고 해서 12월 말부터 1월까지는 총 5개 회사에 지원하게 되었고 3개가 붙었다.", "link": null }, "annotations": { @@ -2220,7 +2063,7 @@ "code": false, "color": "default" }, - "plain_text": "Flux 패턴은 2014년 페이스북 컨퍼런스에서 발표된 Architecture이다.\n기존의 MVC 패턴은 데이터 흐름이 양방향이기 때문에 복잡성과 예측 불가능성이 증가하는 문제가 있었다.\n이를 해결하기 위해 나온 Flux 패턴은 단방향 데이터 흐름을 도입하여 상태 관리를 간소화하고 예측할 수 있는 방식으로 처리할 수 있도록 설계되었다.", + "plain_text": "연락 온 곳도 있고 내가 지원한 곳도 있고 해서 12월 말부터 1월까지는 총 5개 회사에 지원하게 되었고 3개가 붙었다.", "href": null } ], @@ -2229,48 +2072,13 @@ }, { "object": "block", - "id": "40ab6b16-87d8-428d-b7c0-ccb87772ff85", + "id": "94cc0124-2d92-4d72-a080-7936ea982def", "parent": { "type": "page_id", - "page_id": "56874170-f8d4-4bcc-996e-be4e43f67930" + "page_id": "b7170562-1e0d-4f8b-ae2a-65cb2715757e" }, - "created_time": "2023-11-30T06:02:00.000Z", - "last_edited_time": "2025-04-14T14:09:00.000Z", - "created_by": { - "object": "user", - "id": "5146391e-8b65-47f2-83b6-2bfe81194f32" - }, - "last_edited_by": { - "object": "user", - "id": "5146391e-8b65-47f2-83b6-2bfe81194f32" - }, - "has_children": false, - "archived": false, - "in_trash": false, - "type": "image", - "image": { - "caption": [], - "type": "file", - "file": { - "url": "https://www.notion.so/image/https%3A%2F%2Fprod-files-secure.s3.us-west-2.amazonaws.com%2Fcd7314a5-d906-43b0-81e7-42eff82c02a3%2F081953e4-865d-4692-89ff-22c747d5df87%2FUntitled.png?table=block&id=40ab6b16-87d8-428d-b7c0-ccb87772ff85&cache=v2", - "expiry_time": "2025-04-14T15:12:43.676Z" - }, - "format": { - "block_width": 720, - "block_height": 218, - "block_aspect_ratio": 3.302752293577982 - } - } - }, - { - "object": "block", - "id": "0bcbecde-f586-4694-b015-d7a39c338e36", - "parent": { - "type": "page_id", - "page_id": "56874170-f8d4-4bcc-996e-be4e43f67930" - }, - "created_time": "2023-11-30T05:29:00.000Z", - "last_edited_time": "2023-11-30T06:04:00.000Z", + "created_time": "2023-07-02T08:40:00.000Z", + "last_edited_time": "2023-07-02T08:40:00.000Z", "created_by": { "object": "user", "id": "5146391e-8b65-47f2-83b6-2bfe81194f32" @@ -2288,7 +2096,7 @@ { "type": "text", "text": { - "content": "Flux 패턴은 아래와 같은 주요 개념으로 구성된다.", + "content": "갈팡질팡 하다가 한 회사로 이직을 하기로 마음먹었다.", "link": null }, "annotations": { @@ -2299,7 +2107,7 @@ "code": false, "color": "default" }, - "plain_text": "Flux 패턴은 아래와 같은 주요 개념으로 구성된다.", + "plain_text": "갈팡질팡 하다가 한 회사로 이직을 하기로 마음먹었다.", "href": null } ], @@ -2308,13 +2116,13 @@ }, { "object": "block", - "id": "287f9b00-55d9-48be-aa47-7491f3854d9c", + "id": "b5803c59-14f6-4d78-8ea6-e51b71ad8b73", "parent": { "type": "page_id", - "page_id": "56874170-f8d4-4bcc-996e-be4e43f67930" + "page_id": "b7170562-1e0d-4f8b-ae2a-65cb2715757e" }, - "created_time": "2023-11-30T06:04:00.000Z", - "last_edited_time": "2023-11-30T06:13:00.000Z", + "created_time": "2023-07-06T13:15:00.000Z", + "last_edited_time": "2023-07-06T13:15:00.000Z", "created_by": { "object": "user", "id": "5146391e-8b65-47f2-83b6-2bfe81194f32" @@ -2323,88 +2131,24 @@ "object": "user", "id": "5146391e-8b65-47f2-83b6-2bfe81194f32" }, - "has_children": true, + "has_children": false, "archived": false, "in_trash": false, - "type": "bulleted_list_item", - "bulleted_list_item": { - "rich_text": [ - { - "type": "text", - "text": { - "content": "액션(Action): 애플리케이션에서 발생하는 어떠한 사건이다.", - "link": null - }, - "annotations": { - "bold": false, - "italic": false, - "strikethrough": false, - "underline": false, - "code": false, - "color": "default" - }, - "plain_text": "액션(Action): 애플리케이션에서 발생하는 어떠한 사건이다.", - "href": null - } - ], + "type": "paragraph", + "paragraph": { + "rich_text": [], "color": "default" - }, - "children": [ - { - "object": "block", - "id": "6f00e28b-7b01-4e36-bdc6-9c8b63cd428f", - "parent": { - "type": "block_id", - "block_id": "287f9b00-55d9-48be-aa47-7491f3854d9c" - }, - "created_time": "2023-11-30T06:13:00.000Z", - "last_edited_time": "2023-12-01T11:55:00.000Z", - "created_by": { - "object": "user", - "id": "5146391e-8b65-47f2-83b6-2bfe81194f32" - }, - "last_edited_by": { - "object": "user", - "id": "5146391e-8b65-47f2-83b6-2bfe81194f32" - }, - "has_children": false, - "archived": false, - "in_trash": false, - "type": "bulleted_list_item", - "bulleted_list_item": { - "rich_text": [ - { - "type": "text", - "text": { - "content": "예를 들어 버튼 클릭, 입력값 변경 등이 액션에 해당한다.", - "link": null - }, - "annotations": { - "bold": false, - "italic": false, - "strikethrough": false, - "underline": false, - "code": false, - "color": "default" - }, - "plain_text": "예를 들어 버튼 클릭, 입력값 변경 등이 액션에 해당한다.", - "href": null - } - ], - "color": "default" - } - } - ] + } }, { "object": "block", - "id": "f8945c25-c7bc-44a7-bad7-fdb47563ef3a", + "id": "304b6e33-918c-441d-b750-a7c6d007a382", "parent": { "type": "page_id", - "page_id": "56874170-f8d4-4bcc-996e-be4e43f67930" + "page_id": "b7170562-1e0d-4f8b-ae2a-65cb2715757e" }, - "created_time": "2023-11-30T06:05:00.000Z", - "last_edited_time": "2023-11-30T06:12:00.000Z", + "created_time": "2023-07-02T08:40:00.000Z", + "last_edited_time": "2023-07-02T08:40:00.000Z", "created_by": { "object": "user", "id": "5146391e-8b65-47f2-83b6-2bfe81194f32" @@ -2416,13 +2160,30 @@ "has_children": false, "archived": false, "in_trash": false, - "type": "bulleted_list_item", - "bulleted_list_item": { + "type": "paragraph", + "paragraph": { "rich_text": [ { "type": "text", "text": { - "content": "디스패처(Dispatcher): 액션을 전달받아 등록된 스토어에 액션을 분배하는 역할을 한다.", + "content": "그래서 어디 가는 데 ?", + "link": null + }, + "annotations": { + "bold": true, + "italic": false, + "strikethrough": false, + "underline": false, + "code": false, + "color": "default" + }, + "plain_text": "그래서 어디 가는 데 ?", + "href": null + }, + { + "type": "text", + "text": { + "content": "", "link": null }, "annotations": { @@ -2433,7 +2194,7 @@ "code": false, "color": "default" }, - "plain_text": "디스패처(Dispatcher): 액션을 전달받아 등록된 스토어에 액션을 분배하는 역할을 한다.", + "plain_text": "", "href": null } ], @@ -2442,13 +2203,13 @@ }, { "object": "block", - "id": "61d057bc-993b-4736-91b4-971d70e6b971", + "id": "ecf9d695-1719-41c0-975e-c8c4ff5d04a8", "parent": { "type": "page_id", - "page_id": "56874170-f8d4-4bcc-996e-be4e43f67930" + "page_id": "b7170562-1e0d-4f8b-ae2a-65cb2715757e" }, - "created_time": "2023-11-30T06:05:00.000Z", - "last_edited_time": "2023-11-30T06:13:00.000Z", + "created_time": "2023-07-04T08:14:00.000Z", + "last_edited_time": "2023-07-04T08:16:00.000Z", "created_by": { "object": "user", "id": "5146391e-8b65-47f2-83b6-2bfe81194f32" @@ -2457,132 +2218,33 @@ "object": "user", "id": "5146391e-8b65-47f2-83b6-2bfe81194f32" }, - "has_children": true, + "has_children": false, "archived": false, "in_trash": false, - "type": "bulleted_list_item", - "bulleted_list_item": { - "rich_text": [ - { - "type": "text", - "text": { - "content": "스토어(Store): 애플리케이션의 상태를 저장하고 관리한다.", - "link": null - }, - "annotations": { - "bold": false, - "italic": false, - "strikethrough": false, - "underline": false, - "code": false, - "color": "default" - }, - "plain_text": "스토어(Store): 애플리케이션의 상태를 저장하고 관리한다.", - "href": null - } - ], - "color": "default" - }, - "children": [ - { - "object": "block", - "id": "5f3defd3-3c8e-4819-9b8c-26a63fcf2c25", - "parent": { - "type": "block_id", - "block_id": "61d057bc-993b-4736-91b4-971d70e6b971" - }, - "created_time": "2023-11-30T06:13:00.000Z", - "last_edited_time": "2023-11-30T06:13:00.000Z", - "created_by": { - "object": "user", - "id": "5146391e-8b65-47f2-83b6-2bfe81194f32" - }, - "last_edited_by": { - "object": "user", - "id": "5146391e-8b65-47f2-83b6-2bfe81194f32" - }, - "has_children": false, - "archived": false, - "in_trash": false, - "type": "bulleted_list_item", - "bulleted_list_item": { - "rich_text": [ - { - "type": "text", - "text": { - "content": "변경된 상태를 뷰에 알린다.", - "link": null - }, - "annotations": { - "bold": false, - "italic": false, - "strikethrough": false, - "underline": false, - "code": false, - "color": "default" - }, - "plain_text": "변경된 상태를 뷰에 알린다.", - "href": null - } - ], - "color": "default" - } + "type": "image", + "image": { + "caption": [], + "type": "file", + "file": { + "url": "https://www.notion.so/image/https%3A%2F%2Fprod-files-secure.s3.us-west-2.amazonaws.com%2Fcd7314a5-d906-43b0-81e7-42eff82c02a3%2F0f703999-8aad-4df5-be6e-1c79f7ae4fd7%2Ffinda.png?table=block&id=ecf9d695-1719-41c0-975e-c8c4ff5d04a8&cache=v2", + "expiry_time": "2025-06-04T13:30:24.051Z" }, - { - "object": "block", - "id": "15946176-74db-4d14-9d5d-0123f9e3e03f", - "parent": { - "type": "block_id", - "block_id": "61d057bc-993b-4736-91b4-971d70e6b971" - }, - "created_time": "2023-11-30T06:13:00.000Z", - "last_edited_time": "2023-11-30T06:13:00.000Z", - "created_by": { - "object": "user", - "id": "5146391e-8b65-47f2-83b6-2bfe81194f32" - }, - "last_edited_by": { - "object": "user", - "id": "5146391e-8b65-47f2-83b6-2bfe81194f32" - }, - "has_children": false, - "archived": false, - "in_trash": false, - "type": "bulleted_list_item", - "bulleted_list_item": { - "rich_text": [ - { - "type": "text", - "text": { - "content": "상태 변경에 대한 로직을 포함하고 있으며, 디스패처로부터 전달받은 액션을 처리한다.", - "link": null - }, - "annotations": { - "bold": false, - "italic": false, - "strikethrough": false, - "underline": false, - "code": false, - "color": "default" - }, - "plain_text": "상태 변경에 대한 로직을 포함하고 있으며, 디스패처로부터 전달받은 액션을 처리한다.", - "href": null - } - ], - "color": "default" - } + "format": { + "block_width": 2174, + "block_height": 1036, + "block_aspect_ratio": 2.0984555984555984 } - ] + } }, { "object": "block", - "id": "8d083742-175b-460c-8bc5-007ea36fedb3", + "id": "1cf6f267-8c7f-435d-a29e-86f2668b2ab6", "parent": { "type": "page_id", - "page_id": "56874170-f8d4-4bcc-996e-be4e43f67930" + "page_id": "b7170562-1e0d-4f8b-ae2a-65cb2715757e" }, - "created_time": "2023-11-30T06:05:00.000Z", - "last_edited_time": "2023-11-30T06:14:00.000Z", + "created_time": "2023-07-02T08:40:00.000Z", + "last_edited_time": "2023-07-02T08:40:00.000Z", "created_by": { "object": "user", "id": "5146391e-8b65-47f2-83b6-2bfe81194f32" @@ -2591,16 +2253,16 @@ "object": "user", "id": "5146391e-8b65-47f2-83b6-2bfe81194f32" }, - "has_children": true, + "has_children": false, "archived": false, "in_trash": false, - "type": "bulleted_list_item", - "bulleted_list_item": { + "type": "paragraph", + "paragraph": { "rich_text": [ { "type": "text", "text": { - "content": "뷰(View): 사용자에게 데이터를 표시하고 사용자 입력을 받는 역할을 한다.", + "content": "대기업을 갈지 스타트업을 갈지 고민을 많이 했는데…", "link": null }, "annotations": { @@ -2611,68 +2273,22 @@ "code": false, "color": "default" }, - "plain_text": "뷰(View): 사용자에게 데이터를 표시하고 사용자 입력을 받는 역할을 한다.", + "plain_text": "대기업을 갈지 스타트업을 갈지 고민을 많이 했는데…", "href": null } ], "color": "default" - }, - "children": [ - { - "object": "block", - "id": "f28162e9-d5b1-485b-8dcd-a66b095f5ced", - "parent": { - "type": "block_id", - "block_id": "8d083742-175b-460c-8bc5-007ea36fedb3" - }, - "created_time": "2023-11-30T06:14:00.000Z", - "last_edited_time": "2023-11-30T06:14:00.000Z", - "created_by": { - "object": "user", - "id": "5146391e-8b65-47f2-83b6-2bfe81194f32" - }, - "last_edited_by": { - "object": "user", - "id": "5146391e-8b65-47f2-83b6-2bfe81194f32" - }, - "has_children": false, - "archived": false, - "in_trash": false, - "type": "bulleted_list_item", - "bulleted_list_item": { - "rich_text": [ - { - "type": "text", - "text": { - "content": "뷰는 스토어의 상태를 구독하고, 상태가 변경될 때마다 업데이트된다.", - "link": null - }, - "annotations": { - "bold": false, - "italic": false, - "strikethrough": false, - "underline": false, - "code": false, - "color": "default" - }, - "plain_text": "뷰는 스토어의 상태를 구독하고, 상태가 변경될 때마다 업데이트된다.", - "href": null - } - ], - "color": "default" - } - } - ] + } }, { "object": "block", - "id": "67674908-7bea-4860-9843-8f5737dd392f", + "id": "309dc6ba-bdca-4a83-a086-302b3183063f", "parent": { "type": "page_id", - "page_id": "56874170-f8d4-4bcc-996e-be4e43f67930" + "page_id": "b7170562-1e0d-4f8b-ae2a-65cb2715757e" }, - "created_time": "2023-11-30T06:14:00.000Z", - "last_edited_time": "2023-12-01T11:55:00.000Z", + "created_time": "2023-07-02T08:40:00.000Z", + "last_edited_time": "2023-07-02T08:40:00.000Z", "created_by": { "object": "user", "id": "5146391e-8b65-47f2-83b6-2bfe81194f32" @@ -2690,7 +2306,7 @@ { "type": "text", "text": { - "content": "Flux 패턴은 단방향 데이터 흐름으로써, 액션 → 디스패처 → 스토어 → 뷰의 순서로 데이터가 흘러간다.\n이러한 방식은 상태 변화를 추적하고 예측할 수 있는 방식으로 처리할 수 있게 해준다.", + "content": "금융 도메인에서 개발자로 일하면 향후 내 커리어에 도움이 많이 될 것이라는 생각과 이제 급성장을 시작하는 기업에서 일하면 그 과정에서 얻을 수 있는 게 더 많다고 판단했다.", "link": null }, "annotations": { @@ -2701,7 +2317,7 @@ "code": false, "color": "default" }, - "plain_text": "Flux 패턴은 단방향 데이터 흐름으로써, 액션 → 디스패처 → 스토어 → 뷰의 순서로 데이터가 흘러간다.\n이러한 방식은 상태 변화를 추적하고 예측할 수 있는 방식으로 처리할 수 있게 해준다.", + "plain_text": "금융 도메인에서 개발자로 일하면 향후 내 커리어에 도움이 많이 될 것이라는 생각과 이제 급성장을 시작하는 기업에서 일하면 그 과정에서 얻을 수 있는 게 더 많다고 판단했다.", "href": null } ], @@ -2710,13 +2326,13 @@ }, { "object": "block", - "id": "1bbcd6e7-fc7a-4f66-a6d1-631c8f6e75bb", + "id": "f91b238a-424b-4e4e-93b5-be1e5c5e42d0", "parent": { "type": "page_id", - "page_id": "56874170-f8d4-4bcc-996e-be4e43f67930" + "page_id": "b7170562-1e0d-4f8b-ae2a-65cb2715757e" }, - "created_time": "2023-11-30T06:32:00.000Z", - "last_edited_time": "2023-11-30T06:33:00.000Z", + "created_time": "2023-07-02T08:40:00.000Z", + "last_edited_time": "2023-07-02T08:40:00.000Z", "created_by": { "object": "user", "id": "5146391e-8b65-47f2-83b6-2bfe81194f32" @@ -2728,30 +2344,39 @@ "has_children": false, "archived": false, "in_trash": false, - "type": "image", - "image": { - "caption": [], - "type": "file", - "file": { - "url": "https://www.notion.so/image/https%3A%2F%2Fprod-files-secure.s3.us-west-2.amazonaws.com%2Fcd7314a5-d906-43b0-81e7-42eff82c02a3%2F09824e82-6f2f-4e9c-9758-32637cf14148%2FUntitled.png?table=block&id=1bbcd6e7-fc7a-4f66-a6d1-631c8f6e75bb&cache=v2", - "expiry_time": "2025-04-14T15:12:43.676Z" - }, - "format": { - "block_width": 755, - "block_height": 875, - "block_aspect_ratio": 0.8628571428571429 - } + "type": "paragraph", + "paragraph": { + "rich_text": [ + { + "type": "text", + "text": { + "content": "현 회사에서는 공식 사이트 유지보수, 백오피스 재구축, 새로운 프로덕트 만들기, AWS를 활용해서 필요한 기능 만들기 등등… 많은 일을 했다.", + "link": null + }, + "annotations": { + "bold": false, + "italic": false, + "strikethrough": false, + "underline": false, + "code": false, + "color": "default" + }, + "plain_text": "현 회사에서는 공식 사이트 유지보수, 백오피스 재구축, 새로운 프로덕트 만들기, AWS를 활용해서 필요한 기능 만들기 등등… 많은 일을 했다.", + "href": null + } + ], + "color": "default" } }, { "object": "block", - "id": "bbb7ff57-55db-456d-933a-fb2c78eccb05", + "id": "fe950b78-87bc-4c43-826a-5ce8944caa73", "parent": { "type": "page_id", - "page_id": "56874170-f8d4-4bcc-996e-be4e43f67930" + "page_id": "b7170562-1e0d-4f8b-ae2a-65cb2715757e" }, - "created_time": "2023-11-30T06:14:00.000Z", - "last_edited_time": "2023-11-30T07:15:00.000Z", + "created_time": "2023-07-02T08:40:00.000Z", + "last_edited_time": "2023-07-06T13:16:00.000Z", "created_by": { "object": "user", "id": "5146391e-8b65-47f2-83b6-2bfe81194f32" @@ -2769,7 +2394,7 @@ { "type": "text", "text": { - "content": "Flux 패턴의 구현체인 ", + "content": "프로젝트마다 썰을 풀면 너무 길기 때문에 지난 1년 동안 뭘 했는지는 이 정도로 줄여야겠다.(이력서나 ", "link": null }, "annotations": { @@ -2780,31 +2405,16 @@ "code": false, "color": "default" }, - "plain_text": "Flux 패턴의 구현체인 ", - "href": null - }, - { - "type": "text", - "text": { - "content": "Redux", - "link": null - }, - "annotations": { - "bold": true, - "italic": false, - "strikethrough": false, - "underline": false, - "code": false, - "color": "default" - }, - "plain_text": "Redux", + "plain_text": "프로젝트마다 썰을 풀면 너무 길기 때문에 지난 1년 동안 뭘 했는지는 이 정도로 줄여야겠다.(이력서나 ", "href": null }, { "type": "text", "text": { - "content": ", Flux 패턴의 구현체는 아니지만 Redux와 유사한 목적을 가지는 ", - "link": null + "content": "About Me", + "link": { + "url": "https://binary01.me/about" + } }, "annotations": { "bold": false, @@ -2814,30 +2424,13 @@ "code": false, "color": "default" }, - "plain_text": ", Flux 패턴의 구현체는 아니지만 Redux와 유사한 목적을 가지는 ", - "href": null - }, - { - "type": "text", - "text": { - "content": "Zustand", - "link": null - }, - "annotations": { - "bold": true, - "italic": false, - "strikethrough": false, - "underline": false, - "code": false, - "color": "default" - }, - "plain_text": "Zustand", - "href": null + "plain_text": "About Me", + "href": "https://binary01.me/about" }, { "type": "text", "text": { - "content": "는 하향식 (Top-Down) 접근법을 가지고 있다.", + "content": "에 어차피 있다 ㅎㅎ)", "link": null }, "annotations": { @@ -2848,7 +2441,7 @@ "code": false, "color": "default" }, - "plain_text": "는 하향식 (Top-Down) 접근법을 가지고 있다.", + "plain_text": "에 어차피 있다 ㅎㅎ)", "href": null } ], @@ -2857,13 +2450,13 @@ }, { "object": "block", - "id": "4a680b25-fe4b-4245-8c62-6d4fbcad8334", + "id": "5e0868d3-9c0c-4d06-ab4b-c015dbccc51a", "parent": { "type": "page_id", - "page_id": "56874170-f8d4-4bcc-996e-be4e43f67930" + "page_id": "b7170562-1e0d-4f8b-ae2a-65cb2715757e" }, - "created_time": "2023-11-30T06:50:00.000Z", - "last_edited_time": "2023-11-30T06:54:00.000Z", + "created_time": "2023-07-02T08:40:00.000Z", + "last_edited_time": "2023-07-02T08:40:00.000Z", "created_by": { "object": "user", "id": "5146391e-8b65-47f2-83b6-2bfe81194f32" @@ -2881,7 +2474,7 @@ { "type": "text", "text": { - "content": "하향식 (Top-Down) 접근법 : 컴포넌트 외부에 Store가 상태를 가지고 컴포넌트에서 상태를 가져다 쓰는 방식", + "content": "1년 동안 느낀 점은 주니어 개발자가 혼자서 프로젝트를 밑바닥부터 쌓아 올리는 경험을 해본 것이 나에게 큰 자산이라는 것이다.", "link": null }, "annotations": { @@ -2892,101 +2485,22 @@ "code": false, "color": "default" }, - "plain_text": "하향식 (Top-Down) 접근법 : 컴포넌트 외부에 Store가 상태를 가지고 컴포넌트에서 상태를 가져다 쓰는 방식", - "href": null - } - ], - "color": "default" - } - }, - { - "object": "block", - "id": "fc7f2609-d465-4452-bf16-c17b7b782f56", - "parent": { - "type": "page_id", - "page_id": "56874170-f8d4-4bcc-996e-be4e43f67930" - }, - "created_time": "2023-11-30T06:14:00.000Z", - "last_edited_time": "2023-11-30T07:14:00.000Z", - "created_by": { - "object": "user", - "id": "5146391e-8b65-47f2-83b6-2bfe81194f32" - }, - "last_edited_by": { - "object": "user", - "id": "5146391e-8b65-47f2-83b6-2bfe81194f32" - }, - "has_children": false, - "archived": false, - "in_trash": false, - "type": "heading_3", - "heading_3": { - "rich_text": [ - { - "type": "text", - "text": { - "content": "Redux", - "link": null - }, - "annotations": { - "bold": true, - "italic": false, - "strikethrough": false, - "underline": false, - "code": false, - "color": "default" - }, - "plain_text": "Redux", + "plain_text": "1년 동안 느낀 점은 주니어 개발자가 혼자서 프로젝트를 밑바닥부터 쌓아 올리는 경험을 해본 것이 나에게 큰 자산이라는 것이다.", "href": null } ], - "is_toggleable": false, "color": "default" } }, { "object": "block", - "id": "d56c78aa-01dd-423b-a8c7-f3fdae24f504", - "parent": { - "type": "page_id", - "page_id": "56874170-f8d4-4bcc-996e-be4e43f67930" - }, - "created_time": "2024-01-06T12:32:00.000Z", - "last_edited_time": "2024-01-06T12:32:00.000Z", - "created_by": { - "object": "user", - "id": "5146391e-8b65-47f2-83b6-2bfe81194f32" - }, - "last_edited_by": { - "object": "user", - "id": "5146391e-8b65-47f2-83b6-2bfe81194f32" - }, - "has_children": false, - "archived": false, - "in_trash": false, - "type": "image", - "image": { - "caption": [], - "type": "external", - "external": { - "url": "https://www.notion.so/image/https%3A%2F%2Fres.cloudinary.com%2Fpracticaldev%2Fimage%2Ffetch%2Fs--_N4G6Upo--%2Fc_limit%2Cf_auto%2Cfl_progressive%2Cq_66%2Cw_800%2Fhttps%3A%2F%2Fi.imgur.com%2FriadAin.gif?table=block&id=d56c78aa-01dd-423b-a8c7-f3fdae24f504&cache=v2" - }, - "format": { - "block_width": 800, - "block_height": 600, - "block_aspect_ratio": 1.3333333333333333 - } - } - }, - { - "object": "block", - "id": "34c57947-872a-4ae0-b8b8-9ae9b1415bbe", + "id": "9e471561-79df-4d81-a675-437cc27dd82c", "parent": { "type": "page_id", - "page_id": "56874170-f8d4-4bcc-996e-be4e43f67930" + "page_id": "b7170562-1e0d-4f8b-ae2a-65cb2715757e" }, - "created_time": "2023-11-30T06:15:00.000Z", - "last_edited_time": "2023-12-02T07:11:00.000Z", + "created_time": "2023-07-02T08:40:00.000Z", + "last_edited_time": "2023-07-02T08:40:00.000Z", "created_by": { "object": "user", "id": "5146391e-8b65-47f2-83b6-2bfe81194f32" @@ -3004,7 +2518,7 @@ { "type": "text", "text": { - "content": "프론트엔드 개발자라면 한 번쯤은 본 영상이다. Redux는 기본적으로 위와 같이 단방향으로 데이터가 흐른다.", + "content": "그리고 회사 분들이 다 좋으셔서 인간관계에 대한 스트레스 전혀 없었는데 아마 처음이자 마지막이지 않을까 싶다…(그 정도로 사람이 너무 좋았다는 말!)", "link": null }, "annotations": { @@ -3015,7 +2529,7 @@ "code": false, "color": "default" }, - "plain_text": "프론트엔드 개발자라면 한 번쯤은 본 영상이다. Redux는 기본적으로 위와 같이 단방향으로 데이터가 흐른다.", + "plain_text": "그리고 회사 분들이 다 좋으셔서 인간관계에 대한 스트레스 전혀 없었는데 아마 처음이자 마지막이지 않을까 싶다…(그 정도로 사람이 너무 좋았다는 말!)", "href": null } ], @@ -3024,13 +2538,13 @@ }, { "object": "block", - "id": "395097ab-6de3-4541-abfb-deba48fc8ec7", + "id": "8de6bcaa-2c02-4109-bc7b-94761aa476ad", "parent": { "type": "page_id", - "page_id": "56874170-f8d4-4bcc-996e-be4e43f67930" + "page_id": "b7170562-1e0d-4f8b-ae2a-65cb2715757e" }, - "created_time": "2023-11-30T07:45:00.000Z", - "last_edited_time": "2023-11-30T07:45:00.000Z", + "created_time": "2023-07-02T08:40:00.000Z", + "last_edited_time": "2023-07-02T08:40:00.000Z", "created_by": { "object": "user", "id": "5146391e-8b65-47f2-83b6-2bfe81194f32" @@ -3048,7 +2562,7 @@ { "type": "text", "text": { - "content": "바로 Redux를 사용한 예제를 보겠다.", + "content": "2021년도 좋은 사람들을 만나고 많이 발전할 수 있는 한 해였다.", "link": null }, "annotations": { @@ -3059,7 +2573,7 @@ "code": false, "color": "default" }, - "plain_text": "바로 Redux를 사용한 예제를 보겠다.", + "plain_text": "2021년도 좋은 사람들을 만나고 많이 발전할 수 있는 한 해였다.", "href": null } ], @@ -3068,13 +2582,13 @@ }, { "object": "block", - "id": "57054668-ec2a-4e5e-8c0e-5db02fccc8b5", + "id": "600224a6-f074-4028-bc18-bfa5912565a5", "parent": { "type": "page_id", - "page_id": "56874170-f8d4-4bcc-996e-be4e43f67930" + "page_id": "b7170562-1e0d-4f8b-ae2a-65cb2715757e" }, - "created_time": "2023-11-30T07:15:00.000Z", - "last_edited_time": "2023-11-30T07:15:00.000Z", + "created_time": "2023-07-02T08:40:00.000Z", + "last_edited_time": "2023-07-02T08:40:00.000Z", "created_by": { "object": "user", "id": "5146391e-8b65-47f2-83b6-2bfe81194f32" @@ -3092,5780 +2606,22 @@ { "type": "text", "text": { - "content": "Counter 예제", + "content": "새로운 직장에서는 무슨 일이 기다릴지 두근두근하다!", "link": null }, "annotations": { - "bold": true, + "bold": false, "italic": false, "strikethrough": false, "underline": false, "code": false, "color": "default" }, - "plain_text": "Counter 예제", + "plain_text": "새로운 직장에서는 무슨 일이 기다릴지 두근두근하다!", "href": null } ], "color": "default" } - }, - { - "object": "block", - "id": "b37807cb-938a-4c4f-9bfa-ff7f16ae524f", - "parent": { - "type": "page_id", - "page_id": "56874170-f8d4-4bcc-996e-be4e43f67930" - }, - "created_time": "2023-11-30T07:07:00.000Z", - "last_edited_time": "2023-12-02T07:11:00.000Z", - "created_by": { - "object": "user", - "id": "5146391e-8b65-47f2-83b6-2bfe81194f32" - }, - "last_edited_by": { - "object": "user", - "id": "5146391e-8b65-47f2-83b6-2bfe81194f32" - }, - "has_children": false, - "archived": false, - "in_trash": false, - "type": "embed", - "embed": { - "caption": [], - "url": "https://codesandbox.io/embed/wq9yjp?view=Editor+%2B+Preview&module=%2Fsrc%2Ffeatures%2Fcounter%2FCounter.js" - } - }, - { - "object": "block", - "id": "1ca3f033-2672-4bb3-aff5-fb87110eb592", - "parent": { - "type": "page_id", - "page_id": "56874170-f8d4-4bcc-996e-be4e43f67930" - }, - "created_time": "2023-11-30T07:10:00.000Z", - "last_edited_time": "2023-11-30T07:16:00.000Z", - "created_by": { - "object": "user", - "id": "5146391e-8b65-47f2-83b6-2bfe81194f32" - }, - "last_edited_by": { - "object": "user", - "id": "5146391e-8b65-47f2-83b6-2bfe81194f32" - }, - "has_children": false, - "archived": false, - "in_trash": false, - "type": "paragraph", - "paragraph": { - "rich_text": [ - { - "type": "text", - "text": { - "content": "코드", - "link": null - }, - "annotations": { - "bold": true, - "italic": false, - "strikethrough": false, - "underline": false, - "code": false, - "color": "default" - }, - "plain_text": "코드", - "href": null - } - ], - "color": "default" - } - }, - { - "object": "block", - "id": "14d2ff54-2b54-45be-8fc1-bf34f3785ffc", - "parent": { - "type": "page_id", - "page_id": "56874170-f8d4-4bcc-996e-be4e43f67930" - }, - "created_time": "2023-11-30T07:10:00.000Z", - "last_edited_time": "2023-11-30T07:37:00.000Z", - "created_by": { - "object": "user", - "id": "5146391e-8b65-47f2-83b6-2bfe81194f32" - }, - "last_edited_by": { - "object": "user", - "id": "5146391e-8b65-47f2-83b6-2bfe81194f32" - }, - "has_children": false, - "archived": false, - "in_trash": false, - "type": "code", - "code": { - "caption": [], - "rich_text": [ - { - "type": "text", - "text": { - "content": "// slice.js\nimport { createSlice } from '@reduxjs/toolkit'\n\nexport const counterSlice = createSlice({\n name: 'counter',\n initialState: {\n value: 0,\n },\n reducers: {\n increment: (state) => {\n state.value += 1\n },\n decrement: (state) => {\n state.value -= 1\n },\n incrementByAmount: (state, action) => {\n state.value += action.payload\n },\n },\n})\n\nexport const { increment, decrement, incrementByAmount } = counterSlice.actions\n\nexport const selectCount = (state) => state.counter.value\n\nexport default counterSlice.reducer\n\n// store.js\nimport { configureStore } from '@reduxjs/toolkit';\nimport counterReducer from '../features/counter/counterSlice';\n\nexport default configureStore({\n reducer: {\n counter: counterReducer,\n },\n});\n\n// Counter.js\nimport React, { useState } from 'react';\nimport { useSelector, useDispatch } from 'react-redux';\nimport {\n decrement,\n increment,\n incrementByAmount,\n selectCount,\n} from './counterSlice';\nimport styles from './Counter.module.css';\n\nexport function Counter() {\n const count = useSelector(selectCount);\n const dispatch = useDispatch();\n const [incrementAmount, setIncrementAmount] = useState('2');\n\n return (\n
\n
\n dispatch(increment())}\n >\n +\n \n {count}\n dispatch(decrement())}\n >\n -\n \n
\n
\n setIncrementAmount(e.target.value)}\n />\n \n dispatch(incrementByAmount(Number(incrementAmount) || 0))\n }\n >\n Add Amount\n \n
\n
\n );\n}", - "link": null - }, - "annotations": { - "bold": false, - "italic": false, - "strikethrough": false, - "underline": false, - "code": false, - "color": "default" - }, - "plain_text": "// slice.js\nimport { createSlice } from '@reduxjs/toolkit'\n\nexport const counterSlice = createSlice({\n name: 'counter',\n initialState: {\n value: 0,\n },\n reducers: {\n increment: (state) => {\n state.value += 1\n },\n decrement: (state) => {\n state.value -= 1\n },\n incrementByAmount: (state, action) => {\n state.value += action.payload\n },\n },\n})\n\nexport const { increment, decrement, incrementByAmount } = counterSlice.actions\n\nexport const selectCount = (state) => state.counter.value\n\nexport default counterSlice.reducer\n\n// store.js\nimport { configureStore } from '@reduxjs/toolkit';\nimport counterReducer from '../features/counter/counterSlice';\n\nexport default configureStore({\n reducer: {\n counter: counterReducer,\n },\n});\n\n// Counter.js\nimport React, { useState } from 'react';\nimport { useSelector, useDispatch } from 'react-redux';\nimport {\n decrement,\n increment,\n incrementByAmount,\n selectCount,\n} from './counterSlice';\nimport styles from './Counter.module.css';\n\nexport function Counter() {\n const count = useSelector(selectCount);\n const dispatch = useDispatch();\n const [incrementAmount, setIncrementAmount] = useState('2');\n\n return (\n
\n
\n dispatch(increment())}\n >\n +\n \n {count}\n dispatch(decrement())}\n >\n -\n \n
\n
\n setIncrementAmount(e.target.value)}\n />\n \n dispatch(incrementByAmount(Number(incrementAmount) || 0))\n }\n >\n Add Amount\n \n
\n
\n );\n}", - "href": null - } - ], - "language": "typescript" - } - }, - { - "object": "block", - "id": "e4fc39b5-082e-4e8d-91df-80e9bd521adc", - "parent": { - "type": "page_id", - "page_id": "56874170-f8d4-4bcc-996e-be4e43f67930" - }, - "created_time": "2023-11-30T06:15:00.000Z", - "last_edited_time": "2023-12-01T11:56:00.000Z", - "created_by": { - "object": "user", - "id": "5146391e-8b65-47f2-83b6-2bfe81194f32" - }, - "last_edited_by": { - "object": "user", - "id": "5146391e-8b65-47f2-83b6-2bfe81194f32" - }, - "has_children": false, - "archived": false, - "in_trash": false, - "type": "paragraph", - "paragraph": { - "rich_text": [ - { - "type": "text", - "text": { - "content": "Redux를 사용하는 Counter 관련 코드만 가져왔다. 그럼에도 여전히 코드(보일러 플레이트)는 많다.\nredux-toolkit 사용 전에는 reselect, immer 등도 추가로 사용해야 했다.. 그나마 redux-toolkit를 사용하며 많이 준거다.\n여기에 비동기 통신을 위한 라이브러리 (redux-saga, rtk-query, redux-thunk)까지 덧붙이면 얼마나 코드가 많아질지 상상이 안 된다.", - "link": null - }, - "annotations": { - "bold": false, - "italic": false, - "strikethrough": false, - "underline": false, - "code": false, - "color": "default" - }, - "plain_text": "Redux를 사용하는 Counter 관련 코드만 가져왔다. 그럼에도 여전히 코드(보일러 플레이트)는 많다.\nredux-toolkit 사용 전에는 reselect, immer 등도 추가로 사용해야 했다.. 그나마 redux-toolkit를 사용하며 많이 준거다.\n여기에 비동기 통신을 위한 라이브러리 (redux-saga, rtk-query, redux-thunk)까지 덧붙이면 얼마나 코드가 많아질지 상상이 안 된다.", - "href": null - } - ], - "color": "default" - } - }, - { - "object": "block", - "id": "48d330d1-50ba-4424-bdc4-d144a70cef6b", - "parent": { - "type": "page_id", - "page_id": "56874170-f8d4-4bcc-996e-be4e43f67930" - }, - "created_time": "2023-11-30T06:15:00.000Z", - "last_edited_time": "2023-11-30T09:23:00.000Z", - "created_by": { - "object": "user", - "id": "5146391e-8b65-47f2-83b6-2bfe81194f32" - }, - "last_edited_by": { - "object": "user", - "id": "5146391e-8b65-47f2-83b6-2bfe81194f32" - }, - "has_children": false, - "archived": false, - "in_trash": false, - "type": "heading_3", - "heading_3": { - "rich_text": [ - { - "type": "text", - "text": { - "content": "Zustand", - "link": null - }, - "annotations": { - "bold": true, - "italic": false, - "strikethrough": false, - "underline": false, - "code": false, - "color": "default" - }, - "plain_text": "Zustand", - "href": null - } - ], - "is_toggleable": false, - "color": "default" - } - }, - { - "object": "block", - "id": "0b56d248-d97c-4275-b47b-e29f51f4827a", - "parent": { - "type": "page_id", - "page_id": "56874170-f8d4-4bcc-996e-be4e43f67930" - }, - "created_time": "2023-11-30T07:45:00.000Z", - "last_edited_time": "2023-11-30T07:53:00.000Z", - "created_by": { - "object": "user", - "id": "5146391e-8b65-47f2-83b6-2bfe81194f32" - }, - "last_edited_by": { - "object": "user", - "id": "5146391e-8b65-47f2-83b6-2bfe81194f32" - }, - "has_children": false, - "archived": false, - "in_trash": false, - "type": "image", - "image": { - "caption": [], - "type": "file", - "file": { - "url": "https://www.notion.so/image/https%3A%2F%2Fprod-files-secure.s3.us-west-2.amazonaws.com%2Fcd7314a5-d906-43b0-81e7-42eff82c02a3%2F4b59f38e-5374-411c-bbdd-91543d0484fd%2FUntitled.png?table=block&id=0b56d248-d97c-4275-b47b-e29f51f4827a&cache=v2", - "expiry_time": "2025-04-14T15:12:43.815Z" - }, - "format": { - "block_width": 1200, - "block_height": 600, - "block_aspect_ratio": 2 - } - } - }, - { - "object": "block", - "id": "f2eff5f1-a998-4287-981b-da15d380fa66", - "parent": { - "type": "page_id", - "page_id": "56874170-f8d4-4bcc-996e-be4e43f67930" - }, - "created_time": "2023-11-30T07:46:00.000Z", - "last_edited_time": "2023-11-30T07:46:00.000Z", - "created_by": { - "object": "user", - "id": "5146391e-8b65-47f2-83b6-2bfe81194f32" - }, - "last_edited_by": { - "object": "user", - "id": "5146391e-8b65-47f2-83b6-2bfe81194f32" - }, - "has_children": false, - "archived": false, - "in_trash": false, - "type": "quote", - "quote": { - "rich_text": [ - { - "type": "text", - "text": { - "content": "A small, fast, and scalable bearbones state management solution.", - "link": null - }, - "annotations": { - "bold": false, - "italic": false, - "strikethrough": false, - "underline": false, - "code": false, - "color": "default" - }, - "plain_text": "A small, fast, and scalable bearbones state management solution.", - "href": null - } - ], - "color": "default" - } - }, - { - "object": "block", - "id": "56d1ac99-6342-4c10-b1be-fb1d8b8a87a9", - "parent": { - "type": "page_id", - "page_id": "56874170-f8d4-4bcc-996e-be4e43f67930" - }, - "created_time": "2023-11-30T07:46:00.000Z", - "last_edited_time": "2023-12-01T11:57:00.000Z", - "created_by": { - "object": "user", - "id": "5146391e-8b65-47f2-83b6-2bfe81194f32" - }, - "last_edited_by": { - "object": "user", - "id": "5146391e-8b65-47f2-83b6-2bfe81194f32" - }, - "has_children": false, - "archived": false, - "in_trash": false, - "type": "paragraph", - "paragraph": { - "rich_text": [ - { - "type": "text", - "text": { - "content": "공식 문서 첫 문장에서 “Zustand는 작고, 빠르며 확장할 수 있는 bearbones 상태 솔루션이다” 라고 말한다.\nZustand는 독일어로 “상태”라는 뜻이고 Redux와 마찬가지로 특정 라이브러리에 종속되지 않아 여러 라이브러리, 프레임워크에서 사용할 수 있다.", - "link": null - }, - "annotations": { - "bold": false, - "italic": false, - "strikethrough": false, - "underline": false, - "code": false, - "color": "default" - }, - "plain_text": "공식 문서 첫 문장에서 “Zustand는 작고, 빠르며 확장할 수 있는 bearbones 상태 솔루션이다” 라고 말한다.\nZustand는 독일어로 “상태”라는 뜻이고 Redux와 마찬가지로 특정 라이브러리에 종속되지 않아 여러 라이브러리, 프레임워크에서 사용할 수 있다.", - "href": null - } - ], - "color": "default" - } - }, - { - "object": "block", - "id": "8d69c7c6-5893-49ea-97ad-8db328dd6ac8", - "parent": { - "type": "page_id", - "page_id": "56874170-f8d4-4bcc-996e-be4e43f67930" - }, - "created_time": "2023-11-30T07:37:00.000Z", - "last_edited_time": "2023-11-30T08:05:00.000Z", - "created_by": { - "object": "user", - "id": "5146391e-8b65-47f2-83b6-2bfe81194f32" - }, - "last_edited_by": { - "object": "user", - "id": "5146391e-8b65-47f2-83b6-2bfe81194f32" - }, - "has_children": false, - "archived": false, - "in_trash": false, - "type": "paragraph", - "paragraph": { - "rich_text": [ - { - "type": "text", - "text": { - "content": "Counter 예제 코드", - "link": null - }, - "annotations": { - "bold": true, - "italic": false, - "strikethrough": false, - "underline": false, - "code": false, - "color": "default" - }, - "plain_text": "Counter 예제 코드", - "href": null - } - ], - "color": "default" - } - }, - { - "object": "block", - "id": "b22b5c7b-84d2-407b-bbcc-aeda014930ec", - "parent": { - "type": "page_id", - "page_id": "56874170-f8d4-4bcc-996e-be4e43f67930" - }, - "created_time": "2023-11-30T07:37:00.000Z", - "last_edited_time": "2023-11-30T07:44:00.000Z", - "created_by": { - "object": "user", - "id": "5146391e-8b65-47f2-83b6-2bfe81194f32" - }, - "last_edited_by": { - "object": "user", - "id": "5146391e-8b65-47f2-83b6-2bfe81194f32" - }, - "has_children": false, - "archived": false, - "in_trash": false, - "type": "code", - "code": { - "caption": [], - "rich_text": [ - { - "type": "text", - "text": { - "content": "import { create } from 'zustand'\n\nconst useStore = create((set) => ({\n count: 1,\n inc: () => set((state) => ({ count: state.count + 1 })),\n\tdes: () => set((state) => ({ count: state.count - 1 })),\n\tincrementByAmount: (value) => set(() => ({ count: value })),\n}))\n\nfunction Counter() {\n const { count, inc, incrementByAmount } = useStore()\n\tconst [incrementAmount, setIncrementAmount] = useState('2');\n\n return (\n
\n
\n \n +\n \n {count}\n \n -\n \n
\n
\n setIncrementAmount(e.target.value)}\n />\n \n Add Amount\n \n
\n
\n );\n}", - "link": null - }, - "annotations": { - "bold": false, - "italic": false, - "strikethrough": false, - "underline": false, - "code": false, - "color": "default" - }, - "plain_text": "import { create } from 'zustand'\n\nconst useStore = create((set) => ({\n count: 1,\n inc: () => set((state) => ({ count: state.count + 1 })),\n\tdes: () => set((state) => ({ count: state.count - 1 })),\n\tincrementByAmount: (value) => set(() => ({ count: value })),\n}))\n\nfunction Counter() {\n const { count, inc, incrementByAmount } = useStore()\n\tconst [incrementAmount, setIncrementAmount] = useState('2');\n\n return (\n
\n
\n \n +\n \n {count}\n \n -\n \n
\n
\n setIncrementAmount(e.target.value)}\n />\n \n Add Amount\n \n
\n
\n );\n}", - "href": null - } - ], - "language": "typescript" - } - }, - { - "object": "block", - "id": "cd2858f4-9953-496a-bd4e-f1397b4f6ce1", - "parent": { - "type": "page_id", - "page_id": "56874170-f8d4-4bcc-996e-be4e43f67930" - }, - "created_time": "2023-11-30T05:29:00.000Z", - "last_edited_time": "2023-11-30T08:17:00.000Z", - "created_by": { - "object": "user", - "id": "5146391e-8b65-47f2-83b6-2bfe81194f32" - }, - "last_edited_by": { - "object": "user", - "id": "5146391e-8b65-47f2-83b6-2bfe81194f32" - }, - "has_children": false, - "archived": false, - "in_trash": false, - "type": "paragraph", - "paragraph": { - "rich_text": [ - { - "type": "text", - "text": { - "content": "Zustand는 Pub/Sub 모델을 기반으로 하며 스토어의 상태 변경이 일어날 때 해당 상태를 구독하는 리스너들에게 상태가 변경되었다고 전파한다. ", - "link": null - }, - "annotations": { - "bold": false, - "italic": false, - "strikethrough": false, - "underline": false, - "code": false, - "color": "default" - }, - "plain_text": "Zustand는 Pub/Sub 모델을 기반으로 하며 스토어의 상태 변경이 일어날 때 해당 상태를 구독하는 리스너들에게 상태가 변경되었다고 전파한다. ", - "href": null - } - ], - "color": "default" - } - }, - { - "object": "block", - "id": "102f5e8f-2295-4df1-8d26-1b79d53d1a1a", - "parent": { - "type": "page_id", - "page_id": "56874170-f8d4-4bcc-996e-be4e43f67930" - }, - "created_time": "2023-11-30T08:16:00.000Z", - "last_edited_time": "2023-12-01T11:57:00.000Z", - "created_by": { - "object": "user", - "id": "5146391e-8b65-47f2-83b6-2bfe81194f32" - }, - "last_edited_by": { - "object": "user", - "id": "5146391e-8b65-47f2-83b6-2bfe81194f32" - }, - "has_children": false, - "archived": false, - "in_trash": false, - "type": "paragraph", - "paragraph": { - "rich_text": [ - { - "type": "text", - "text": { - "content": "Zustand의 Core 코드는 짧고 이해하기도 쉽다고 들었는데 한번 읽어보자!", - "link": null - }, - "annotations": { - "bold": false, - "italic": false, - "strikethrough": false, - "underline": false, - "code": false, - "color": "default" - }, - "plain_text": "Zustand의 Core 코드는 짧고 이해하기도 쉽다고 들었는데 한번 읽어보자!", - "href": null - } - ], - "color": "default" - } - }, - { - "object": "block", - "id": "2c8c4293-6b74-47da-b206-d79bc8a17891", - "parent": { - "type": "page_id", - "page_id": "56874170-f8d4-4bcc-996e-be4e43f67930" - }, - "created_time": "2023-12-01T05:37:00.000Z", - "last_edited_time": "2023-12-01T07:20:00.000Z", - "created_by": { - "object": "user", - "id": "5146391e-8b65-47f2-83b6-2bfe81194f32" - }, - "last_edited_by": { - "object": "user", - "id": "5146391e-8b65-47f2-83b6-2bfe81194f32" - }, - "has_children": true, - "archived": false, - "in_trash": false, - "type": "toggle", - "toggle": { - "rich_text": [ - { - "type": "text", - "text": { - "content": "Zustand의 Core 코드", - "link": { - "url": "https://github.com/pmndrs/zustand/blob/main/src/vanilla.ts" - } - }, - "annotations": { - "bold": true, - "italic": false, - "strikethrough": false, - "underline": false, - "code": false, - "color": "default" - }, - "plain_text": "Zustand의 Core 코드", - "href": "https://github.com/pmndrs/zustand/blob/main/src/vanilla.ts" - } - ], - "color": "default" - }, - "children": [ - { - "object": "block", - "id": "1f8eac51-7a2c-4cb0-a836-13b779d81853", - "parent": { - "type": "block_id", - "block_id": "2c8c4293-6b74-47da-b206-d79bc8a17891" - }, - "created_time": "2023-11-30T08:09:00.000Z", - "last_edited_time": "2023-12-01T05:37:00.000Z", - "created_by": { - "object": "user", - "id": "5146391e-8b65-47f2-83b6-2bfe81194f32" - }, - "last_edited_by": { - "object": "user", - "id": "5146391e-8b65-47f2-83b6-2bfe81194f32" - }, - "has_children": false, - "archived": false, - "in_trash": false, - "type": "code", - "code": { - "caption": [], - "rich_text": [ - { - "type": "text", - "text": { - "content": "...\n\nconst createStoreImpl = (createState) => {\n let state;\n const listeners = new Set();\n\n const setState = (partial, replace) => {\n const nextState = typeof partial === \"function\" ? partial(state) : partial;\n if (!Object.is(nextState, state)) {\n const previousState = state;\n state =\n replace ?? (typeof nextState !== \"object\" || nextState === null)\n ? nextState\n : Object.assign({}, state, nextState);\n listeners.forEach((listener) => listener(state, previousState));\n }\n };\n\n const getState = () => state;\n\n const subscribe = (listener) => {\n listeners.add(listener);\n // Unsubscribe\n return () => listeners.delete(listener);\n };\n\n const api = { setState, getState, subscribe };\n state = createState(setState, getState, api);\n return api;\n};\n\nconst create = (createState) =>\n createState ? createStoreImpl(createState) : createStoreImpl;\n\nconst subscribeWithSelector = (fn) => (set, get, api) => {\n const origSubscribe = api.subscribe;\n api.subscribe = (selector, optListener, options) => {\n let listener = selector; // if no selector\n if (optListener) {\n const equalityFn = options?.equalityFn || Object.is;\n let currentSlice = selector(api.getState());\n listener = (state) => {\n const nextSlice = selector(state);\n if (!equalityFn(currentSlice, nextSlice)) {\n const previousSlice = currentSlice;\n optListener((currentSlice = nextSlice), previousSlice);\n }\n };\n if (options?.fireImmediately) {\n optListener(currentSlice, currentSlice);\n }\n }\n return origSubscribe(listener);\n };\n const initialState = fn(set, get, api);\n return initialState;\n};\n\n...", - "link": null - }, - "annotations": { - "bold": false, - "italic": false, - "strikethrough": false, - "underline": false, - "code": false, - "color": "default" - }, - "plain_text": "...\n\nconst createStoreImpl = (createState) => {\n let state;\n const listeners = new Set();\n\n const setState = (partial, replace) => {\n const nextState = typeof partial === \"function\" ? partial(state) : partial;\n if (!Object.is(nextState, state)) {\n const previousState = state;\n state =\n replace ?? (typeof nextState !== \"object\" || nextState === null)\n ? nextState\n : Object.assign({}, state, nextState);\n listeners.forEach((listener) => listener(state, previousState));\n }\n };\n\n const getState = () => state;\n\n const subscribe = (listener) => {\n listeners.add(listener);\n // Unsubscribe\n return () => listeners.delete(listener);\n };\n\n const api = { setState, getState, subscribe };\n state = createState(setState, getState, api);\n return api;\n};\n\nconst create = (createState) =>\n createState ? createStoreImpl(createState) : createStoreImpl;\n\nconst subscribeWithSelector = (fn) => (set, get, api) => {\n const origSubscribe = api.subscribe;\n api.subscribe = (selector, optListener, options) => {\n let listener = selector; // if no selector\n if (optListener) {\n const equalityFn = options?.equalityFn || Object.is;\n let currentSlice = selector(api.getState());\n listener = (state) => {\n const nextSlice = selector(state);\n if (!equalityFn(currentSlice, nextSlice)) {\n const previousSlice = currentSlice;\n optListener((currentSlice = nextSlice), previousSlice);\n }\n };\n if (options?.fireImmediately) {\n optListener(currentSlice, currentSlice);\n }\n }\n return origSubscribe(listener);\n };\n const initialState = fn(set, get, api);\n return initialState;\n};\n\n...", - "href": null - } - ], - "language": "typescript" - } - } - ] - }, - { - "object": "block", - "id": "a6502247-273c-43fb-95f6-c75d5e8268e8", - "parent": { - "type": "page_id", - "page_id": "56874170-f8d4-4bcc-996e-be4e43f67930" - }, - "created_time": "2023-11-30T08:16:00.000Z", - "last_edited_time": "2023-12-01T05:25:00.000Z", - "created_by": { - "object": "user", - "id": "5146391e-8b65-47f2-83b6-2bfe81194f32" - }, - "last_edited_by": { - "object": "user", - "id": "5146391e-8b65-47f2-83b6-2bfe81194f32" - }, - "has_children": false, - "archived": false, - "in_trash": false, - "type": "paragraph", - "paragraph": { - "rich_text": [ - { - "type": "text", - "text": { - "content": "타입들은 제거했다. 복잡해보일수도 있지만 ", - "link": null - }, - "annotations": { - "bold": false, - "italic": false, - "strikethrough": false, - "underline": false, - "code": false, - "color": "default" - }, - "plain_text": "타입들은 제거했다. 복잡해보일수도 있지만 ", - "href": null - }, - { - "type": "text", - "text": { - "content": "listeners", - "link": null - }, - "annotations": { - "bold": false, - "italic": false, - "strikethrough": false, - "underline": false, - "code": true, - "color": "default" - }, - "plain_text": "listeners", - "href": null - }, - { - "type": "text", - "text": { - "content": " , ", - "link": null - }, - "annotations": { - "bold": false, - "italic": false, - "strikethrough": false, - "underline": false, - "code": false, - "color": "default" - }, - "plain_text": " , ", - "href": null - }, - { - "type": "text", - "text": { - "content": "setState", - "link": null - }, - "annotations": { - "bold": false, - "italic": false, - "strikethrough": false, - "underline": false, - "code": true, - "color": "default" - }, - "plain_text": "setState", - "href": null - }, - { - "type": "text", - "text": { - "content": " , ", - "link": null - }, - "annotations": { - "bold": false, - "italic": false, - "strikethrough": false, - "underline": false, - "code": false, - "color": "default" - }, - "plain_text": " , ", - "href": null - }, - { - "type": "text", - "text": { - "content": "getState", - "link": null - }, - "annotations": { - "bold": false, - "italic": false, - "strikethrough": false, - "underline": false, - "code": true, - "color": "default" - }, - "plain_text": "getState", - "href": null - }, - { - "type": "text", - "text": { - "content": " , ", - "link": null - }, - "annotations": { - "bold": false, - "italic": false, - "strikethrough": false, - "underline": false, - "code": false, - "color": "default" - }, - "plain_text": " , ", - "href": null - }, - { - "type": "text", - "text": { - "content": "subscribe", - "link": null - }, - "annotations": { - "bold": false, - "italic": false, - "strikethrough": false, - "underline": false, - "code": true, - "color": "default" - }, - "plain_text": "subscribe", - "href": null - }, - { - "type": "text", - "text": { - "content": " , ", - "link": null - }, - "annotations": { - "bold": false, - "italic": false, - "strikethrough": false, - "underline": false, - "code": false, - "color": "default" - }, - "plain_text": " , ", - "href": null - }, - { - "type": "text", - "text": { - "content": "subscribeWithSelector ", - "link": null - }, - "annotations": { - "bold": false, - "italic": false, - "strikethrough": false, - "underline": false, - "code": true, - "color": "default" - }, - "plain_text": "subscribeWithSelector ", - "href": null - }, - { - "type": "text", - "text": { - "content": "에 각각 포커스를 해가며 읽어보자", - "link": null - }, - "annotations": { - "bold": false, - "italic": false, - "strikethrough": false, - "underline": false, - "code": false, - "color": "default" - }, - "plain_text": "에 각각 포커스를 해가며 읽어보자", - "href": null - } - ], - "color": "default" - } - }, - { - "object": "block", - "id": "7ebedad8-08d3-4630-a889-b17f4a7e10d7", - "parent": { - "type": "page_id", - "page_id": "56874170-f8d4-4bcc-996e-be4e43f67930" - }, - "created_time": "2023-11-30T08:21:00.000Z", - "last_edited_time": "2023-12-01T11:59:00.000Z", - "created_by": { - "object": "user", - "id": "5146391e-8b65-47f2-83b6-2bfe81194f32" - }, - "last_edited_by": { - "object": "user", - "id": "5146391e-8b65-47f2-83b6-2bfe81194f32" - }, - "has_children": false, - "archived": false, - "in_trash": false, - "type": "paragraph", - "paragraph": { - "rich_text": [ - { - "type": "text", - "text": { - "content": "const listeners = new Set()", - "link": null - }, - "annotations": { - "bold": false, - "italic": false, - "strikethrough": false, - "underline": false, - "code": true, - "color": "default" - }, - "plain_text": "const listeners = new Set()", - "href": null - }, - { - "type": "text", - "text": { - "content": " : 구독하는 리스너를 자료구조 Set으로 관리한다.", - "link": null - }, - "annotations": { - "bold": false, - "italic": false, - "strikethrough": false, - "underline": false, - "code": false, - "color": "default" - }, - "plain_text": " : 구독하는 리스너를 자료구조 Set으로 관리한다.", - "href": null - } - ], - "color": "default" - } - }, - { - "object": "block", - "id": "5ea26bb0-9e47-4595-a083-069273a78ac0", - "parent": { - "type": "page_id", - "page_id": "56874170-f8d4-4bcc-996e-be4e43f67930" - }, - "created_time": "2023-11-30T08:22:00.000Z", - "last_edited_time": "2023-12-14T12:12:00.000Z", - "created_by": { - "object": "user", - "id": "5146391e-8b65-47f2-83b6-2bfe81194f32" - }, - "last_edited_by": { - "object": "user", - "id": "5146391e-8b65-47f2-83b6-2bfe81194f32" - }, - "has_children": false, - "archived": false, - "in_trash": false, - "type": "code", - "code": { - "caption": [], - "rich_text": [ - { - "type": "text", - "text": { - "content": "const setState = (partial, replace) => {\n // partial이 함수면 함수형 업데이트, 함수가 아닌 경우 partial을 다음 State로 한다.\n const nextState = typeof partial === \"function\" ? partial(state) : partial;\n\n // Object.is로 기존 상태와 다음 상태의 얕은 비교를 수행한다.\n if (!Object.is(nextState, state)) {\n const previousState = state;\n // replace 값이 truthy인 경우, nextState를 그대로 할당하여 현재 상태를 교체한다.\n // replace 값이 falsy인 경우, state와 nextState를 합친 새로운 객체를 현재 상태로 교체한다.\n // replace 값이 undefined 또는 null인 경우, nextState가 object가 아니거나, null인 경우\n // nextState를 그대로 할당 현재 상태를 교체,\n // 그 외의 경우 state와 nextState를 합친 새로운 객체를 현재 상태로 교체한다.\n state =\n replace ?? (typeof nextState !== \"object\" || nextState === null)\n ? nextState\n : Object.assign({}, state, nextState);\n\n // Loop를 돌며, listener에 인자을 넣어준다.\n listeners.forEach((listener) => listener(state, previousState));\n }\n};", - "link": null - }, - "annotations": { - "bold": false, - "italic": false, - "strikethrough": false, - "underline": false, - "code": false, - "color": "default" - }, - "plain_text": "const setState = (partial, replace) => {\n // partial이 함수면 함수형 업데이트, 함수가 아닌 경우 partial을 다음 State로 한다.\n const nextState = typeof partial === \"function\" ? partial(state) : partial;\n\n // Object.is로 기존 상태와 다음 상태의 얕은 비교를 수행한다.\n if (!Object.is(nextState, state)) {\n const previousState = state;\n // replace 값이 truthy인 경우, nextState를 그대로 할당하여 현재 상태를 교체한다.\n // replace 값이 falsy인 경우, state와 nextState를 합친 새로운 객체를 현재 상태로 교체한다.\n // replace 값이 undefined 또는 null인 경우, nextState가 object가 아니거나, null인 경우\n // nextState를 그대로 할당 현재 상태를 교체,\n // 그 외의 경우 state와 nextState를 합친 새로운 객체를 현재 상태로 교체한다.\n state =\n replace ?? (typeof nextState !== \"object\" || nextState === null)\n ? nextState\n : Object.assign({}, state, nextState);\n\n // Loop를 돌며, listener에 인자을 넣어준다.\n listeners.forEach((listener) => listener(state, previousState));\n }\n};", - "href": null - } - ], - "language": "typescript" - } - }, - { - "object": "block", - "id": "9dffd65b-248f-414c-af89-af8877b11274", - "parent": { - "type": "page_id", - "page_id": "56874170-f8d4-4bcc-996e-be4e43f67930" - }, - "created_time": "2023-11-30T08:51:00.000Z", - "last_edited_time": "2023-12-14T12:13:00.000Z", - "created_by": { - "object": "user", - "id": "5146391e-8b65-47f2-83b6-2bfe81194f32" - }, - "last_edited_by": { - "object": "user", - "id": "5146391e-8b65-47f2-83b6-2bfe81194f32" - }, - "has_children": false, - "archived": false, - "in_trash": false, - "type": "code", - "code": { - "caption": [], - "rich_text": [ - { - "type": "text", - "text": { - "content": "const subscribe = (listener) => {\n // 상태를 구독하는 함수를 등록한다.\n listeners.add(listener)\n // Unsubscribe\n return () => listeners.delete(listener)\n}", - "link": null - }, - "annotations": { - "bold": false, - "italic": false, - "strikethrough": false, - "underline": false, - "code": false, - "color": "default" - }, - "plain_text": "const subscribe = (listener) => {\n // 상태를 구독하는 함수를 등록한다.\n listeners.add(listener)\n // Unsubscribe\n return () => listeners.delete(listener)\n}", - "href": null - } - ], - "language": "typescript" - } - }, - { - "object": "block", - "id": "eabf6c81-871d-4b51-a8ac-0325f8586b03", - "parent": { - "type": "page_id", - "page_id": "56874170-f8d4-4bcc-996e-be4e43f67930" - }, - "created_time": "2023-11-30T08:23:00.000Z", - "last_edited_time": "2023-12-01T11:59:00.000Z", - "created_by": { - "object": "user", - "id": "5146391e-8b65-47f2-83b6-2bfe81194f32" - }, - "last_edited_by": { - "object": "user", - "id": "5146391e-8b65-47f2-83b6-2bfe81194f32" - }, - "has_children": false, - "archived": false, - "in_trash": false, - "type": "paragraph", - "paragraph": { - "rich_text": [ - { - "type": "text", - "text": { - "content": "const getState = () => state", - "link": null - }, - "annotations": { - "bold": false, - "italic": false, - "strikethrough": false, - "underline": false, - "code": true, - "color": "default" - }, - "plain_text": "const getState = () => state", - "href": null - }, - { - "type": "text", - "text": { - "content": " : State를 반환한다.", - "link": null - }, - "annotations": { - "bold": false, - "italic": false, - "strikethrough": false, - "underline": false, - "code": false, - "color": "default" - }, - "plain_text": " : State를 반환한다.", - "href": null - } - ], - "color": "default" - } - }, - { - "object": "block", - "id": "97a053fe-35b2-4beb-8f76-1431c91bba05", - "parent": { - "type": "page_id", - "page_id": "56874170-f8d4-4bcc-996e-be4e43f67930" - }, - "created_time": "2023-12-01T05:26:00.000Z", - "last_edited_time": "2023-12-01T08:35:00.000Z", - "created_by": { - "object": "user", - "id": "5146391e-8b65-47f2-83b6-2bfe81194f32" - }, - "last_edited_by": { - "object": "user", - "id": "5146391e-8b65-47f2-83b6-2bfe81194f32" - }, - "has_children": false, - "archived": false, - "in_trash": false, - "type": "code", - "code": { - "caption": [], - "rich_text": [ - { - "type": "text", - "text": { - "content": "const subscribeWithSelector = (fn) => (set, get, api) => {\n const origSubscribe = api.subscribe;\n api.subscribe = (selector, optListener, options) => {\n let listener = selector; // if no selector\n if (optListener) {\n const equalityFn = options?.equalityFn || Object.is;\n let currentSlice = selector(api.getState());\n listener = (state) => {\n const nextSlice = selector(state);\n if (!equalityFn(currentSlice, nextSlice)) {\n const previousSlice = currentSlice;\n optListener((currentSlice = nextSlice), previousSlice);\n }\n };\n if (options?.fireImmediately) {\n optListener(currentSlice, currentSlice);\n }\n }\n return origSubscribe(listener);\n };\n const initialState = fn(set, get, api);\n return initialState;\n};", - "link": null - }, - "annotations": { - "bold": false, - "italic": false, - "strikethrough": false, - "underline": false, - "code": false, - "color": "default" - }, - "plain_text": "const subscribeWithSelector = (fn) => (set, get, api) => {\n const origSubscribe = api.subscribe;\n api.subscribe = (selector, optListener, options) => {\n let listener = selector; // if no selector\n if (optListener) {\n const equalityFn = options?.equalityFn || Object.is;\n let currentSlice = selector(api.getState());\n listener = (state) => {\n const nextSlice = selector(state);\n if (!equalityFn(currentSlice, nextSlice)) {\n const previousSlice = currentSlice;\n optListener((currentSlice = nextSlice), previousSlice);\n }\n };\n if (options?.fireImmediately) {\n optListener(currentSlice, currentSlice);\n }\n }\n return origSubscribe(listener);\n };\n const initialState = fn(set, get, api);\n return initialState;\n};", - "href": null - } - ], - "language": "typescript" - } - }, - { - "object": "block", - "id": "da109a5f-cef7-41ea-8d4f-d62e4eef545c", - "parent": { - "type": "page_id", - "page_id": "56874170-f8d4-4bcc-996e-be4e43f67930" - }, - "created_time": "2023-12-01T05:37:00.000Z", - "last_edited_time": "2023-12-05T05:22:00.000Z", - "created_by": { - "object": "user", - "id": "5146391e-8b65-47f2-83b6-2bfe81194f32" - }, - "last_edited_by": { - "object": "user", - "id": "5146391e-8b65-47f2-83b6-2bfe81194f32" - }, - "has_children": false, - "archived": false, - "in_trash": false, - "type": "paragraph", - "paragraph": { - "rich_text": [ - { - "type": "text", - "text": { - "content": "간단하게 설명하면 store를 만들 때 위 함수를 사용하면 어떠한 상태를 구독할 때 해당 상태의 이전, 이후 값을 비교하는 로직이 추가된다.", - "link": null - }, - "annotations": { - "bold": false, - "italic": false, - "strikethrough": false, - "underline": false, - "code": false, - "color": "default" - }, - "plain_text": "간단하게 설명하면 store를 만들 때 위 함수를 사용하면 어떠한 상태를 구독할 때 해당 상태의 이전, 이후 값을 비교하는 로직이 추가된다.", - "href": null - } - ], - "color": "default" - } - }, - { - "object": "block", - "id": "4d42436c-be70-4754-949a-553da046a6f6", - "parent": { - "type": "page_id", - "page_id": "56874170-f8d4-4bcc-996e-be4e43f67930" - }, - "created_time": "2023-11-30T09:19:00.000Z", - "last_edited_time": "2023-11-30T09:19:00.000Z", - "created_by": { - "object": "user", - "id": "5146391e-8b65-47f2-83b6-2bfe81194f32" - }, - "last_edited_by": { - "object": "user", - "id": "5146391e-8b65-47f2-83b6-2bfe81194f32" - }, - "has_children": false, - "archived": false, - "in_trash": false, - "type": "paragraph", - "paragraph": { - "rich_text": [ - { - "type": "text", - "text": { - "content": "사용법", - "link": null - }, - "annotations": { - "bold": true, - "italic": false, - "strikethrough": false, - "underline": false, - "code": false, - "color": "default" - }, - "plain_text": "사용법", - "href": null - } - ], - "color": "default" - } - }, - { - "object": "block", - "id": "16ffc92b-1409-446f-a29c-0c85462b81b7", - "parent": { - "type": "page_id", - "page_id": "56874170-f8d4-4bcc-996e-be4e43f67930" - }, - "created_time": "2023-11-30T09:19:00.000Z", - "last_edited_time": "2023-12-14T12:12:00.000Z", - "created_by": { - "object": "user", - "id": "5146391e-8b65-47f2-83b6-2bfe81194f32" - }, - "last_edited_by": { - "object": "user", - "id": "5146391e-8b65-47f2-83b6-2bfe81194f32" - }, - "has_children": false, - "archived": false, - "in_trash": false, - "type": "code", - "code": { - "caption": [], - "rich_text": [ - { - "type": "text", - "text": { - "content": "const store = create(\n subscribeWithSelector((set) => ({\n count: 0,\n text: \"\",\n inc: () => set((state) => ({ count: state.count + 1 })),\n setText: (text) => set({ text }),\n }))\n);\n\nstore.subscribe((state) => console.log(\"State is changed: \", state));\n\nstore.subscribe(\n (state) => state.count,\n (count) => console.log(\"Count is changed: \", count)\n);\n\nstore.subscribe(\n (state) => state.text,\n (text) => console.log(\"Text is changed: \", text)\n);\n\nstore.getState().inc();\nstore.getState().setText('Changed');", - "link": null - }, - "annotations": { - "bold": false, - "italic": false, - "strikethrough": false, - "underline": false, - "code": false, - "color": "default" - }, - "plain_text": "const store = create(\n subscribeWithSelector((set) => ({\n count: 0,\n text: \"\",\n inc: () => set((state) => ({ count: state.count + 1 })),\n setText: (text) => set({ text }),\n }))\n);\n\nstore.subscribe((state) => console.log(\"State is changed: \", state));\n\nstore.subscribe(\n (state) => state.count,\n (count) => console.log(\"Count is changed: \", count)\n);\n\nstore.subscribe(\n (state) => state.text,\n (text) => console.log(\"Text is changed: \", text)\n);\n\nstore.getState().inc();\nstore.getState().setText('Changed');", - "href": null - } - ], - "language": "typescript" - } - }, - { - "object": "block", - "id": "bb09f34a-9db9-4de6-a82e-d118701b227f", - "parent": { - "type": "page_id", - "page_id": "56874170-f8d4-4bcc-996e-be4e43f67930" - }, - "created_time": "2023-11-30T05:29:00.000Z", - "last_edited_time": "2023-11-30T09:27:00.000Z", - "created_by": { - "object": "user", - "id": "5146391e-8b65-47f2-83b6-2bfe81194f32" - }, - "last_edited_by": { - "object": "user", - "id": "5146391e-8b65-47f2-83b6-2bfe81194f32" - }, - "has_children": false, - "archived": false, - "in_trash": false, - "type": "paragraph", - "paragraph": { - "rich_text": [ - { - "type": "text", - "text": { - "content": "리액트와 같이 사용하기", - "link": null - }, - "annotations": { - "bold": true, - "italic": false, - "strikethrough": false, - "underline": false, - "code": false, - "color": "default" - }, - "plain_text": "리액트와 같이 사용하기", - "href": null - } - ], - "color": "default" - } - }, - { - "object": "block", - "id": "38e2b342-5173-4609-9eac-aaeda5811b92", - "parent": { - "type": "page_id", - "page_id": "56874170-f8d4-4bcc-996e-be4e43f67930" - }, - "created_time": "2023-11-30T12:10:00.000Z", - "last_edited_time": "2023-12-01T12:00:00.000Z", - "created_by": { - "object": "user", - "id": "5146391e-8b65-47f2-83b6-2bfe81194f32" - }, - "last_edited_by": { - "object": "user", - "id": "5146391e-8b65-47f2-83b6-2bfe81194f32" - }, - "has_children": false, - "archived": false, - "in_trash": false, - "type": "paragraph", - "paragraph": { - "rich_text": [ - { - "type": "text", - "text": { - "content": "현재 최신버전 (v4.4.7)의 Zustand는 React의 ", - "link": null - }, - "annotations": { - "bold": false, - "italic": false, - "strikethrough": false, - "underline": false, - "code": false, - "color": "default" - }, - "plain_text": "현재 최신버전 (v4.4.7)의 Zustand는 React의 ", - "href": null - }, - { - "type": "text", - "text": { - "content": "useSyncExternalStore", - "link": null - }, - "annotations": { - "bold": false, - "italic": false, - "strikethrough": false, - "underline": false, - "code": true, - "color": "default" - }, - "plain_text": "useSyncExternalStore", - "href": null - }, - { - "type": "text", - "text": { - "content": "을 활용해 React Component에서 사용할 수 있는 방법을 제공한다.", - "link": null - }, - "annotations": { - "bold": false, - "italic": false, - "strikethrough": false, - "underline": false, - "code": false, - "color": "default" - }, - "plain_text": "을 활용해 React Component에서 사용할 수 있는 방법을 제공한다.", - "href": null - } - ], - "color": "default" - } - }, - { - "object": "block", - "id": "5a2feb8f-b454-47e7-b62c-28c1f30cbe7d", - "parent": { - "type": "page_id", - "page_id": "56874170-f8d4-4bcc-996e-be4e43f67930" - }, - "created_time": "2023-11-30T12:11:00.000Z", - "last_edited_time": "2023-12-05T05:20:00.000Z", - "created_by": { - "object": "user", - "id": "5146391e-8b65-47f2-83b6-2bfe81194f32" - }, - "last_edited_by": { - "object": "user", - "id": "5146391e-8b65-47f2-83b6-2bfe81194f32" - }, - "has_children": false, - "archived": false, - "in_trash": false, - "type": "code", - "code": { - "caption": [], - "rich_text": [ - { - "type": "text", - "text": { - "content": "import ReactExports from 'react'\nimport useSyncExternalStoreExports from 'use-sync-external-store/shim/with-selector'\nimport { createStore } from './vanilla.ts'\n\nconst { useSyncExternalStoreWithSelector } = useSyncExternalStoreExports\n\nlet didWarnAboutEqualityFn = false\n\n...\n\nexport function useStore(\n api: WithReact>,\n selector: (state: TState) => StateSlice = api.getState as any,\n equalityFn?: (a: StateSlice, b: StateSlice) => boolean,\n) {\n\t...\n const slice = useSyncExternalStoreWithSelector(\n api.subscribe,\n api.getState,\n api.getServerState || api.getState,\n selector,\n equalityFn,\n )\n return slice\n}\n\nconst createImpl = (createState: StateCreator) => {\n const api =\n typeof createState === 'function' ? createStore(createState) : createState\n\n const useBoundStore: any = (selector?: any, equalityFn?: any) =>\n useStore(api, selector, equalityFn)\n\n Object.assign(useBoundStore, api)\n\n return useBoundStore\n}\n\n...", - "link": null - }, - "annotations": { - "bold": false, - "italic": false, - "strikethrough": false, - "underline": false, - "code": false, - "color": "default" - }, - "plain_text": "import ReactExports from 'react'\nimport useSyncExternalStoreExports from 'use-sync-external-store/shim/with-selector'\nimport { createStore } from './vanilla.ts'\n\nconst { useSyncExternalStoreWithSelector } = useSyncExternalStoreExports\n\nlet didWarnAboutEqualityFn = false\n\n...\n\nexport function useStore(\n api: WithReact>,\n selector: (state: TState) => StateSlice = api.getState as any,\n equalityFn?: (a: StateSlice, b: StateSlice) => boolean,\n) {\n\t...\n const slice = useSyncExternalStoreWithSelector(\n api.subscribe,\n api.getState,\n api.getServerState || api.getState,\n selector,\n equalityFn,\n )\n return slice\n}\n\nconst createImpl = (createState: StateCreator) => {\n const api =\n typeof createState === 'function' ? createStore(createState) : createState\n\n const useBoundStore: any = (selector?: any, equalityFn?: any) =>\n useStore(api, selector, equalityFn)\n\n Object.assign(useBoundStore, api)\n\n return useBoundStore\n}\n\n...", - "href": null - } - ], - "language": "javascript" - } - }, - { - "object": "block", - "id": "2e96b19f-4ecb-4d1b-879d-b0abcef93311", - "parent": { - "type": "page_id", - "page_id": "56874170-f8d4-4bcc-996e-be4e43f67930" - }, - "created_time": "2023-11-30T12:29:00.000Z", - "last_edited_time": "2023-12-05T05:22:00.000Z", - "created_by": { - "object": "user", - "id": "5146391e-8b65-47f2-83b6-2bfe81194f32" - }, - "last_edited_by": { - "object": "user", - "id": "5146391e-8b65-47f2-83b6-2bfe81194f32" - }, - "has_children": false, - "archived": false, - "in_trash": false, - "type": "paragraph", - "paragraph": { - "rich_text": [ - { - "type": "text", - "text": { - "content": "이전 Zustand 버전에서는 ", - "link": null - }, - "annotations": { - "bold": false, - "italic": false, - "strikethrough": false, - "underline": false, - "code": false, - "color": "default" - }, - "plain_text": "이전 Zustand 버전에서는 ", - "href": null - }, - { - "type": "text", - "text": { - "content": "useEffect, useLayoutEffect, useReducer, useRef", - "link": null - }, - "annotations": { - "bold": false, - "italic": false, - "strikethrough": false, - "underline": false, - "code": true, - "color": "default" - }, - "plain_text": "useEffect, useLayoutEffect, useReducer, useRef", - "href": null - }, - { - "type": "text", - "text": { - "content": " 등 hooks를 활용해서 ", - "link": null - }, - "annotations": { - "bold": false, - "italic": false, - "strikethrough": false, - "underline": false, - "code": false, - "color": "default" - }, - "plain_text": " 등 hooks를 활용해서 ", - "href": null - }, - { - "type": "text", - "text": { - "content": "useStore", - "link": null - }, - "annotations": { - "bold": false, - "italic": false, - "strikethrough": false, - "underline": false, - "code": true, - "color": "default" - }, - "plain_text": "useStore", - "href": null - }, - { - "type": "text", - "text": { - "content": " 를 구현하였는데 최신버전은 React 18에서 사용할 수 있는 ", - "link": null - }, - "annotations": { - "bold": false, - "italic": false, - "strikethrough": false, - "underline": false, - "code": false, - "color": "default" - }, - "plain_text": " 를 구현하였는데 최신버전은 React 18에서 사용할 수 있는 ", - "href": null - }, - { - "type": "text", - "text": { - "content": "useSyncExternalStore", - "link": null - }, - "annotations": { - "bold": false, - "italic": false, - "strikethrough": false, - "underline": false, - "code": true, - "color": "default" - }, - "plain_text": "useSyncExternalStore", - "href": null - }, - { - "type": "text", - "text": { - "content": " 를 사용했다.", - "link": null - }, - "annotations": { - "bold": false, - "italic": false, - "strikethrough": false, - "underline": false, - "code": false, - "color": "default" - }, - "plain_text": " 를 사용했다.", - "href": null - } - ], - "color": "default" - } - }, - { - "object": "block", - "id": "a0f48eb2-e67a-48f5-be0f-92692eeb9a5b", - "parent": { - "type": "page_id", - "page_id": "56874170-f8d4-4bcc-996e-be4e43f67930" - }, - "created_time": "2023-12-05T05:22:00.000Z", - "last_edited_time": "2023-12-05T05:29:00.000Z", - "created_by": { - "object": "user", - "id": "5146391e-8b65-47f2-83b6-2bfe81194f32" - }, - "last_edited_by": { - "object": "user", - "id": "5146391e-8b65-47f2-83b6-2bfe81194f32" - }, - "has_children": false, - "archived": false, - "in_trash": false, - "type": "paragraph", - "paragraph": { - "rich_text": [ - { - "type": "text", - "text": { - "content": "Counter 예제코드의 ", - "link": null - }, - "annotations": { - "bold": false, - "italic": false, - "strikethrough": false, - "underline": false, - "code": false, - "color": "default" - }, - "plain_text": "Counter 예제코드의 ", - "href": null - }, - { - "type": "text", - "text": { - "content": "import { create } from 'zustand'", - "link": null - }, - "annotations": { - "bold": false, - "italic": false, - "strikethrough": false, - "underline": false, - "code": true, - "color": "default" - }, - "plain_text": "import { create } from 'zustand'", - "href": null - }, - { - "type": "text", - "text": { - "content": " 에서 ", - "link": null - }, - "annotations": { - "bold": false, - "italic": false, - "strikethrough": false, - "underline": false, - "code": false, - "color": "default" - }, - "plain_text": " 에서 ", - "href": null - }, - { - "type": "text", - "text": { - "content": "create", - "link": null - }, - "annotations": { - "bold": false, - "italic": false, - "strikethrough": false, - "underline": false, - "code": true, - "color": "default" - }, - "plain_text": "create", - "href": null - }, - { - "type": "text", - "text": { - "content": " 는 ", - "link": null - }, - "annotations": { - "bold": false, - "italic": false, - "strikethrough": false, - "underline": false, - "code": false, - "color": "default" - }, - "plain_text": " 는 ", - "href": null - }, - { - "type": "text", - "text": { - "content": "createImpl", - "link": null - }, - "annotations": { - "bold": false, - "italic": false, - "strikethrough": false, - "underline": false, - "code": true, - "color": "default" - }, - "plain_text": "createImpl", - "href": null - }, - { - "type": "text", - "text": { - "content": " 에 해당한다.\n", - "link": null - }, - "annotations": { - "bold": false, - "italic": false, - "strikethrough": false, - "underline": false, - "code": false, - "color": "default" - }, - "plain_text": " 에 해당한다.\n", - "href": null - }, - { - "type": "text", - "text": { - "content": "createStore", - "link": null - }, - "annotations": { - "bold": false, - "italic": false, - "strikethrough": false, - "underline": false, - "code": true, - "color": "default" - }, - "plain_text": "createStore", - "href": null - }, - { - "type": "text", - "text": { - "content": " 함수를 실행하고 ", - "link": null - }, - "annotations": { - "bold": false, - "italic": false, - "strikethrough": false, - "underline": false, - "code": false, - "color": "default" - }, - "plain_text": " 함수를 실행하고 ", - "href": null - }, - { - "type": "text", - "text": { - "content": "useBoundStore", - "link": null - }, - "annotations": { - "bold": false, - "italic": false, - "strikethrough": false, - "underline": false, - "code": true, - "color": "default" - }, - "plain_text": "useBoundStore", - "href": null - }, - { - "type": "text", - "text": { - "content": " 를 반환한다. (", - "link": null - }, - "annotations": { - "bold": false, - "italic": false, - "strikethrough": false, - "underline": false, - "code": false, - "color": "default" - }, - "plain_text": " 를 반환한다. (", - "href": null - }, - { - "type": "text", - "text": { - "content": "useBoundStore", - "link": null - }, - "annotations": { - "bold": false, - "italic": false, - "strikethrough": false, - "underline": false, - "code": true, - "color": "default" - }, - "plain_text": "useBoundStore", - "href": null - }, - { - "type": "text", - "text": { - "content": " 가 상태 변화를 감지한다.)", - "link": null - }, - "annotations": { - "bold": false, - "italic": false, - "strikethrough": false, - "underline": false, - "code": false, - "color": "default" - }, - "plain_text": " 가 상태 변화를 감지한다.)", - "href": null - } - ], - "color": "default" - } - }, - { - "object": "block", - "id": "10b0112c-c641-4a02-aec4-61806c7e83e7", - "parent": { - "type": "page_id", - "page_id": "56874170-f8d4-4bcc-996e-be4e43f67930" - }, - "created_time": "2023-11-30T05:29:00.000Z", - "last_edited_time": "2023-11-30T09:23:00.000Z", - "created_by": { - "object": "user", - "id": "5146391e-8b65-47f2-83b6-2bfe81194f32" - }, - "last_edited_by": { - "object": "user", - "id": "5146391e-8b65-47f2-83b6-2bfe81194f32" - }, - "has_children": false, - "archived": false, - "in_trash": false, - "type": "heading_2", - "heading_2": { - "rich_text": [ - { - "type": "text", - "text": { - "content": "Atomic (Recoil, Jotai)", - "link": null - }, - "annotations": { - "bold": false, - "italic": false, - "strikethrough": false, - "underline": false, - "code": false, - "color": "default" - }, - "plain_text": "Atomic (Recoil, Jotai)", - "href": null - } - ], - "is_toggleable": false, - "color": "default" - } - }, - { - "object": "block", - "id": "6df603e1-0c51-4c42-ae2a-219641b2bf7e", - "parent": { - "type": "page_id", - "page_id": "56874170-f8d4-4bcc-996e-be4e43f67930" - }, - "created_time": "2023-12-01T06:00:00.000Z", - "last_edited_time": "2023-12-02T07:19:00.000Z", - "created_by": { - "object": "user", - "id": "5146391e-8b65-47f2-83b6-2bfe81194f32" - }, - "last_edited_by": { - "object": "user", - "id": "5146391e-8b65-47f2-83b6-2bfe81194f32" - }, - "has_children": false, - "archived": false, - "in_trash": false, - "type": "paragraph", - "paragraph": { - "rich_text": [ - { - "type": "text", - "text": { - "content": "Atomic 패턴은 어디서 기인한 것인지는 명확하지 않지만, 디자인 시스템에서의 Atomic", - "link": null - }, - "annotations": { - "bold": false, - "italic": false, - "strikethrough": false, - "underline": false, - "code": false, - "color": "default" - }, - "plain_text": "Atomic 패턴은 어디서 기인한 것인지는 명확하지 않지만, 디자인 시스템에서의 Atomic", - "href": null - }, - { - "type": "text", - "text": { - "content": " ", - "link": null - }, - "annotations": { - "bold": true, - "italic": false, - "strikethrough": false, - "underline": false, - "code": false, - "color": "default" - }, - "plain_text": " ", - "href": null - }, - { - "type": "text", - "text": { - "content": "디자인, 함수형 언어 클로저의 Atom 패턴과 거의 동일하다고 생각될 수 있다.", - "link": null - }, - "annotations": { - "bold": false, - "italic": false, - "strikethrough": false, - "underline": false, - "code": false, - "color": "default" - }, - "plain_text": "디자인, 함수형 언어 클로저의 Atom 패턴과 거의 동일하다고 생각될 수 있다.", - "href": null - } - ], - "color": "default" - } - }, - { - "object": "block", - "id": "ceaee7c7-e0a2-47be-ae10-0f380dc064b6", - "parent": { - "type": "page_id", - "page_id": "56874170-f8d4-4bcc-996e-be4e43f67930" - }, - "created_time": "2023-12-01T06:02:00.000Z", - "last_edited_time": "2023-12-01T06:03:00.000Z", - "created_by": { - "object": "user", - "id": "5146391e-8b65-47f2-83b6-2bfe81194f32" - }, - "last_edited_by": { - "object": "user", - "id": "5146391e-8b65-47f2-83b6-2bfe81194f32" - }, - "has_children": false, - "archived": false, - "in_trash": false, - "type": "paragraph", - "paragraph": { - "rich_text": [ - { - "type": "text", - "text": { - "content": "Recoil의 Atom은 불변성과 원자성을 가진 상태 관리를 위한 데이터 구조이다.", - "link": null - }, - "annotations": { - "bold": false, - "italic": false, - "strikethrough": false, - "underline": false, - "code": false, - "color": "default" - }, - "plain_text": "Recoil의 Atom은 불변성과 원자성을 가진 상태 관리를 위한 데이터 구조이다.", - "href": null - } - ], - "color": "default" - } - }, - { - "object": "block", - "id": "0bdabf37-09bd-4a84-acc2-5c17d409ae27", - "parent": { - "type": "page_id", - "page_id": "56874170-f8d4-4bcc-996e-be4e43f67930" - }, - "created_time": "2023-11-30T07:58:00.000Z", - "last_edited_time": "2023-12-01T05:46:00.000Z", - "created_by": { - "object": "user", - "id": "5146391e-8b65-47f2-83b6-2bfe81194f32" - }, - "last_edited_by": { - "object": "user", - "id": "5146391e-8b65-47f2-83b6-2bfe81194f32" - }, - "has_children": false, - "archived": false, - "in_trash": false, - "type": "image", - "image": { - "caption": [], - "type": "file", - "file": { - "url": "https://www.notion.so/image/https%3A%2F%2Fprod-files-secure.s3.us-west-2.amazonaws.com%2Fcd7314a5-d906-43b0-81e7-42eff82c02a3%2F2c74df21-ee44-4c8b-b67b-c640c694a22f%2FUntitled.png?table=block&id=0bdabf37-09bd-4a84-acc2-5c17d409ae27&cache=v2", - "expiry_time": "2025-04-14T15:12:43.852Z" - }, - "format": { - "block_width": 1024, - "block_height": 678, - "block_aspect_ratio": 1.5103244837758112 - } - } - }, - { - "object": "block", - "id": "026e9ff6-461e-4474-b1cc-d38f69b96bfa", - "parent": { - "type": "page_id", - "page_id": "56874170-f8d4-4bcc-996e-be4e43f67930" - }, - "created_time": "2023-12-01T06:03:00.000Z", - "last_edited_time": "2023-12-01T06:13:00.000Z", - "created_by": { - "object": "user", - "id": "5146391e-8b65-47f2-83b6-2bfe81194f32" - }, - "last_edited_by": { - "object": "user", - "id": "5146391e-8b65-47f2-83b6-2bfe81194f32" - }, - "has_children": false, - "archived": false, - "in_trash": false, - "type": "paragraph", - "paragraph": { - "rich_text": [ - { - "type": "text", - "text": { - "content": "Recoil은 아래와 같은 주요 개념으로 구성된다.", - "link": null - }, - "annotations": { - "bold": false, - "italic": false, - "strikethrough": false, - "underline": false, - "code": false, - "color": "default" - }, - "plain_text": "Recoil은 아래와 같은 주요 개념으로 구성된다.", - "href": null - } - ], - "color": "default" - } - }, - { - "object": "block", - "id": "b8c36242-f851-4b5e-9dd8-03b02edd5fb1", - "parent": { - "type": "page_id", - "page_id": "56874170-f8d4-4bcc-996e-be4e43f67930" - }, - "created_time": "2023-12-01T06:04:00.000Z", - "last_edited_time": "2023-12-01T12:01:00.000Z", - "created_by": { - "object": "user", - "id": "5146391e-8b65-47f2-83b6-2bfe81194f32" - }, - "last_edited_by": { - "object": "user", - "id": "5146391e-8b65-47f2-83b6-2bfe81194f32" - }, - "has_children": false, - "archived": false, - "in_trash": false, - "type": "bulleted_list_item", - "bulleted_list_item": { - "rich_text": [ - { - "type": "text", - "text": { - "content": "Atom : 상태의 단위이며, 업데이트와 구독이 가능하다. atom이 업데이트되면 각각 구독된 컴포넌트는 새로운 값을 반영하여 다시 렌더링 된다. atoms는 런타임에서 생성될 수도 있다. Atoms는 React의 로컬 컴포넌트의 상태 대신 사용할 수 있다. 동일한 atom이 여러 컴포넌트에서 사용되는 경우 모든 컴포넌트는 상태를 공유한다. atom의 키 값은 전역적으로 고유해야 한다. (Jotai는 별도 키가 필요 없다.)", - "link": null - }, - "annotations": { - "bold": false, - "italic": false, - "strikethrough": false, - "underline": false, - "code": false, - "color": "default" - }, - "plain_text": "Atom : 상태의 단위이며, 업데이트와 구독이 가능하다. atom이 업데이트되면 각각 구독된 컴포넌트는 새로운 값을 반영하여 다시 렌더링 된다. atoms는 런타임에서 생성될 수도 있다. Atoms는 React의 로컬 컴포넌트의 상태 대신 사용할 수 있다. 동일한 atom이 여러 컴포넌트에서 사용되는 경우 모든 컴포넌트는 상태를 공유한다. atom의 키 값은 전역적으로 고유해야 한다. (Jotai는 별도 키가 필요 없다.)", - "href": null - } - ], - "color": "default" - } - }, - { - "object": "block", - "id": "d568a01b-a6a9-4afe-a499-e2f963c20d8b", - "parent": { - "type": "page_id", - "page_id": "56874170-f8d4-4bcc-996e-be4e43f67930" - }, - "created_time": "2023-12-01T06:05:00.000Z", - "last_edited_time": "2023-12-01T06:21:00.000Z", - "created_by": { - "object": "user", - "id": "5146391e-8b65-47f2-83b6-2bfe81194f32" - }, - "last_edited_by": { - "object": "user", - "id": "5146391e-8b65-47f2-83b6-2bfe81194f32" - }, - "has_children": false, - "archived": false, - "in_trash": false, - "type": "bulleted_list_item", - "bulleted_list_item": { - "rich_text": [ - { - "type": "text", - "text": { - "content": "Selectors : atoms나 다른 selectors를 입력으로 받아들이는 순수 함수(pure function)다. 상위의 atoms 또는 selectors가 업데이트되면 하위의 selector 함수도 다시 실행된다. 컴포넌트들은 selectors를 atoms처럼 구독할 수 있으며 selectors가 변경되면 컴포넌트들도 다시 렌더링 된다. Selectors는 상태를 기반으로 하는 파생 데이터를 계산하는 데 사용된다.", - "link": null - }, - "annotations": { - "bold": false, - "italic": false, - "strikethrough": false, - "underline": false, - "code": false, - "color": "default" - }, - "plain_text": "Selectors : atoms나 다른 selectors를 입력으로 받아들이는 순수 함수(pure function)다. 상위의 atoms 또는 selectors가 업데이트되면 하위의 selector 함수도 다시 실행된다. 컴포넌트들은 selectors를 atoms처럼 구독할 수 있으며 selectors가 변경되면 컴포넌트들도 다시 렌더링 된다. Selectors는 상태를 기반으로 하는 파생 데이터를 계산하는 데 사용된다.", - "href": null - } - ], - "color": "default" - } - }, - { - "object": "block", - "id": "0e26beb0-1aba-409a-b576-46828dfe8959", - "parent": { - "type": "page_id", - "page_id": "56874170-f8d4-4bcc-996e-be4e43f67930" - }, - "created_time": "2023-11-30T06:58:00.000Z", - "last_edited_time": "2023-11-30T06:59:00.000Z", - "created_by": { - "object": "user", - "id": "5146391e-8b65-47f2-83b6-2bfe81194f32" - }, - "last_edited_by": { - "object": "user", - "id": "5146391e-8b65-47f2-83b6-2bfe81194f32" - }, - "has_children": false, - "archived": false, - "in_trash": false, - "type": "image", - "image": { - "caption": [], - "type": "file", - "file": { - "url": "https://www.notion.so/image/https%3A%2F%2Fprod-files-secure.s3.us-west-2.amazonaws.com%2Fcd7314a5-d906-43b0-81e7-42eff82c02a3%2F1b9439e3-55a2-4fc7-a43a-3ada96d230cd%2FUntitled.png?table=block&id=0e26beb0-1aba-409a-b576-46828dfe8959&cache=v2", - "expiry_time": "2025-04-14T15:12:43.853Z" - }, - "format": { - "block_width": 819, - "block_height": 887, - "block_aspect_ratio": 0.923337091319053 - } - } - }, - { - "object": "block", - "id": "029de32e-1a77-4cbb-8f87-51c6e00daf26", - "parent": { - "type": "page_id", - "page_id": "56874170-f8d4-4bcc-996e-be4e43f67930" - }, - "created_time": "2023-12-01T06:24:00.000Z", - "last_edited_time": "2023-12-01T06:25:00.000Z", - "created_by": { - "object": "user", - "id": "5146391e-8b65-47f2-83b6-2bfe81194f32" - }, - "last_edited_by": { - "object": "user", - "id": "5146391e-8b65-47f2-83b6-2bfe81194f32" - }, - "has_children": false, - "archived": false, - "in_trash": false, - "type": "paragraph", - "paragraph": { - "rich_text": [ - { - "type": "text", - "text": { - "content": "Atom 패턴을 가지고 있는 ", - "link": null - }, - "annotations": { - "bold": false, - "italic": false, - "strikethrough": false, - "underline": false, - "code": false, - "color": "default" - }, - "plain_text": "Atom 패턴을 가지고 있는 ", - "href": null - }, - { - "type": "text", - "text": { - "content": "Recoil", - "link": null - }, - "annotations": { - "bold": true, - "italic": false, - "strikethrough": false, - "underline": false, - "code": false, - "color": "default" - }, - "plain_text": "Recoil", - "href": null - }, - { - "type": "text", - "text": { - "content": ", ", - "link": null - }, - "annotations": { - "bold": false, - "italic": false, - "strikethrough": false, - "underline": false, - "code": false, - "color": "default" - }, - "plain_text": ", ", - "href": null - }, - { - "type": "text", - "text": { - "content": "Jotai", - "link": null - }, - "annotations": { - "bold": true, - "italic": false, - "strikethrough": false, - "underline": false, - "code": false, - "color": "default" - }, - "plain_text": "Jotai", - "href": null - }, - { - "type": "text", - "text": { - "content": "는 상향식 (Bottom-Up) 접근법을 가지고 있다.", - "link": null - }, - "annotations": { - "bold": false, - "italic": false, - "strikethrough": false, - "underline": false, - "code": false, - "color": "default" - }, - "plain_text": "는 상향식 (Bottom-Up) 접근법을 가지고 있다.", - "href": null - } - ], - "color": "default" - } - }, - { - "object": "block", - "id": "ce6c577f-4332-41e3-b00e-7e3f248e1527", - "parent": { - "type": "page_id", - "page_id": "56874170-f8d4-4bcc-996e-be4e43f67930" - }, - "created_time": "2023-12-01T06:24:00.000Z", - "last_edited_time": "2023-12-02T07:20:00.000Z", - "created_by": { - "object": "user", - "id": "5146391e-8b65-47f2-83b6-2bfe81194f32" - }, - "last_edited_by": { - "object": "user", - "id": "5146391e-8b65-47f2-83b6-2bfe81194f32" - }, - "has_children": false, - "archived": false, - "in_trash": false, - "type": "paragraph", - "paragraph": { - "rich_text": [ - { - "type": "text", - "text": { - "content": "상향식 (Bottom-Up) 접근법 : 상태를 원자 단위로 가지며, 상태와 셀렉터들을 조합하여 상태를 확장하는 방식", - "link": null - }, - "annotations": { - "bold": false, - "italic": false, - "strikethrough": false, - "underline": false, - "code": false, - "color": "default" - }, - "plain_text": "상향식 (Bottom-Up) 접근법 : 상태를 원자 단위로 가지며, 상태와 셀렉터들을 조합하여 상태를 확장하는 방식", - "href": null - } - ], - "color": "default" - } - }, - { - "object": "block", - "id": "725a3ffc-d827-4d51-a6e7-a73526ca44fc", - "parent": { - "type": "page_id", - "page_id": "56874170-f8d4-4bcc-996e-be4e43f67930" - }, - "created_time": "2023-11-30T06:15:00.000Z", - "last_edited_time": "2023-12-01T06:35:00.000Z", - "created_by": { - "object": "user", - "id": "5146391e-8b65-47f2-83b6-2bfe81194f32" - }, - "last_edited_by": { - "object": "user", - "id": "5146391e-8b65-47f2-83b6-2bfe81194f32" - }, - "has_children": false, - "archived": false, - "in_trash": false, - "type": "heading_3", - "heading_3": { - "rich_text": [ - { - "type": "text", - "text": { - "content": "Recoil", - "link": null - }, - "annotations": { - "bold": true, - "italic": false, - "strikethrough": false, - "underline": false, - "code": false, - "color": "default" - }, - "plain_text": "Recoil", - "href": null - } - ], - "is_toggleable": false, - "color": "default" - } - }, - { - "object": "block", - "id": "38250a68-06da-4a19-9beb-6d74a989b950", - "parent": { - "type": "page_id", - "page_id": "56874170-f8d4-4bcc-996e-be4e43f67930" - }, - "created_time": "2023-12-01T06:34:00.000Z", - "last_edited_time": "2023-12-01T12:00:00.000Z", - "created_by": { - "object": "user", - "id": "5146391e-8b65-47f2-83b6-2bfe81194f32" - }, - "last_edited_by": { - "object": "user", - "id": "5146391e-8b65-47f2-83b6-2bfe81194f32" - }, - "has_children": false, - "archived": false, - "in_trash": false, - "type": "paragraph", - "paragraph": { - "rich_text": [ - { - "type": "text", - "text": { - "content": "Recoil", - "link": null - }, - "annotations": { - "bold": false, - "italic": false, - "strikethrough": false, - "underline": false, - "code": false, - "color": "default" - }, - "plain_text": "Recoil", - "href": null - }, - { - "type": "text", - "text": { - "content": "은", - "link": null - }, - "annotations": { - "bold": true, - "italic": false, - "strikethrough": false, - "underline": false, - "code": false, - "color": "default" - }, - "plain_text": "은", - "href": null - }, - { - "type": "text", - "text": { - "content": " 현재 마지막 업데이트가 된 지 약 9개월이며 Major 버전이 0이다.\n또한 다음에서 소개할 ", - "link": null - }, - "annotations": { - "bold": false, - "italic": false, - "strikethrough": false, - "underline": false, - "code": false, - "color": "default" - }, - "plain_text": " 현재 마지막 업데이트가 된 지 약 9개월이며 Major 버전이 0이다.\n또한 다음에서 소개할 ", - "href": null - }, - { - "type": "text", - "text": { - "content": "Jotai", - "link": null - }, - "annotations": { - "bold": true, - "italic": false, - "strikethrough": false, - "underline": false, - "code": false, - "color": "default" - }, - "plain_text": "Jotai", - "href": null - }, - { - "type": "text", - "text": { - "content": "와 컨셉, 사용법이 매우 유사하기 때문에 Recoil은", - "link": null - }, - "annotations": { - "bold": false, - "italic": false, - "strikethrough": false, - "underline": false, - "code": false, - "color": "default" - }, - "plain_text": "와 컨셉, 사용법이 매우 유사하기 때문에 Recoil은", - "href": null - }, - { - "type": "text", - "text": { - "content": " ", - "link": null - }, - "annotations": { - "bold": true, - "italic": false, - "strikethrough": false, - "underline": false, - "code": false, - "color": "default" - }, - "plain_text": " ", - "href": null - }, - { - "type": "text", - "text": { - "content": "다루지 않겠다.", - "link": null - }, - "annotations": { - "bold": false, - "italic": false, - "strikethrough": false, - "underline": false, - "code": false, - "color": "default" - }, - "plain_text": "다루지 않겠다.", - "href": null - } - ], - "color": "default" - } - }, - { - "object": "block", - "id": "82322597-e8b7-467d-aea4-a83d34b5607e", - "parent": { - "type": "page_id", - "page_id": "56874170-f8d4-4bcc-996e-be4e43f67930" - }, - "created_time": "2023-11-30T06:15:00.000Z", - "last_edited_time": "2023-12-01T06:35:00.000Z", - "created_by": { - "object": "user", - "id": "5146391e-8b65-47f2-83b6-2bfe81194f32" - }, - "last_edited_by": { - "object": "user", - "id": "5146391e-8b65-47f2-83b6-2bfe81194f32" - }, - "has_children": false, - "archived": false, - "in_trash": false, - "type": "heading_3", - "heading_3": { - "rich_text": [ - { - "type": "text", - "text": { - "content": "Jotai", - "link": null - }, - "annotations": { - "bold": true, - "italic": false, - "strikethrough": false, - "underline": false, - "code": false, - "color": "default" - }, - "plain_text": "Jotai", - "href": null - } - ], - "is_toggleable": false, - "color": "default" - } - }, - { - "object": "block", - "id": "5279accf-85a3-44c5-914d-410b8ea59cbd", - "parent": { - "type": "page_id", - "page_id": "56874170-f8d4-4bcc-996e-be4e43f67930" - }, - "created_time": "2023-12-01T06:44:00.000Z", - "last_edited_time": "2023-12-01T06:44:00.000Z", - "created_by": { - "object": "user", - "id": "5146391e-8b65-47f2-83b6-2bfe81194f32" - }, - "last_edited_by": { - "object": "user", - "id": "5146391e-8b65-47f2-83b6-2bfe81194f32" - }, - "has_children": false, - "archived": false, - "in_trash": false, - "type": "image", - "image": { - "caption": [], - "type": "file", - "file": { - "url": "https://www.notion.so/image/https%3A%2F%2Fprod-files-secure.s3.us-west-2.amazonaws.com%2Fcd7314a5-d906-43b0-81e7-42eff82c02a3%2F87fe978b-a6a8-415d-9b8c-243e96326358%2FUntitled.png?table=block&id=5279accf-85a3-44c5-914d-410b8ea59cbd&cache=v2", - "expiry_time": "2025-04-14T15:12:43.849Z" - }, - "format": { - "block_width": 429, - "block_height": 208, - "block_aspect_ratio": 2.0625 - } - } - }, - { - "object": "block", - "id": "70b6302e-f219-4a1e-b88c-ff4bba54a4fb", - "parent": { - "type": "page_id", - "page_id": "56874170-f8d4-4bcc-996e-be4e43f67930" - }, - "created_time": "2023-12-01T06:45:00.000Z", - "last_edited_time": "2023-12-01T06:45:00.000Z", - "created_by": { - "object": "user", - "id": "5146391e-8b65-47f2-83b6-2bfe81194f32" - }, - "last_edited_by": { - "object": "user", - "id": "5146391e-8b65-47f2-83b6-2bfe81194f32" - }, - "has_children": false, - "archived": false, - "in_trash": false, - "type": "quote", - "quote": { - "rich_text": [ - { - "type": "text", - "text": { - "content": "Primitive and flexible state management for React", - "link": null - }, - "annotations": { - "bold": false, - "italic": false, - "strikethrough": false, - "underline": false, - "code": false, - "color": "default" - }, - "plain_text": "Primitive and flexible state management for React", - "href": null - } - ], - "color": "default" - } - }, - { - "object": "block", - "id": "4e309685-71c0-4830-a519-990c0be15b78", - "parent": { - "type": "page_id", - "page_id": "56874170-f8d4-4bcc-996e-be4e43f67930" - }, - "created_time": "2023-12-01T06:45:00.000Z", - "last_edited_time": "2023-12-01T07:10:00.000Z", - "created_by": { - "object": "user", - "id": "5146391e-8b65-47f2-83b6-2bfe81194f32" - }, - "last_edited_by": { - "object": "user", - "id": "5146391e-8b65-47f2-83b6-2bfe81194f32" - }, - "has_children": false, - "archived": false, - "in_trash": false, - "type": "paragraph", - "paragraph": { - "rich_text": [ - { - "type": "text", - "text": { - "content": "소개처럼 Zustand, Redux와 달리 Jotai는 리액트를 위해 만들어진 라이브러리이다.\nRecoil의 Atomic 패턴에 영감을 받아 만든 라이브러리로 컨셉과 사용법이 매우 유사하다.", - "link": null - }, - "annotations": { - "bold": false, - "italic": false, - "strikethrough": false, - "underline": false, - "code": false, - "color": "default" - }, - "plain_text": "소개처럼 Zustand, Redux와 달리 Jotai는 리액트를 위해 만들어진 라이브러리이다.\nRecoil의 Atomic 패턴에 영감을 받아 만든 라이브러리로 컨셉과 사용법이 매우 유사하다.", - "href": null - } - ], - "color": "default" - } - }, - { - "object": "block", - "id": "8df3deef-99f2-4dce-8b35-c715439e64f2", - "parent": { - "type": "page_id", - "page_id": "56874170-f8d4-4bcc-996e-be4e43f67930" - }, - "created_time": "2023-12-01T06:57:00.000Z", - "last_edited_time": "2023-12-01T07:11:00.000Z", - "created_by": { - "object": "user", - "id": "5146391e-8b65-47f2-83b6-2bfe81194f32" - }, - "last_edited_by": { - "object": "user", - "id": "5146391e-8b65-47f2-83b6-2bfe81194f32" - }, - "has_children": false, - "archived": false, - "in_trash": false, - "type": "paragraph", - "paragraph": { - "rich_text": [ - { - "type": "text", - "text": { - "content": "한 가지 특이한 점은 Zustand, Valtio 등을 만든 개발자가 Jotai를 만들었다는 것이다. 그래서 코드를 보면 폴더 구조 등이 유사한 것을 알 수 있다.", - "link": null - }, - "annotations": { - "bold": false, - "italic": false, - "strikethrough": false, - "underline": false, - "code": false, - "color": "default" - }, - "plain_text": "한 가지 특이한 점은 Zustand, Valtio 등을 만든 개발자가 Jotai를 만들었다는 것이다. 그래서 코드를 보면 폴더 구조 등이 유사한 것을 알 수 있다.", - "href": null - } - ], - "color": "default" - } - }, - { - "object": "block", - "id": "a66b11b2-a836-4fb6-93d4-2477e761e21f", - "parent": { - "type": "page_id", - "page_id": "56874170-f8d4-4bcc-996e-be4e43f67930" - }, - "created_time": "2023-12-01T07:11:00.000Z", - "last_edited_time": "2023-12-01T07:11:00.000Z", - "created_by": { - "object": "user", - "id": "5146391e-8b65-47f2-83b6-2bfe81194f32" - }, - "last_edited_by": { - "object": "user", - "id": "5146391e-8b65-47f2-83b6-2bfe81194f32" - }, - "has_children": false, - "archived": false, - "in_trash": false, - "type": "paragraph", - "paragraph": { - "rich_text": [ - { - "type": "text", - "text": { - "content": "아래 링크를 보면 해당 그룹에서 ", - "link": null - }, - "annotations": { - "bold": false, - "italic": false, - "strikethrough": false, - "underline": false, - "code": false, - "color": "default" - }, - "plain_text": "아래 링크를 보면 해당 그룹에서 ", - "href": null - }, - { - "type": "text", - "text": { - "content": "react-spring, react-three-fiber", - "link": null - }, - "annotations": { - "bold": false, - "italic": false, - "strikethrough": false, - "underline": false, - "code": true, - "color": "default" - }, - "plain_text": "react-spring, react-three-fiber", - "href": null - }, - { - "type": "text", - "text": { - "content": " 등을 만들었다. 이 그룹을 팔로잉하면 현재 개발 트렌드 등을 알 수 있을 것이다.", - "link": null - }, - "annotations": { - "bold": false, - "italic": false, - "strikethrough": false, - "underline": false, - "code": false, - "color": "default" - }, - "plain_text": " 등을 만들었다. 이 그룹을 팔로잉하면 현재 개발 트렌드 등을 알 수 있을 것이다.", - "href": null - } - ], - "color": "default" - } - }, - { - "object": "block", - "id": "ab14a3e2-5e33-4867-9b7b-0e01098b01ad", - "parent": { - "type": "page_id", - "page_id": "56874170-f8d4-4bcc-996e-be4e43f67930" - }, - "created_time": "2023-12-01T06:48:00.000Z", - "last_edited_time": "2023-12-01T06:48:00.000Z", - "created_by": { - "object": "user", - "id": "5146391e-8b65-47f2-83b6-2bfe81194f32" - }, - "last_edited_by": { - "object": "user", - "id": "5146391e-8b65-47f2-83b6-2bfe81194f32" - }, - "has_children": false, - "archived": false, - "in_trash": false, - "type": "bookmark", - "bookmark": { - "caption": [], - "url": "https://github.com/pmndrs", - "metadata": { - "title": "Poimandres", - "description": "Open source developer collective. Poimandres has 84 repositories available. Follow their code on GitHub.", - "image": "https://avatars.githubusercontent.com/u/45790596?s=280&v=4", - "siteName": "GitHub", - "url": "https://github.com/pmndrs", - "favicon": "https://www.google.com/s2/favicons?domain=github.com&sz=64" - } - } - }, - { - "object": "block", - "id": "866d7537-d6b9-439e-a3cc-8a12db7425dc", - "parent": { - "type": "page_id", - "page_id": "56874170-f8d4-4bcc-996e-be4e43f67930" - }, - "created_time": "2023-12-01T06:45:00.000Z", - "last_edited_time": "2023-12-01T07:00:00.000Z", - "created_by": { - "object": "user", - "id": "5146391e-8b65-47f2-83b6-2bfe81194f32" - }, - "last_edited_by": { - "object": "user", - "id": "5146391e-8b65-47f2-83b6-2bfe81194f32" - }, - "has_children": false, - "archived": false, - "in_trash": false, - "type": "paragraph", - "paragraph": { - "rich_text": [ - { - "type": "text", - "text": { - "content": "Counter 예제 코드", - "link": null - }, - "annotations": { - "bold": true, - "italic": false, - "strikethrough": false, - "underline": false, - "code": false, - "color": "default" - }, - "plain_text": "Counter 예제 코드", - "href": null - } - ], - "color": "default" - } - }, - { - "object": "block", - "id": "3314cd2d-b0f1-4017-bd23-b880dbf7a8e2", - "parent": { - "type": "page_id", - "page_id": "56874170-f8d4-4bcc-996e-be4e43f67930" - }, - "created_time": "2023-12-01T06:52:00.000Z", - "last_edited_time": "2023-12-05T05:30:00.000Z", - "created_by": { - "object": "user", - "id": "5146391e-8b65-47f2-83b6-2bfe81194f32" - }, - "last_edited_by": { - "object": "user", - "id": "5146391e-8b65-47f2-83b6-2bfe81194f32" - }, - "has_children": false, - "archived": false, - "in_trash": false, - "type": "code", - "code": { - "caption": [], - "rich_text": [ - { - "type": "text", - "text": { - "content": "import { atom, useAtom } from 'jotai';\n\nconst countAtom = atom(0);\n\nfunction Counter() {\n const [count, setCount] = useAtom(countAtom);\n return (\n

\n {count}\n \n

);\n}", - "link": null - }, - "annotations": { - "bold": false, - "italic": false, - "strikethrough": false, - "underline": false, - "code": false, - "color": "default" - }, - "plain_text": "import { atom, useAtom } from 'jotai';\n\nconst countAtom = atom(0);\n\nfunction Counter() {\n const [count, setCount] = useAtom(countAtom);\n return (\n

\n {count}\n \n

);\n}", - "href": null - } - ], - "language": "typescript" - } - }, - { - "object": "block", - "id": "8e6abe44-113b-4832-bea1-bf9f721b3515", - "parent": { - "type": "page_id", - "page_id": "56874170-f8d4-4bcc-996e-be4e43f67930" - }, - "created_time": "2023-12-01T08:24:00.000Z", - "last_edited_time": "2023-12-02T07:22:00.000Z", - "created_by": { - "object": "user", - "id": "5146391e-8b65-47f2-83b6-2bfe81194f32" - }, - "last_edited_by": { - "object": "user", - "id": "5146391e-8b65-47f2-83b6-2bfe81194f32" - }, - "has_children": false, - "archived": false, - "in_trash": false, - "type": "paragraph", - "paragraph": { - "rich_text": [ - { - "type": "text", - "text": { - "content": "Jotai는 리액트를 위한 라이브러리이지만 atom과 store는 vanilla로 작성되어 있다. 또한 Zustand와 마찬가지로 Pub/Sub 모델을 가지고 있다.", - "link": null - }, - "annotations": { - "bold": false, - "italic": false, - "strikethrough": false, - "underline": false, - "code": false, - "color": "default" - }, - "plain_text": "Jotai는 리액트를 위한 라이브러리이지만 atom과 store는 vanilla로 작성되어 있다. 또한 Zustand와 마찬가지로 Pub/Sub 모델을 가지고 있다.", - "href": null - } - ], - "color": "default" - } - }, - { - "object": "block", - "id": "97675d15-8a30-4b0d-9986-88d89515ecb4", - "parent": { - "type": "page_id", - "page_id": "56874170-f8d4-4bcc-996e-be4e43f67930" - }, - "created_time": "2023-12-01T09:37:00.000Z", - "last_edited_time": "2023-12-01T12:02:00.000Z", - "created_by": { - "object": "user", - "id": "5146391e-8b65-47f2-83b6-2bfe81194f32" - }, - "last_edited_by": { - "object": "user", - "id": "5146391e-8b65-47f2-83b6-2bfe81194f32" - }, - "has_children": false, - "archived": false, - "in_trash": false, - "type": "paragraph", - "paragraph": { - "rich_text": [ - { - "type": "text", - "text": { - "content": "Jotai 내부 코드를 보며 이해해 보자!", - "link": null - }, - "annotations": { - "bold": false, - "italic": false, - "strikethrough": false, - "underline": false, - "code": false, - "color": "default" - }, - "plain_text": "Jotai 내부 코드를 보며 이해해 보자!", - "href": null - } - ], - "color": "default" - } - }, - { - "object": "block", - "id": "ded91e3b-91d0-4d74-b997-2713d22127c1", - "parent": { - "type": "page_id", - "page_id": "56874170-f8d4-4bcc-996e-be4e43f67930" - }, - "created_time": "2023-12-01T08:37:00.000Z", - "last_edited_time": "2023-12-01T08:37:00.000Z", - "created_by": { - "object": "user", - "id": "5146391e-8b65-47f2-83b6-2bfe81194f32" - }, - "last_edited_by": { - "object": "user", - "id": "5146391e-8b65-47f2-83b6-2bfe81194f32" - }, - "has_children": false, - "archived": false, - "in_trash": false, - "type": "paragraph", - "paragraph": { - "rich_text": [ - { - "type": "text", - "text": { - "content": "atom", - "link": null - }, - "annotations": { - "bold": true, - "italic": false, - "strikethrough": false, - "underline": false, - "code": false, - "color": "default" - }, - "plain_text": "atom", - "href": null - } - ], - "color": "default" - } - }, - { - "object": "block", - "id": "9041cc82-54b9-43ef-a92c-42bbada302a6", - "parent": { - "type": "page_id", - "page_id": "56874170-f8d4-4bcc-996e-be4e43f67930" - }, - "created_time": "2023-12-01T08:37:00.000Z", - "last_edited_time": "2023-12-01T08:37:00.000Z", - "created_by": { - "object": "user", - "id": "5146391e-8b65-47f2-83b6-2bfe81194f32" - }, - "last_edited_by": { - "object": "user", - "id": "5146391e-8b65-47f2-83b6-2bfe81194f32" - }, - "has_children": false, - "archived": false, - "in_trash": false, - "type": "code", - "code": { - "caption": [], - "rich_text": [ - { - "type": "text", - "text": { - "content": "function atom(\n read,\n write,\n ) {\n const key = `atom${++keyCount}`\n const config = {\n toString: () => key,\n }\n if (typeof read === 'function') {\n config.read = read\n } else {\n config.init = read\n config.read = function (get) {\n return get(this)\n }\n config.write = function (\n this,\n get,\n set,\n arg,\n ) {\n return set(\n this,\n typeof arg === 'function'\n ? (arg)(get(this))\n : arg,\n )\n }\n }\n if (write) {\n config.write = write\n }\n return config\n }", - "link": null - }, - "annotations": { - "bold": false, - "italic": false, - "strikethrough": false, - "underline": false, - "code": false, - "color": "default" - }, - "plain_text": "function atom(\n read,\n write,\n ) {\n const key = `atom${++keyCount}`\n const config = {\n toString: () => key,\n }\n if (typeof read === 'function') {\n config.read = read\n } else {\n config.init = read\n config.read = function (get) {\n return get(this)\n }\n config.write = function (\n this,\n get,\n set,\n arg,\n ) {\n return set(\n this,\n typeof arg === 'function'\n ? (arg)(get(this))\n : arg,\n )\n }\n }\n if (write) {\n config.write = write\n }\n return config\n }", - "href": null - } - ], - "language": "typescript" - } - }, - { - "object": "block", - "id": "b07a3009-2bda-4693-a2d8-b01e58ec31f5", - "parent": { - "type": "page_id", - "page_id": "56874170-f8d4-4bcc-996e-be4e43f67930" - }, - "created_time": "2023-12-01T08:38:00.000Z", - "last_edited_time": "2023-12-02T07:23:00.000Z", - "created_by": { - "object": "user", - "id": "5146391e-8b65-47f2-83b6-2bfe81194f32" - }, - "last_edited_by": { - "object": "user", - "id": "5146391e-8b65-47f2-83b6-2bfe81194f32" - }, - "has_children": false, - "archived": false, - "in_trash": false, - "type": "paragraph", - "paragraph": { - "rich_text": [ - { - "type": "text", - "text": { - "content": "atom", - "link": null - }, - "annotations": { - "bold": false, - "italic": false, - "strikethrough": false, - "underline": false, - "code": true, - "color": "default" - }, - "plain_text": "atom", - "href": null - }, - { - "type": "text", - "text": { - "content": " 함수가 반환하는 ", - "link": null - }, - "annotations": { - "bold": false, - "italic": false, - "strikethrough": false, - "underline": false, - "code": false, - "color": "default" - }, - "plain_text": " 함수가 반환하는 ", - "href": null - }, - { - "type": "text", - "text": { - "content": "config", - "link": null - }, - "annotations": { - "bold": false, - "italic": false, - "strikethrough": false, - "underline": false, - "code": true, - "color": "default" - }, - "plain_text": "config", - "href": null - }, - { - "type": "text", - "text": { - "content": " 는 ", - "link": null - }, - "annotations": { - "bold": false, - "italic": false, - "strikethrough": false, - "underline": false, - "code": false, - "color": "default" - }, - "plain_text": " 는 ", - "href": null - }, - { - "type": "text", - "text": { - "content": "read, write, init", - "link": null - }, - "annotations": { - "bold": false, - "italic": false, - "strikethrough": false, - "underline": false, - "code": true, - "color": "default" - }, - "plain_text": "read, write, init", - "href": null - }, - { - "type": "text", - "text": { - "content": " 함수를 가지고 있다.\n또한 atom이 생성될 때마다 ", - "link": null - }, - "annotations": { - "bold": false, - "italic": false, - "strikethrough": false, - "underline": false, - "code": false, - "color": "default" - }, - "plain_text": " 함수를 가지고 있다.\n또한 atom이 생성될 때마다 ", - "href": null - }, - { - "type": "text", - "text": { - "content": "keyCount", - "link": null - }, - "annotations": { - "bold": false, - "italic": false, - "strikethrough": false, - "underline": false, - "code": true, - "color": "default" - }, - "plain_text": "keyCount", - "href": null - }, - { - "type": "text", - "text": { - "content": " 를 늘려주면서 키 값이 중복되지 않게 한다. ", - "link": null - }, - "annotations": { - "bold": false, - "italic": false, - "strikethrough": false, - "underline": false, - "code": false, - "color": "default" - }, - "plain_text": " 를 늘려주면서 키 값이 중복되지 않게 한다. ", - "href": null - } - ], - "color": "default" - } - }, - { - "object": "block", - "id": "52f24b11-8131-4724-8b94-77b35e17adc7", - "parent": { - "type": "page_id", - "page_id": "56874170-f8d4-4bcc-996e-be4e43f67930" - }, - "created_time": "2023-12-01T08:50:00.000Z", - "last_edited_time": "2023-12-01T12:03:00.000Z", - "created_by": { - "object": "user", - "id": "5146391e-8b65-47f2-83b6-2bfe81194f32" - }, - "last_edited_by": { - "object": "user", - "id": "5146391e-8b65-47f2-83b6-2bfe81194f32" - }, - "has_children": false, - "archived": false, - "in_trash": false, - "type": "paragraph", - "paragraph": { - "rich_text": [ - { - "type": "text", - "text": { - "content": "read", - "link": null - }, - "annotations": { - "bold": false, - "italic": false, - "strikethrough": false, - "underline": false, - "code": true, - "color": "default" - }, - "plain_text": "read", - "href": null - }, - { - "type": "text", - "text": { - "content": " : ", - "link": null - }, - "annotations": { - "bold": false, - "italic": false, - "strikethrough": false, - "underline": false, - "code": false, - "color": "default" - }, - "plain_text": " : ", - "href": null - }, - { - "type": "text", - "text": { - "content": "atom", - "link": null - }, - "annotations": { - "bold": false, - "italic": false, - "strikethrough": false, - "underline": false, - "code": true, - "color": "default" - }, - "plain_text": "atom", - "href": null - }, - { - "type": "text", - "text": { - "content": " 을 읽을 때마다 평가되는 함수다. Dependency를 추적해서 ", - "link": null - }, - "annotations": { - "bold": false, - "italic": false, - "strikethrough": false, - "underline": false, - "code": false, - "color": "default" - }, - "plain_text": " 을 읽을 때마다 평가되는 함수다. Dependency를 추적해서 ", - "href": null - }, - { - "type": "text", - "text": { - "content": "atom", - "link": null - }, - "annotations": { - "bold": false, - "italic": false, - "strikethrough": false, - "underline": false, - "code": true, - "color": "default" - }, - "plain_text": "atom", - "href": null - }, - { - "type": "text", - "text": { - "content": " 에 대해 한 번이라도 ", - "link": null - }, - "annotations": { - "bold": false, - "italic": false, - "strikethrough": false, - "underline": false, - "code": false, - "color": "default" - }, - "plain_text": " 에 대해 한 번이라도 ", - "href": null - }, - { - "type": "text", - "text": { - "content": "get", - "link": null - }, - "annotations": { - "bold": false, - "italic": false, - "strikethrough": false, - "underline": false, - "code": true, - "color": "default" - }, - "plain_text": "get", - "href": null - }, - { - "type": "text", - "text": { - "content": " 을 호출했다면 ", - "link": null - }, - "annotations": { - "bold": false, - "italic": false, - "strikethrough": false, - "underline": false, - "code": false, - "color": "default" - }, - "plain_text": " 을 호출했다면 ", - "href": null - }, - { - "type": "text", - "text": { - "content": "atom", - "link": null - }, - "annotations": { - "bold": false, - "italic": false, - "strikethrough": false, - "underline": false, - "code": true, - "color": "default" - }, - "plain_text": "atom", - "href": null - }, - { - "type": "text", - "text": { - "content": " 값이 변경될 때마다 ", - "link": null - }, - "annotations": { - "bold": false, - "italic": false, - "strikethrough": false, - "underline": false, - "code": false, - "color": "default" - }, - "plain_text": " 값이 변경될 때마다 ", - "href": null - }, - { - "type": "text", - "text": { - "content": "read", - "link": null - }, - "annotations": { - "bold": false, - "italic": false, - "strikethrough": false, - "underline": false, - "code": true, - "color": "default" - }, - "plain_text": "read", - "href": null - }, - { - "type": "text", - "text": { - "content": " 는 평가된다.", - "link": null - }, - "annotations": { - "bold": false, - "italic": false, - "strikethrough": false, - "underline": false, - "code": false, - "color": "default" - }, - "plain_text": " 는 평가된다.", - "href": null - } - ], - "color": "default" - } - }, - { - "object": "block", - "id": "4c602630-679c-4a47-a314-e91b653d5ed1", - "parent": { - "type": "page_id", - "page_id": "56874170-f8d4-4bcc-996e-be4e43f67930" - }, - "created_time": "2023-12-01T08:53:00.000Z", - "last_edited_time": "2023-12-01T09:05:00.000Z", - "created_by": { - "object": "user", - "id": "5146391e-8b65-47f2-83b6-2bfe81194f32" - }, - "last_edited_by": { - "object": "user", - "id": "5146391e-8b65-47f2-83b6-2bfe81194f32" - }, - "has_children": false, - "archived": false, - "in_trash": false, - "type": "paragraph", - "paragraph": { - "rich_text": [ - { - "type": "text", - "text": { - "content": "write", - "link": null - }, - "annotations": { - "bold": false, - "italic": false, - "strikethrough": false, - "underline": false, - "code": true, - "color": "default" - }, - "plain_text": "write", - "href": null - }, - { - "type": "text", - "text": { - "content": " : ", - "link": null - }, - "annotations": { - "bold": false, - "italic": false, - "strikethrough": false, - "underline": false, - "code": false, - "color": "default" - }, - "plain_text": " : ", - "href": null - }, - { - "type": "text", - "text": { - "content": "useAtom", - "link": null - }, - "annotations": { - "bold": false, - "italic": false, - "strikethrough": false, - "underline": false, - "code": true, - "color": "default" - }, - "plain_text": "useAtom", - "href": null - }, - { - "type": "text", - "text": { - "content": " 의 ", - "link": null - }, - "annotations": { - "bold": false, - "italic": false, - "strikethrough": false, - "underline": false, - "code": false, - "color": "default" - }, - "plain_text": " 의 ", - "href": null - }, - { - "type": "text", - "text": { - "content": "[, set]", - "link": null - }, - "annotations": { - "bold": false, - "italic": false, - "strikethrough": false, - "underline": false, - "code": true, - "color": "default" - }, - "plain_text": "[, set]", - "href": null - }, - { - "type": "text", - "text": { - "content": " 에서 set이 호출될 때마다 write가 실행된다. ", - "link": null - }, - "annotations": { - "bold": false, - "italic": false, - "strikethrough": false, - "underline": false, - "code": false, - "color": "default" - }, - "plain_text": " 에서 set이 호출될 때마다 write가 실행된다. ", - "href": null - }, - { - "type": "text", - "text": { - "content": "atom", - "link": null - }, - "annotations": { - "bold": false, - "italic": false, - "strikethrough": false, - "underline": false, - "code": true, - "color": "default" - }, - "plain_text": "atom", - "href": null - }, - { - "type": "text", - "text": { - "content": " 값을 바꾸는 역할을 한다.", - "link": null - }, - "annotations": { - "bold": false, - "italic": false, - "strikethrough": false, - "underline": false, - "code": false, - "color": "default" - }, - "plain_text": " 값을 바꾸는 역할을 한다.", - "href": null - } - ], - "color": "default" - } - }, - { - "object": "block", - "id": "a7e13ff9-aa45-4aad-8133-60276dda8d2f", - "parent": { - "type": "page_id", - "page_id": "56874170-f8d4-4bcc-996e-be4e43f67930" - }, - "created_time": "2023-12-01T09:07:00.000Z", - "last_edited_time": "2023-12-01T09:07:00.000Z", - "created_by": { - "object": "user", - "id": "5146391e-8b65-47f2-83b6-2bfe81194f32" - }, - "last_edited_by": { - "object": "user", - "id": "5146391e-8b65-47f2-83b6-2bfe81194f32" - }, - "has_children": false, - "archived": false, - "in_trash": false, - "type": "paragraph", - "paragraph": { - "rich_text": [ - { - "type": "text", - "text": { - "content": "Provider", - "link": null - }, - "annotations": { - "bold": true, - "italic": false, - "strikethrough": false, - "underline": false, - "code": false, - "color": "default" - }, - "plain_text": "Provider", - "href": null - } - ], - "color": "default" - } - }, - { - "object": "block", - "id": "b032aa84-2d46-46ca-bd42-22c1fdeeb995", - "parent": { - "type": "page_id", - "page_id": "56874170-f8d4-4bcc-996e-be4e43f67930" - }, - "created_time": "2023-12-01T09:07:00.000Z", - "last_edited_time": "2023-12-01T09:08:00.000Z", - "created_by": { - "object": "user", - "id": "5146391e-8b65-47f2-83b6-2bfe81194f32" - }, - "last_edited_by": { - "object": "user", - "id": "5146391e-8b65-47f2-83b6-2bfe81194f32" - }, - "has_children": true, - "archived": false, - "in_trash": false, - "type": "quote", - "quote": { - "rich_text": [ - { - "type": "text", - "text": { - "content": "The ", - "link": null - }, - "annotations": { - "bold": false, - "italic": false, - "strikethrough": false, - "underline": false, - "code": false, - "color": "default" - }, - "plain_text": "The ", - "href": null - }, - { - "type": "text", - "text": { - "content": "Provider", - "link": null - }, - "annotations": { - "bold": false, - "italic": false, - "strikethrough": false, - "underline": false, - "code": true, - "color": "default" - }, - "plain_text": "Provider", - "href": null - }, - { - "type": "text", - "text": { - "content": " component is to provide state for a component sub tree. Multiple Providers can be used for multiple subtrees, and they can even be nested. This works just like React Context.", - "link": null - }, - "annotations": { - "bold": false, - "italic": false, - "strikethrough": false, - "underline": false, - "code": false, - "color": "default" - }, - "plain_text": " component is to provide state for a component sub tree. Multiple Providers can be used for multiple subtrees, and they can even be nested. This works just like React Context.", - "href": null - } - ], - "color": "default" - }, - "children": [ - { - "object": "block", - "id": "8e7c3fb3-0ae3-40a1-a73a-36879d825894", - "parent": { - "type": "block_id", - "block_id": "b032aa84-2d46-46ca-bd42-22c1fdeeb995" - }, - "created_time": "2023-12-01T09:07:00.000Z", - "last_edited_time": "2023-12-01T09:08:00.000Z", - "created_by": { - "object": "user", - "id": "5146391e-8b65-47f2-83b6-2bfe81194f32" - }, - "last_edited_by": { - "object": "user", - "id": "5146391e-8b65-47f2-83b6-2bfe81194f32" - }, - "has_children": false, - "archived": false, - "in_trash": false, - "type": "paragraph", - "paragraph": { - "rich_text": [ - { - "type": "text", - "text": { - "content": "If an atom is used in a tree without a Provider, it will use the default state. This is so-called provider-less mode.", - "link": null - }, - "annotations": { - "bold": false, - "italic": false, - "strikethrough": false, - "underline": false, - "code": false, - "color": "default" - }, - "plain_text": "If an atom is used in a tree without a Provider, it will use the default state. This is so-called provider-less mode.", - "href": null - } - ], - "color": "default" - } - } - ] - }, - { - "object": "block", - "id": "f34a330f-5e80-460c-9c70-976a2dfb0783", - "parent": { - "type": "page_id", - "page_id": "56874170-f8d4-4bcc-996e-be4e43f67930" - }, - "created_time": "2023-12-01T09:07:00.000Z", - "last_edited_time": "2023-12-01T09:22:00.000Z", - "created_by": { - "object": "user", - "id": "5146391e-8b65-47f2-83b6-2bfe81194f32" - }, - "last_edited_by": { - "object": "user", - "id": "5146391e-8b65-47f2-83b6-2bfe81194f32" - }, - "has_children": false, - "archived": false, - "in_trash": false, - "type": "paragraph", - "paragraph": { - "rich_text": [ - { - "type": "text", - "text": { - "content": "원문 그대로 쉽게 받아들일 수 있다. ", - "link": null - }, - "annotations": { - "bold": false, - "italic": false, - "strikethrough": false, - "underline": false, - "code": false, - "color": "default" - }, - "plain_text": "원문 그대로 쉽게 받아들일 수 있다. ", - "href": null - }, - { - "type": "text", - "text": { - "content": "Provider", - "link": null - }, - "annotations": { - "bold": false, - "italic": false, - "strikethrough": false, - "underline": false, - "code": true, - "color": "default" - }, - "plain_text": "Provider", - "href": null - }, - { - "type": "text", - "text": { - "content": " 가 있다면 하나의 store 가지고 되는 셈이다. 없다면 Jotai에서 제공하는 기본 store를 사용한다.", - "link": null - }, - "annotations": { - "bold": false, - "italic": false, - "strikethrough": false, - "underline": false, - "code": false, - "color": "default" - }, - "plain_text": " 가 있다면 하나의 store 가지고 되는 셈이다. 없다면 Jotai에서 제공하는 기본 store를 사용한다.", - "href": null - } - ], - "color": "default" - } - }, - { - "object": "block", - "id": "c52b9348-540e-4103-b85a-154f61bf981f", - "parent": { - "type": "page_id", - "page_id": "56874170-f8d4-4bcc-996e-be4e43f67930" - }, - "created_time": "2023-12-01T09:24:00.000Z", - "last_edited_time": "2023-12-01T09:24:00.000Z", - "created_by": { - "object": "user", - "id": "5146391e-8b65-47f2-83b6-2bfe81194f32" - }, - "last_edited_by": { - "object": "user", - "id": "5146391e-8b65-47f2-83b6-2bfe81194f32" - }, - "has_children": false, - "archived": false, - "in_trash": false, - "type": "image", - "image": { - "caption": [], - "type": "file", - "file": { - "url": "https://www.notion.so/image/https%3A%2F%2Fprod-files-secure.s3.us-west-2.amazonaws.com%2Fcd7314a5-d906-43b0-81e7-42eff82c02a3%2Fc3afddad-67c2-4035-b70a-74ace650fd4a%2FUntitled.png?table=block&id=c52b9348-540e-4103-b85a-154f61bf981f&cache=v2", - "expiry_time": "2025-04-14T15:12:44.389Z" - }, - "format": { - "block_width": 837, - "block_height": 551, - "block_aspect_ratio": 1.5190562613430127 - } - } - }, - { - "object": "block", - "id": "c616b72e-8b1f-4449-8a6a-38f57737fdd8", - "parent": { - "type": "page_id", - "page_id": "56874170-f8d4-4bcc-996e-be4e43f67930" - }, - "created_time": "2023-12-01T09:22:00.000Z", - "last_edited_time": "2023-12-01T09:24:00.000Z", - "created_by": { - "object": "user", - "id": "5146391e-8b65-47f2-83b6-2bfe81194f32" - }, - "last_edited_by": { - "object": "user", - "id": "5146391e-8b65-47f2-83b6-2bfe81194f32" - }, - "has_children": false, - "archived": false, - "in_trash": false, - "type": "paragraph", - "paragraph": { - "rich_text": [ - { - "type": "text", - "text": { - "content": "s", - "link": null - }, - "annotations": { - "bold": false, - "italic": false, - "strikethrough": false, - "underline": false, - "code": false, - "color": "default" - }, - "plain_text": "s", - "href": null - }, - { - "type": "text", - "text": { - "content": "tore", - "link": null - }, - "annotations": { - "bold": true, - "italic": false, - "strikethrough": false, - "underline": false, - "code": false, - "color": "default" - }, - "plain_text": "tore", - "href": null - } - ], - "color": "default" - } - }, - { - "object": "block", - "id": "f23cbb0d-cc9d-4332-a501-dd7f2e0cbe0a", - "parent": { - "type": "page_id", - "page_id": "56874170-f8d4-4bcc-996e-be4e43f67930" - }, - "created_time": "2023-12-01T07:25:00.000Z", - "last_edited_time": "2023-12-02T07:27:00.000Z", - "created_by": { - "object": "user", - "id": "5146391e-8b65-47f2-83b6-2bfe81194f32" - }, - "last_edited_by": { - "object": "user", - "id": "5146391e-8b65-47f2-83b6-2bfe81194f32" - }, - "has_children": false, - "archived": false, - "in_trash": false, - "type": "paragraph", - "paragraph": { - "rich_text": [ - { - "type": "text", - "text": { - "content": "Jotai의 Core(store) 코드", - "link": { - "url": "https://github.com/pmndrs/jotai/blob/main/src/vanilla/store.ts" - } - }, - "annotations": { - "bold": false, - "italic": false, - "strikethrough": false, - "underline": false, - "code": false, - "color": "default" - }, - "plain_text": "Jotai의 Core(store) 코드", - "href": "https://github.com/pmndrs/jotai/blob/main/src/vanilla/store.ts" - }, - { - "type": "text", - "text": { - "content": "는 너무 길어서 생략하고 간단히 설명한다.", - "link": null - }, - "annotations": { - "bold": false, - "italic": false, - "strikethrough": false, - "underline": false, - "code": false, - "color": "default" - }, - "plain_text": "는 너무 길어서 생략하고 간단히 설명한다.", - "href": null - } - ], - "color": "default" - } - }, - { - "object": "block", - "id": "e962c492-8dc8-40d2-84cc-0cd1f074e62d", - "parent": { - "type": "page_id", - "page_id": "56874170-f8d4-4bcc-996e-be4e43f67930" - }, - "created_time": "2023-12-01T09:24:00.000Z", - "last_edited_time": "2023-12-01T09:40:00.000Z", - "created_by": { - "object": "user", - "id": "5146391e-8b65-47f2-83b6-2bfe81194f32" - }, - "last_edited_by": { - "object": "user", - "id": "5146391e-8b65-47f2-83b6-2bfe81194f32" - }, - "has_children": false, - "archived": false, - "in_trash": false, - "type": "paragraph", - "paragraph": { - "rich_text": [ - { - "type": "text", - "text": { - "content": "Zustand의 ", - "link": null - }, - "annotations": { - "bold": false, - "italic": false, - "strikethrough": false, - "underline": false, - "code": false, - "color": "default" - }, - "plain_text": "Zustand의 ", - "href": null - }, - { - "type": "text", - "text": { - "content": "createStoreImpl", - "link": null - }, - "annotations": { - "bold": false, - "italic": false, - "strikethrough": false, - "underline": false, - "code": true, - "color": "default" - }, - "plain_text": "createStoreImpl", - "href": null - }, - { - "type": "text", - "text": { - "content": " 의 반환값과 동일하게 Jotai도 ", - "link": null - }, - "annotations": { - "bold": false, - "italic": false, - "strikethrough": false, - "underline": false, - "code": false, - "color": "default" - }, - "plain_text": " 의 반환값과 동일하게 Jotai도 ", - "href": null - }, - { - "type": "text", - "text": { - "content": "createStore", - "link": null - }, - "annotations": { - "bold": false, - "italic": false, - "strikethrough": false, - "underline": false, - "code": true, - "color": "default" - }, - "plain_text": "createStore", - "href": null - }, - { - "type": "text", - "text": { - "content": " 가 ", - "link": null - }, - "annotations": { - "bold": false, - "italic": false, - "strikethrough": false, - "underline": false, - "code": false, - "color": "default" - }, - "plain_text": " 가 ", - "href": null - }, - { - "type": "text", - "text": { - "content": "get, set, sub", - "link": null - }, - "annotations": { - "bold": false, - "italic": false, - "strikethrough": false, - "underline": false, - "code": true, - "color": "default" - }, - "plain_text": "get, set, sub", - "href": null - }, - { - "type": "text", - "text": { - "content": " 를 반환한다.", - "link": null - }, - "annotations": { - "bold": false, - "italic": false, - "strikethrough": false, - "underline": false, - "code": false, - "color": "default" - }, - "plain_text": " 를 반환한다.", - "href": null - } - ], - "color": "default" - } - }, - { - "object": "block", - "id": "0b349e05-5de5-4e0a-ba9d-b14f326b6b25", - "parent": { - "type": "page_id", - "page_id": "56874170-f8d4-4bcc-996e-be4e43f67930" - }, - "created_time": "2023-12-01T09:36:00.000Z", - "last_edited_time": "2023-12-01T10:08:00.000Z", - "created_by": { - "object": "user", - "id": "5146391e-8b65-47f2-83b6-2bfe81194f32" - }, - "last_edited_by": { - "object": "user", - "id": "5146391e-8b65-47f2-83b6-2bfe81194f32" - }, - "has_children": false, - "archived": false, - "in_trash": false, - "type": "code", - "code": { - "caption": [], - "rich_text": [ - { - "type": "text", - "text": { - "content": "const createStore = () => {\n\n\t...\n\n\treturn {\n\t get: readAtom, // atom의 값을 읽어온다.\n\t set: writeAtom, // atom의 값을 변경한다.\n\t sub: subscribeAtom,\n\t }\n}", - "link": null - }, - "annotations": { - "bold": false, - "italic": false, - "strikethrough": false, - "underline": false, - "code": false, - "color": "default" - }, - "plain_text": "const createStore = () => {\n\n\t...\n\n\treturn {\n\t get: readAtom, // atom의 값을 읽어온다.\n\t set: writeAtom, // atom의 값을 변경한다.\n\t sub: subscribeAtom,\n\t }\n}", - "href": null - } - ], - "language": "typescript" - } - }, - { - "object": "block", - "id": "2d8c4fd0-394f-4b5c-b3d6-a5577ab758d7", - "parent": { - "type": "page_id", - "page_id": "56874170-f8d4-4bcc-996e-be4e43f67930" - }, - "created_time": "2023-12-01T09:39:00.000Z", - "last_edited_time": "2023-12-01T09:42:00.000Z", - "created_by": { - "object": "user", - "id": "5146391e-8b65-47f2-83b6-2bfe81194f32" - }, - "last_edited_by": { - "object": "user", - "id": "5146391e-8b65-47f2-83b6-2bfe81194f32" - }, - "has_children": false, - "archived": false, - "in_trash": false, - "type": "paragraph", - "paragraph": { - "rich_text": [ - { - "type": "text", - "text": { - "content": "subscribeAtom", - "link": null - }, - "annotations": { - "bold": false, - "italic": false, - "strikethrough": false, - "underline": false, - "code": true, - "color": "default" - }, - "plain_text": "subscribeAtom", - "href": null - } - ], - "color": "default" - } - }, - { - "object": "block", - "id": "726f392f-5e38-4b45-bd98-31e2a65db6e7", - "parent": { - "type": "page_id", - "page_id": "56874170-f8d4-4bcc-996e-be4e43f67930" - }, - "created_time": "2023-12-01T09:42:00.000Z", - "last_edited_time": "2023-12-05T05:31:00.000Z", - "created_by": { - "object": "user", - "id": "5146391e-8b65-47f2-83b6-2bfe81194f32" - }, - "last_edited_by": { - "object": "user", - "id": "5146391e-8b65-47f2-83b6-2bfe81194f32" - }, - "has_children": false, - "archived": false, - "in_trash": false, - "type": "code", - "code": { - "caption": [], - "rich_text": [ - { - "type": "text", - "text": { - "content": "const subscribeAtom = (atom, listener) => {\n const mounted = addAtom(atom);\n\t\tconst flushed = flushPending();\n const listeners = mounted.l;\n listeners.add(listener);\n\n return () => {\n listeners.delete(listener);\n delAtom(atom);\n };\n };\n\nconst flushPending = () => {\n ...\n\n mounted.l.forEach((listener) => listener())\n\n ...\n}", - "link": null - }, - "annotations": { - "bold": false, - "italic": false, - "strikethrough": false, - "underline": false, - "code": false, - "color": "default" - }, - "plain_text": "const subscribeAtom = (atom, listener) => {\n const mounted = addAtom(atom);\n\t\tconst flushed = flushPending();\n const listeners = mounted.l;\n listeners.add(listener);\n\n return () => {\n listeners.delete(listener);\n delAtom(atom);\n };\n };\n\nconst flushPending = () => {\n ...\n\n mounted.l.forEach((listener) => listener())\n\n ...\n}", - "href": null - } - ], - "language": "typescript" - } - }, - { - "object": "block", - "id": "c936117d-14a0-4a75-9b27-5658a886e800", - "parent": { - "type": "page_id", - "page_id": "56874170-f8d4-4bcc-996e-be4e43f67930" - }, - "created_time": "2023-12-01T09:44:00.000Z", - "last_edited_time": "2023-12-01T12:04:00.000Z", - "created_by": { - "object": "user", - "id": "5146391e-8b65-47f2-83b6-2bfe81194f32" - }, - "last_edited_by": { - "object": "user", - "id": "5146391e-8b65-47f2-83b6-2bfe81194f32" - }, - "has_children": false, - "archived": false, - "in_trash": false, - "type": "paragraph", - "paragraph": { - "rich_text": [ - { - "type": "text", - "text": { - "content": "어디서 많이 본 패턴이다. 바로 Zustand에서 사용하는 구독 모델과 거의 유사하다.", - "link": null - }, - "annotations": { - "bold": false, - "italic": false, - "strikethrough": false, - "underline": false, - "code": false, - "color": "default" - }, - "plain_text": "어디서 많이 본 패턴이다. 바로 Zustand에서 사용하는 구독 모델과 거의 유사하다.", - "href": null - } - ], - "color": "default" - } - }, - { - "object": "block", - "id": "243449dc-eabe-433e-b179-be4671d16876", - "parent": { - "type": "page_id", - "page_id": "56874170-f8d4-4bcc-996e-be4e43f67930" - }, - "created_time": "2023-12-01T09:56:00.000Z", - "last_edited_time": "2023-12-01T09:56:00.000Z", - "created_by": { - "object": "user", - "id": "5146391e-8b65-47f2-83b6-2bfe81194f32" - }, - "last_edited_by": { - "object": "user", - "id": "5146391e-8b65-47f2-83b6-2bfe81194f32" - }, - "has_children": false, - "archived": false, - "in_trash": false, - "type": "paragraph", - "paragraph": { - "rich_text": [ - { - "type": "text", - "text": { - "content": "리액트와 같이 사용하기", - "link": null - }, - "annotations": { - "bold": true, - "italic": false, - "strikethrough": false, - "underline": false, - "code": false, - "color": "default" - }, - "plain_text": "리액트와 같이 사용하기", - "href": null - } - ], - "color": "default" - } - }, - { - "object": "block", - "id": "7f86ca29-02c3-4c11-b050-42513385d6ba", - "parent": { - "type": "page_id", - "page_id": "56874170-f8d4-4bcc-996e-be4e43f67930" - }, - "created_time": "2023-12-01T09:56:00.000Z", - "last_edited_time": "2023-12-01T09:56:00.000Z", - "created_by": { - "object": "user", - "id": "5146391e-8b65-47f2-83b6-2bfe81194f32" - }, - "last_edited_by": { - "object": "user", - "id": "5146391e-8b65-47f2-83b6-2bfe81194f32" - }, - "has_children": false, - "archived": false, - "in_trash": false, - "type": "code", - "code": { - "caption": [], - "rich_text": [ - { - "type": "text", - "text": { - "content": "export function useAtom(\n atom,\n options,\n) {\n return [\n useAtomValue(atom, options),\n // We do wrong type assertion here, which results in throwing an error.\n useSetAtom(atom),\n ]\n}", - "link": null - }, - "annotations": { - "bold": false, - "italic": false, - "strikethrough": false, - "underline": false, - "code": false, - "color": "default" - }, - "plain_text": "export function useAtom(\n atom,\n options,\n) {\n return [\n useAtomValue(atom, options),\n // We do wrong type assertion here, which results in throwing an error.\n useSetAtom(atom),\n ]\n}", - "href": null - } - ], - "language": "typescript" - } - }, - { - "object": "block", - "id": "eaf4bec8-8a76-40ec-a768-af3e206cb659", - "parent": { - "type": "page_id", - "page_id": "56874170-f8d4-4bcc-996e-be4e43f67930" - }, - "created_time": "2023-12-01T09:57:00.000Z", - "last_edited_time": "2023-12-01T12:04:00.000Z", - "created_by": { - "object": "user", - "id": "5146391e-8b65-47f2-83b6-2bfe81194f32" - }, - "last_edited_by": { - "object": "user", - "id": "5146391e-8b65-47f2-83b6-2bfe81194f32" - }, - "has_children": false, - "archived": false, - "in_trash": false, - "type": "paragraph", - "paragraph": { - "rich_text": [ - { - "type": "text", - "text": { - "content": "밥 먹듯 사용하는 Jotai의 ", - "link": null - }, - "annotations": { - "bold": false, - "italic": false, - "strikethrough": false, - "underline": false, - "code": false, - "color": "default" - }, - "plain_text": "밥 먹듯 사용하는 Jotai의 ", - "href": null - }, - { - "type": "text", - "text": { - "content": "useAtom", - "link": null - }, - "annotations": { - "bold": false, - "italic": false, - "strikethrough": false, - "underline": false, - "code": true, - "color": "default" - }, - "plain_text": "useAtom", - "href": null - }, - { - "type": "text", - "text": { - "content": "은 ", - "link": null - }, - "annotations": { - "bold": false, - "italic": false, - "strikethrough": false, - "underline": false, - "code": false, - "color": "default" - }, - "plain_text": "은 ", - "href": null - }, - { - "type": "text", - "text": { - "content": "useAtomValue, useSetAtom", - "link": null - }, - "annotations": { - "bold": false, - "italic": false, - "strikethrough": false, - "underline": false, - "code": true, - "color": "default" - }, - "plain_text": "useAtomValue, useSetAtom", - "href": null - }, - { - "type": "text", - "text": { - "content": " 을 반환한다.", - "link": null - }, - "annotations": { - "bold": false, - "italic": false, - "strikethrough": false, - "underline": false, - "code": false, - "color": "default" - }, - "plain_text": " 을 반환한다.", - "href": null - } - ], - "color": "default" - } - }, - { - "object": "block", - "id": "d0c8b22c-d167-45cf-9366-cff2f6b8202a", - "parent": { - "type": "page_id", - "page_id": "56874170-f8d4-4bcc-996e-be4e43f67930" - }, - "created_time": "2023-12-01T09:57:00.000Z", - "last_edited_time": "2024-01-04T13:53:00.000Z", - "created_by": { - "object": "user", - "id": "5146391e-8b65-47f2-83b6-2bfe81194f32" - }, - "last_edited_by": { - "object": "user", - "id": "5146391e-8b65-47f2-83b6-2bfe81194f32" - }, - "has_children": false, - "archived": false, - "in_trash": false, - "type": "code", - "code": { - "caption": [], - "rich_text": [ - { - "type": "text", - "text": { - "content": "export const useAtomValue(atom, options) {\n\tconst store = useStore(options)\n\n\t...\n\n\tconst [[valueFromReducer, storeFromReducer, atomFromReducer], rerender] =\n\t useReducer(\n\t (prev) => {\n\t const nextValue = store.get(atom)\n\t if (\n\t Object.is(prev[0], nextValue) &&\n\t prev[1] === store &&\n\t prev[2] === atom\n\t ) {\n\t return prev\n\t }\n\t return [nextValue, store, atom]\n\t },\n\t undefined,\n\t () => [store.get(atom), store, atom]\n\t )\n\n\tlet value = valueFromReducer;\n\n\tvalue = store.get(atom)\n\n\t...\n\n\tuseEffect(() => {\n\t const unsub = store.sub(atom, () => {\n\t if (typeof delay === 'number') {\n\t // delay rerendering to wait a promise possibly to resolve\n\t setTimeout(rerender, delay)\n\t return\n\t }\n\t rerender()\n\t })\n\t rerender()\n\t return unsub\n\t }, [store, atom, delay])\n\n\treturn isPromiseLike(value) ? use(value) : (value)\n}", - "link": null - }, - "annotations": { - "bold": false, - "italic": false, - "strikethrough": false, - "underline": false, - "code": false, - "color": "default" - }, - "plain_text": "export const useAtomValue(atom, options) {\n\tconst store = useStore(options)\n\n\t...\n\n\tconst [[valueFromReducer, storeFromReducer, atomFromReducer], rerender] =\n\t useReducer(\n\t (prev) => {\n\t const nextValue = store.get(atom)\n\t if (\n\t Object.is(prev[0], nextValue) &&\n\t prev[1] === store &&\n\t prev[2] === atom\n\t ) {\n\t return prev\n\t }\n\t return [nextValue, store, atom]\n\t },\n\t undefined,\n\t () => [store.get(atom), store, atom]\n\t )\n\n\tlet value = valueFromReducer;\n\n\tvalue = store.get(atom)\n\n\t...\n\n\tuseEffect(() => {\n\t const unsub = store.sub(atom, () => {\n\t if (typeof delay === 'number') {\n\t // delay rerendering to wait a promise possibly to resolve\n\t setTimeout(rerender, delay)\n\t return\n\t }\n\t rerender()\n\t })\n\t rerender()\n\t return unsub\n\t }, [store, atom, delay])\n\n\treturn isPromiseLike(value) ? use(value) : (value)\n}", - "href": null - } - ], - "language": "typescript" - } - }, - { - "object": "block", - "id": "c7f8b247-27c6-4529-acb9-368f19863524", - "parent": { - "type": "page_id", - "page_id": "56874170-f8d4-4bcc-996e-be4e43f67930" - }, - "created_time": "2023-12-01T10:07:00.000Z", - "last_edited_time": "2023-12-01T10:08:00.000Z", - "created_by": { - "object": "user", - "id": "5146391e-8b65-47f2-83b6-2bfe81194f32" - }, - "last_edited_by": { - "object": "user", - "id": "5146391e-8b65-47f2-83b6-2bfe81194f32" - }, - "has_children": false, - "archived": false, - "in_trash": false, - "type": "paragraph", - "paragraph": { - "rich_text": [ - { - "type": "text", - "text": { - "content": "createStore", - "link": null - }, - "annotations": { - "bold": false, - "italic": false, - "strikethrough": false, - "underline": false, - "code": true, - "color": "default" - }, - "plain_text": "createStore", - "href": null - }, - { - "type": "text", - "text": { - "content": " 의 반환 값인 ", - "link": null - }, - "annotations": { - "bold": false, - "italic": false, - "strikethrough": false, - "underline": false, - "code": false, - "color": "default" - }, - "plain_text": " 의 반환 값인 ", - "href": null - }, - { - "type": "text", - "text": { - "content": "get, sub", - "link": null - }, - "annotations": { - "bold": false, - "italic": false, - "strikethrough": false, - "underline": false, - "code": true, - "color": "default" - }, - "plain_text": "get, sub", - "href": null - }, - { - "type": "text", - "text": { - "content": " 를 사용하는 것을 알 수 있다.", - "link": null - }, - "annotations": { - "bold": false, - "italic": false, - "strikethrough": false, - "underline": false, - "code": false, - "color": "default" - }, - "plain_text": " 를 사용하는 것을 알 수 있다.", - "href": null - } - ], - "color": "default" - } - }, - { - "object": "block", - "id": "03c000a6-c039-433b-a548-6d61bc5d6f0e", - "parent": { - "type": "page_id", - "page_id": "56874170-f8d4-4bcc-996e-be4e43f67930" - }, - "created_time": "2023-12-01T10:08:00.000Z", - "last_edited_time": "2023-12-01T10:09:00.000Z", - "created_by": { - "object": "user", - "id": "5146391e-8b65-47f2-83b6-2bfe81194f32" - }, - "last_edited_by": { - "object": "user", - "id": "5146391e-8b65-47f2-83b6-2bfe81194f32" - }, - "has_children": false, - "archived": false, - "in_trash": false, - "type": "paragraph", - "paragraph": { - "rich_text": [ - { - "type": "text", - "text": { - "content": "추가로 ", - "link": null - }, - "annotations": { - "bold": false, - "italic": false, - "strikethrough": false, - "underline": false, - "code": false, - "color": "default" - }, - "plain_text": "추가로 ", - "href": null - }, - { - "type": "text", - "text": { - "content": "store.sub", - "link": null - }, - "annotations": { - "bold": false, - "italic": false, - "strikethrough": false, - "underline": false, - "code": true, - "color": "default" - }, - "plain_text": "store.sub", - "href": null - }, - { - "type": "text", - "text": { - "content": " 으로 ", - "link": null - }, - "annotations": { - "bold": false, - "italic": false, - "strikethrough": false, - "underline": false, - "code": false, - "color": "default" - }, - "plain_text": " 으로 ", - "href": null - }, - { - "type": "text", - "text": { - "content": "atom", - "link": null - }, - "annotations": { - "bold": false, - "italic": false, - "strikethrough": false, - "underline": false, - "code": true, - "color": "default" - }, - "plain_text": "atom", - "href": null - }, - { - "type": "text", - "text": { - "content": " 를 구독하며 변경되면 ", - "link": null - }, - "annotations": { - "bold": false, - "italic": false, - "strikethrough": false, - "underline": false, - "code": false, - "color": "default" - }, - "plain_text": " 를 구독하며 변경되면 ", - "href": null - }, - { - "type": "text", - "text": { - "content": "rerender()", - "link": null - }, - "annotations": { - "bold": false, - "italic": false, - "strikethrough": false, - "underline": false, - "code": true, - "color": "default" - }, - "plain_text": "rerender()", - "href": null - }, - { - "type": "text", - "text": { - "content": " 을 호출하는 것을 볼 수 있다. ", - "link": null - }, - "annotations": { - "bold": false, - "italic": false, - "strikethrough": false, - "underline": false, - "code": false, - "color": "default" - }, - "plain_text": " 을 호출하는 것을 볼 수 있다. ", - "href": null - } - ], - "color": "default" - } - }, - { - "object": "block", - "id": "48e18ff9-ad96-49c1-abb0-a5a5710d3fe2", - "parent": { - "type": "page_id", - "page_id": "56874170-f8d4-4bcc-996e-be4e43f67930" - }, - "created_time": "2023-12-01T11:16:00.000Z", - "last_edited_time": "2025-04-14T14:09:00.000Z", - "created_by": { - "object": "user", - "id": "5146391e-8b65-47f2-83b6-2bfe81194f32" - }, - "last_edited_by": { - "object": "user", - "id": "5146391e-8b65-47f2-83b6-2bfe81194f32" - }, - "has_children": false, - "archived": false, - "in_trash": false, - "type": "image", - "image": { - "caption": [], - "type": "file", - "file": { - "url": "https://www.notion.so/image/https%3A%2F%2Fprod-files-secure.s3.us-west-2.amazonaws.com%2Fcd7314a5-d906-43b0-81e7-42eff82c02a3%2F54bd93f9-a001-4580-9b57-5a40e3c1cf72%2FUntitled.png?table=block&id=48e18ff9-ad96-49c1-abb0-a5a5710d3fe2&cache=v2", - "expiry_time": "2025-04-14T15:12:44.381Z" - }, - "format": { - "block_width": 917, - "block_height": 607, - "block_aspect_ratio": 1.5107084019769357 - } - } - }, - { - "object": "block", - "id": "74179ef2-deb1-4f32-82e1-4234077ad619", - "parent": { - "type": "page_id", - "page_id": "56874170-f8d4-4bcc-996e-be4e43f67930" - }, - "created_time": "2023-12-01T06:40:00.000Z", - "last_edited_time": "2023-12-01T12:04:00.000Z", - "created_by": { - "object": "user", - "id": "5146391e-8b65-47f2-83b6-2bfe81194f32" - }, - "last_edited_by": { - "object": "user", - "id": "5146391e-8b65-47f2-83b6-2bfe81194f32" - }, - "has_children": false, - "archived": false, - "in_trash": false, - "type": "paragraph", - "paragraph": { - "rich_text": [ - { - "type": "text", - "text": { - "content": "“2) useEffect Execute and Subscribe Store”가 위 코드의 useEffect 절에 해당하는 것을 알 수 있다.", - "link": null - }, - "annotations": { - "bold": false, - "italic": false, - "strikethrough": false, - "underline": false, - "code": false, - "color": "default" - }, - "plain_text": "“2) useEffect Execute and Subscribe Store”가 위 코드의 useEffect 절에 해당하는 것을 알 수 있다.", - "href": null - } - ], - "color": "default" - } - }, - { - "object": "block", - "id": "3566112f-fea1-42a9-a833-a5267f3e51e1", - "parent": { - "type": "page_id", - "page_id": "56874170-f8d4-4bcc-996e-be4e43f67930" - }, - "created_time": "2023-12-01T11:18:00.000Z", - "last_edited_time": "2023-12-01T11:18:00.000Z", - "created_by": { - "object": "user", - "id": "5146391e-8b65-47f2-83b6-2bfe81194f32" - }, - "last_edited_by": { - "object": "user", - "id": "5146391e-8b65-47f2-83b6-2bfe81194f32" - }, - "has_children": false, - "archived": false, - "in_trash": false, - "type": "paragraph", - "paragraph": { - "rich_text": [], - "color": "default" - } - }, - { - "object": "block", - "id": "96c10502-1c64-4d78-b7af-2c16effeb716", - "parent": { - "type": "page_id", - "page_id": "56874170-f8d4-4bcc-996e-be4e43f67930" - }, - "created_time": "2023-12-01T11:17:00.000Z", - "last_edited_time": "2023-12-01T11:19:00.000Z", - "created_by": { - "object": "user", - "id": "5146391e-8b65-47f2-83b6-2bfe81194f32" - }, - "last_edited_by": { - "object": "user", - "id": "5146391e-8b65-47f2-83b6-2bfe81194f32" - }, - "has_children": false, - "archived": false, - "in_trash": false, - "type": "code", - "code": { - "caption": [], - "rich_text": [ - { - "type": "text", - "text": { - "content": "export function useSetAtom(\n atom,\n options,\n) {\n const store = useStore(options)\n const setAtom = useCallback(\n (...args: Args) => {\n return store.set(atom, ...args)\n },\n [store, atom],\n )\n return setAtom\n}", - "link": null - }, - "annotations": { - "bold": false, - "italic": false, - "strikethrough": false, - "underline": false, - "code": false, - "color": "default" - }, - "plain_text": "export function useSetAtom(\n atom,\n options,\n) {\n const store = useStore(options)\n const setAtom = useCallback(\n (...args: Args) => {\n return store.set(atom, ...args)\n },\n [store, atom],\n )\n return setAtom\n}", - "href": null - } - ], - "language": "typescript" - } - }, - { - "object": "block", - "id": "04a726bd-6fe0-40c5-8866-1838530e7a9d", - "parent": { - "type": "page_id", - "page_id": "56874170-f8d4-4bcc-996e-be4e43f67930" - }, - "created_time": "2023-12-01T11:19:00.000Z", - "last_edited_time": "2023-12-01T11:19:00.000Z", - "created_by": { - "object": "user", - "id": "5146391e-8b65-47f2-83b6-2bfe81194f32" - }, - "last_edited_by": { - "object": "user", - "id": "5146391e-8b65-47f2-83b6-2bfe81194f32" - }, - "has_children": false, - "archived": false, - "in_trash": false, - "type": "paragraph", - "paragraph": { - "rich_text": [ - { - "type": "text", - "text": { - "content": "예상했듯이 ", - "link": null - }, - "annotations": { - "bold": false, - "italic": false, - "strikethrough": false, - "underline": false, - "code": false, - "color": "default" - }, - "plain_text": "예상했듯이 ", - "href": null - }, - { - "type": "text", - "text": { - "content": "useSetAtom", - "link": null - }, - "annotations": { - "bold": false, - "italic": false, - "strikethrough": false, - "underline": false, - "code": true, - "color": "default" - }, - "plain_text": "useSetAtom", - "href": null - }, - { - "type": "text", - "text": { - "content": " 은 ", - "link": null - }, - "annotations": { - "bold": false, - "italic": false, - "strikethrough": false, - "underline": false, - "code": false, - "color": "default" - }, - "plain_text": " 은 ", - "href": null - }, - { - "type": "text", - "text": { - "content": "createStore", - "link": null - }, - "annotations": { - "bold": false, - "italic": false, - "strikethrough": false, - "underline": false, - "code": true, - "color": "default" - }, - "plain_text": "createStore", - "href": null - }, - { - "type": "text", - "text": { - "content": " 의 ", - "link": null - }, - "annotations": { - "bold": false, - "italic": false, - "strikethrough": false, - "underline": false, - "code": false, - "color": "default" - }, - "plain_text": " 의 ", - "href": null - }, - { - "type": "text", - "text": { - "content": "set", - "link": null - }, - "annotations": { - "bold": false, - "italic": false, - "strikethrough": false, - "underline": false, - "code": true, - "color": "default" - }, - "plain_text": "set", - "href": null - }, - { - "type": "text", - "text": { - "content": " 을 사용한다.", - "link": null - }, - "annotations": { - "bold": false, - "italic": false, - "strikethrough": false, - "underline": false, - "code": false, - "color": "default" - }, - "plain_text": " 을 사용한다.", - "href": null - } - ], - "color": "default" - } - }, - { - "object": "block", - "id": "a19ee5b3-699e-4105-8231-b9cbfc8987cd", - "parent": { - "type": "page_id", - "page_id": "56874170-f8d4-4bcc-996e-be4e43f67930" - }, - "created_time": "2023-12-01T11:18:00.000Z", - "last_edited_time": "2025-04-14T14:09:00.000Z", - "created_by": { - "object": "user", - "id": "5146391e-8b65-47f2-83b6-2bfe81194f32" - }, - "last_edited_by": { - "object": "user", - "id": "5146391e-8b65-47f2-83b6-2bfe81194f32" - }, - "has_children": false, - "archived": false, - "in_trash": false, - "type": "image", - "image": { - "caption": [], - "type": "file", - "file": { - "url": "https://www.notion.so/image/https%3A%2F%2Fprod-files-secure.s3.us-west-2.amazonaws.com%2Fcd7314a5-d906-43b0-81e7-42eff82c02a3%2F72b6c885-fc4f-4399-9dd2-0d41601ccc66%2FUntitled.png?table=block&id=a19ee5b3-699e-4105-8231-b9cbfc8987cd&cache=v2", - "expiry_time": "2025-04-14T15:12:44.404Z" - }, - "format": { - "block_width": 1112, - "block_height": 666, - "block_aspect_ratio": 1.6696696696696696 - } - } - }, - { - "object": "block", - "id": "853ae1ae-9c65-41c1-8998-853399a572dd", - "parent": { - "type": "page_id", - "page_id": "56874170-f8d4-4bcc-996e-be4e43f67930" - }, - "created_time": "2023-12-01T06:40:00.000Z", - "last_edited_time": "2023-12-01T11:25:00.000Z", - "created_by": { - "object": "user", - "id": "5146391e-8b65-47f2-83b6-2bfe81194f32" - }, - "last_edited_by": { - "object": "user", - "id": "5146391e-8b65-47f2-83b6-2bfe81194f32" - }, - "has_children": false, - "archived": false, - "in_trash": false, - "type": "paragraph", - "paragraph": { - "rich_text": [ - { - "type": "text", - "text": { - "content": "마지막으로 ", - "link": null - }, - "annotations": { - "bold": false, - "italic": false, - "strikethrough": false, - "underline": false, - "code": false, - "color": "default" - }, - "plain_text": "마지막으로 ", - "href": null - }, - { - "type": "text", - "text": { - "content": "atom, Provider, Store, Component", - "link": null - }, - "annotations": { - "bold": false, - "italic": false, - "strikethrough": false, - "underline": false, - "code": true, - "color": "default" - }, - "plain_text": "atom, Provider, Store, Component", - "href": null - }, - { - "type": "text", - "text": { - "content": " 간의 연관 관계를 보여주는 그림이다.", - "link": null - }, - "annotations": { - "bold": false, - "italic": false, - "strikethrough": false, - "underline": false, - "code": false, - "color": "default" - }, - "plain_text": " 간의 연관 관계를 보여주는 그림이다.", - "href": null - } - ], - "color": "default" - } - }, - { - "object": "block", - "id": "73514eff-07fb-4893-85bf-d676a3170f48", - "parent": { - "type": "page_id", - "page_id": "56874170-f8d4-4bcc-996e-be4e43f67930" - }, - "created_time": "2023-12-01T06:40:00.000Z", - "last_edited_time": "2023-12-01T11:41:00.000Z", - "created_by": { - "object": "user", - "id": "5146391e-8b65-47f2-83b6-2bfe81194f32" - }, - "last_edited_by": { - "object": "user", - "id": "5146391e-8b65-47f2-83b6-2bfe81194f32" - }, - "has_children": false, - "archived": false, - "in_trash": false, - "type": "heading_1", - "heading_1": { - "rich_text": [ - { - "type": "text", - "text": { - "content": "정리", - "link": null - }, - "annotations": { - "bold": false, - "italic": false, - "strikethrough": false, - "underline": false, - "code": false, - "color": "default" - }, - "plain_text": "정리", - "href": null - } - ], - "is_toggleable": false, - "color": "default" - } - }, - { - "object": "block", - "id": "625ebf31-08c1-425c-92d7-eb3ddca98e56", - "parent": { - "type": "page_id", - "page_id": "56874170-f8d4-4bcc-996e-be4e43f67930" - }, - "created_time": "2023-12-01T11:25:00.000Z", - "last_edited_time": "2023-12-02T07:27:00.000Z", - "created_by": { - "object": "user", - "id": "5146391e-8b65-47f2-83b6-2bfe81194f32" - }, - "last_edited_by": { - "object": "user", - "id": "5146391e-8b65-47f2-83b6-2bfe81194f32" - }, - "has_children": false, - "archived": false, - "in_trash": false, - "type": "paragraph", - "paragraph": { - "rich_text": [ - { - "type": "text", - "text": { - "content": "짧게 쓰려고 했는데 코어한 부분까지 보려고 하다 보니 생각보다 길어졌다..\n개인적으로는 상태를 원자 단위로 관리하며 그 원자들을 조합하며 확장하는 방식에 좀 더 공감하지만, \n“무엇이 더 우월하다”라고 말하기는 힘든 것 같다.\n자신(팀)의 현재 상황, 프로젝트의 구조, 규모 등 상황에 따라 적용하면 좋을 상태 관리 라이브러리는 달라진다고 생각한다. ", - "link": null - }, - "annotations": { - "bold": false, - "italic": false, - "strikethrough": false, - "underline": false, - "code": false, - "color": "default" - }, - "plain_text": "짧게 쓰려고 했는데 코어한 부분까지 보려고 하다 보니 생각보다 길어졌다..\n개인적으로는 상태를 원자 단위로 관리하며 그 원자들을 조합하며 확장하는 방식에 좀 더 공감하지만, \n“무엇이 더 우월하다”라고 말하기는 힘든 것 같다.\n자신(팀)의 현재 상황, 프로젝트의 구조, 규모 등 상황에 따라 적용하면 좋을 상태 관리 라이브러리는 달라진다고 생각한다. ", - "href": null - } - ], - "color": "default" - } - }, - { - "object": "block", - "id": "4bd6789e-fd8a-4309-8163-75f9860bb6f5", - "parent": { - "type": "page_id", - "page_id": "56874170-f8d4-4bcc-996e-be4e43f67930" - }, - "created_time": "2023-09-12T02:50:00.000Z", - "last_edited_time": "2023-12-01T11:42:00.000Z", - "created_by": { - "object": "user", - "id": "5146391e-8b65-47f2-83b6-2bfe81194f32" - }, - "last_edited_by": { - "object": "user", - "id": "5146391e-8b65-47f2-83b6-2bfe81194f32" - }, - "has_children": false, - "archived": false, - "in_trash": false, - "type": "heading_1", - "heading_1": { - "rich_text": [ - { - "type": "text", - "text": { - "content": "Reference", - "link": null - }, - "annotations": { - "bold": false, - "italic": false, - "strikethrough": false, - "underline": false, - "code": false, - "color": "default" - }, - "plain_text": "Reference", - "href": null - } - ], - "is_toggleable": false, - "color": "default" - } - }, - { - "object": "block", - "id": "ee4fcdad-d263-412c-8b90-283f0d9b2158", - "parent": { - "type": "page_id", - "page_id": "56874170-f8d4-4bcc-996e-be4e43f67930" - }, - "created_time": "2023-11-30T02:19:00.000Z", - "last_edited_time": "2023-12-01T11:42:00.000Z", - "created_by": { - "object": "user", - "id": "5146391e-8b65-47f2-83b6-2bfe81194f32" - }, - "last_edited_by": { - "object": "user", - "id": "5146391e-8b65-47f2-83b6-2bfe81194f32" - }, - "has_children": false, - "archived": false, - "in_trash": false, - "type": "bookmark", - "bookmark": { - "caption": [], - "url": "https://react.dev/learn/passing-data-deeply-with-context", - "metadata": { - "title": "Passing Data Deeply with Context – React", - "description": "The library for web and native user interfaces", - "image": "https://react.dev/images/og-learn.png", - "siteName": "react.dev", - "url": "https://react.dev/learn/passing-data-deeply-with-context", - "favicon": "https://www.google.com/s2/favicons?domain=react.dev&sz=64" - } - } - }, - { - "object": "block", - "id": "8480d3cf-5bbb-4968-96d6-8ecb8e598221", - "parent": { - "type": "page_id", - "page_id": "56874170-f8d4-4bcc-996e-be4e43f67930" - }, - "created_time": "2023-09-24T08:21:00.000Z", - "last_edited_time": "2023-12-01T11:42:00.000Z", - "created_by": { - "object": "user", - "id": "5146391e-8b65-47f2-83b6-2bfe81194f32" - }, - "last_edited_by": { - "object": "user", - "id": "5146391e-8b65-47f2-83b6-2bfe81194f32" - }, - "has_children": false, - "archived": false, - "in_trash": false, - "type": "bookmark", - "bookmark": { - "caption": [], - "url": "https://velog.io/@ckstn0777/Context-API의-최대-단점은-무엇일까#context-api의-최대-단점", - "metadata": { - "title": "Context API의 최대 단점은 무엇일까", - "description": "이번 시간에는 Context API에 대해 좀 더 자세히 알아보고 왜 Context API 대신 Redux나 Recoil 같은 전역 상태 라이브러리를 많이 사용하는지 알아보도록 하겠습니다.", - "image": "https://velog.velcdn.com/images/ckstn0777/post/a07b295b-2b00-42b4-baf4-afa2b000e444/image.png", - "siteName": "velog.io", - "url": "https://velog.io/@ckstn0777/Context-API의-최대-단점은-무엇일까#context-api의-최대-단점", - "favicon": "https://www.google.com/s2/favicons?domain=velog.io&sz=64" - } - } - }, - { - "object": "block", - "id": "758b4d92-3372-4f74-9e70-4e0ecf12450c", - "parent": { - "type": "page_id", - "page_id": "56874170-f8d4-4bcc-996e-be4e43f67930" - }, - "created_time": "2023-11-30T07:16:00.000Z", - "last_edited_time": "2023-12-01T11:42:00.000Z", - "created_by": { - "object": "user", - "id": "5146391e-8b65-47f2-83b6-2bfe81194f32" - }, - "last_edited_by": { - "object": "user", - "id": "5146391e-8b65-47f2-83b6-2bfe81194f32" - }, - "has_children": false, - "archived": false, - "in_trash": false, - "type": "bookmark", - "bookmark": { - "caption": [], - "url": "https://redux-toolkit.js.org/tutorials/quick-start", - "metadata": { - "title": "Quick Start | Redux Toolkit", - "description": " ", - "image": "https://redux-toolkit.js.org/img/redux-logo-landscape.png", - "siteName": "redux-toolkit.js.org", - "url": "https://redux-toolkit.js.org/tutorials/quick-start", - "favicon": "https://www.google.com/s2/favicons?domain=redux-toolkit.js.org&sz=64" - } - } - }, - { - "object": "block", - "id": "877f0942-4950-41a2-bc70-a64064265490", - "parent": { - "type": "page_id", - "page_id": "56874170-f8d4-4bcc-996e-be4e43f67930" - }, - "created_time": "2023-11-30T06:42:00.000Z", - "last_edited_time": "2023-12-01T11:42:00.000Z", - "created_by": { - "object": "user", - "id": "5146391e-8b65-47f2-83b6-2bfe81194f32" - }, - "last_edited_by": { - "object": "user", - "id": "5146391e-8b65-47f2-83b6-2bfe81194f32" - }, - "has_children": false, - "archived": false, - "in_trash": false, - "type": "bookmark", - "bookmark": { - "caption": [], - "url": "https://ui.toast.com/weekly-pick/ko_20210812", - "metadata": { - "title": "React 상태 관리 라이브러리 Zustand의 코드를 파헤쳐보자", - "description": "TOAST UI Calendar의 새로운 상태 관리 방법을 도입하기 위해 참고한 라이브러리 Zustand의 코드를 분석해본다.", - "image": "https://user-images.githubusercontent.com/14539203/129129813-75f8b592-edae-4629-879a-f63a25b91195.jpeg", - "siteName": "ui.toast.com", - "url": "https://ui.toast.com/weekly-pick/ko_20210812", - "favicon": "https://www.google.com/s2/favicons?domain=ui.toast.com&sz=64" - } - } - }, - { - "object": "block", - "id": "5e93f6fe-71c3-4433-b03a-49df2694ad87", - "parent": { - "type": "page_id", - "page_id": "56874170-f8d4-4bcc-996e-be4e43f67930" - }, - "created_time": "2023-12-01T06:13:00.000Z", - "last_edited_time": "2023-12-01T11:42:00.000Z", - "created_by": { - "object": "user", - "id": "5146391e-8b65-47f2-83b6-2bfe81194f32" - }, - "last_edited_by": { - "object": "user", - "id": "5146391e-8b65-47f2-83b6-2bfe81194f32" - }, - "has_children": false, - "archived": false, - "in_trash": false, - "type": "bookmark", - "bookmark": { - "caption": [], - "url": "https://recoiljs.org/ko/docs/introduction/core-concepts", - "metadata": { - "title": "주요 개념 | Recoil", - "description": "개요", - "image": "https://recoiljs.org/ko/img/og-image.png", - "siteName": "recoiljs.org", - "url": "https://recoiljs.org/ko/docs/introduction/core-concepts", - "favicon": "https://www.google.com/s2/favicons?domain=recoiljs.org&sz=64" - } - } - }, - { - "object": "block", - "id": "ba656867-9c86-4c79-a9d9-cfe82e8180bd", - "parent": { - "type": "page_id", - "page_id": "56874170-f8d4-4bcc-996e-be4e43f67930" - }, - "created_time": "2023-12-01T06:07:00.000Z", - "last_edited_time": "2023-12-01T11:42:00.000Z", - "created_by": { - "object": "user", - "id": "5146391e-8b65-47f2-83b6-2bfe81194f32" - }, - "last_edited_by": { - "object": "user", - "id": "5146391e-8b65-47f2-83b6-2bfe81194f32" - }, - "has_children": false, - "archived": false, - "in_trash": false, - "type": "bookmark", - "bookmark": { - "caption": [], - "url": "https://techblog.yogiyo.co.kr/recoil을-이용한-손쉬운-상태관리-b70b32650582", - "metadata": { - "title": "Recoil을 이용한 손쉬운 상태관리", - "description": "Recoil의 장단점과 함께 효과적으로 상태관리 할 수 있는 방법을 소개하려고 합니다!", - "image": "https://miro.medium.com/v2/resize:fit:1200/1*IRLxvbUTy-UIjhot2vdO6Q.jpeg", - "siteName": "Medium", - "url": "https://techblog.yogiyo.co.kr/recoil을-이용한-손쉬운-상태관리-b70b32650582", - "favicon": "https://www.google.com/s2/favicons?domain=techblog.yogiyo.co.kr&sz=64" - } - } - }, - { - "object": "block", - "id": "6337cf47-04c9-469f-b393-d3129e4b6ddb", - "parent": { - "type": "page_id", - "page_id": "56874170-f8d4-4bcc-996e-be4e43f67930" - }, - "created_time": "2023-09-12T02:50:00.000Z", - "last_edited_time": "2023-12-01T11:42:00.000Z", - "created_by": { - "object": "user", - "id": "5146391e-8b65-47f2-83b6-2bfe81194f32" - }, - "last_edited_by": { - "object": "user", - "id": "5146391e-8b65-47f2-83b6-2bfe81194f32" - }, - "has_children": false, - "archived": false, - "in_trash": false, - "type": "bookmark", - "bookmark": { - "caption": [], - "url": "https://jotai.org/docs/introduction", - "metadata": { - "title": "Documentation — Jotai", - "description": "Table of contents", - "image": "https://cdn.candycode.com/jotai/jotai-opengraph-v2.png", - "siteName": "Jotai", - "url": "https://jotai.org/docs/introduction", - "favicon": "https://www.google.com/s2/favicons?domain=jotai.org&sz=64" - } - } - }, - { - "object": "block", - "id": "88cc8634-ab24-4e99-aa6f-34ac8bd3c8d2", - "parent": { - "type": "page_id", - "page_id": "56874170-f8d4-4bcc-996e-be4e43f67930" - }, - "created_time": "2023-09-12T02:50:00.000Z", - "last_edited_time": "2023-12-01T11:42:00.000Z", - "created_by": { - "object": "user", - "id": "5146391e-8b65-47f2-83b6-2bfe81194f32" - }, - "last_edited_by": { - "object": "user", - "id": "5146391e-8b65-47f2-83b6-2bfe81194f32" - }, - "has_children": false, - "archived": false, - "in_trash": false, - "type": "bookmark", - "bookmark": { - "caption": [], - "url": "https://blog.hwahae.co.kr/all/tech/tech-tech/6099", - "metadata": { - "title": "Atomic state management - Jotai – 화해 블로그 | 기술 블로그", - "description": "상태 관리 jotai 과거에는 상태 관리를 위해 당연하듯 Redux를 고려했었는데 리액트 v16.8의 hook의 등장 이후로 많은 선택지가 생겨나게 되었고 이에 따라 저희 역시 새로운 시도에 대한 고민을 해왔습니다. 자료를 조사해가던 중 Jotai라는 상태 관리를 언급한 문장을 보았습니다.", - "image": "https://blog-wp.hwahae.co.kr/wp-content/uploads/2021/06/210630_fin_00_cover.jpg", - "siteName": "화해 블로그 | 기술 블로그", - "url": "https://blog.hwahae.co.kr/all/tech/tech-tech/6099", - "favicon": "https://www.google.com/s2/favicons?domain=blog.hwahae.co.kr&sz=64" - } - } - }, - { - "object": "block", - "id": "0b8ee069-5d2c-407b-a65c-5ed5ab1f5f44", - "parent": { - "type": "page_id", - "page_id": "56874170-f8d4-4bcc-996e-be4e43f67930" - }, - "created_time": "2023-11-30T06:26:00.000Z", - "last_edited_time": "2023-12-01T11:42:00.000Z", - "created_by": { - "object": "user", - "id": "5146391e-8b65-47f2-83b6-2bfe81194f32" - }, - "last_edited_by": { - "object": "user", - "id": "5146391e-8b65-47f2-83b6-2bfe81194f32" - }, - "has_children": false, - "archived": false, - "in_trash": false, - "type": "bookmark", - "bookmark": { - "caption": [], - "url": "https://seungahhong.github.io/blog/2023/09/2023-09-10-react-state/", - "metadata": { - "title": "seungahhong.github.io", - "description": "", - "image": "", - "siteName": "seungahhong.github.io", - "url": "https://seungahhong.github.io/blog/2023/09/2023-09-10-react-state/", - "favicon": "https://www.google.com/s2/favicons?domain=seungahhong.github.io&sz=64" - } - } - }, - { - "object": "block", - "id": "98d93999-bebc-427f-bf7f-121a59ee7d01", - "parent": { - "type": "page_id", - "page_id": "56874170-f8d4-4bcc-996e-be4e43f67930" - }, - "created_time": "2023-11-30T08:09:00.000Z", - "last_edited_time": "2023-12-01T11:42:00.000Z", - "created_by": { - "object": "user", - "id": "5146391e-8b65-47f2-83b6-2bfe81194f32" - }, - "last_edited_by": { - "object": "user", - "id": "5146391e-8b65-47f2-83b6-2bfe81194f32" - }, - "has_children": false, - "archived": false, - "in_trash": false, - "type": "bookmark", - "bookmark": { - "caption": [], - "url": "https://github.com/pmndrs/zustand/blob/main/src/vanilla.ts", - "metadata": { - "title": "zustand/src/vanilla.ts at main · pmndrs/zustand", - "description": "🐻 Bear necessities for state management in React. Contribute to pmndrs/zustand development by creating an account on GitHub.", - "image": "https://repository-images.githubusercontent.com/180328715/fca49300-e7f1-11ea-9f51-cfd949b31560", - "siteName": "GitHub", - "url": "https://github.com/pmndrs/zustand/blob/main/src/vanilla.ts", - "favicon": "https://www.google.com/s2/favicons?domain=github.com&sz=64" - } - } - }, - { - "object": "block", - "id": "06fe1a8c-48a2-425c-8c51-04c39bde3151", - "parent": { - "type": "page_id", - "page_id": "56874170-f8d4-4bcc-996e-be4e43f67930" - }, - "created_time": "2023-12-01T07:13:00.000Z", - "last_edited_time": "2023-12-01T11:42:00.000Z", - "created_by": { - "object": "user", - "id": "5146391e-8b65-47f2-83b6-2bfe81194f32" - }, - "last_edited_by": { - "object": "user", - "id": "5146391e-8b65-47f2-83b6-2bfe81194f32" - }, - "has_children": false, - "archived": false, - "in_trash": false, - "type": "bookmark", - "bookmark": { - "caption": [], - "url": "https://github.com/pmndrs/jotai/blob/main/src/vanilla/store.ts", - "metadata": { - "title": "jotai/src/vanilla/store.ts at main · pmndrs/jotai", - "description": "👻 Primitive and flexible state management for React - pmndrs/jotai", - "image": "https://repository-images.githubusercontent.com/286867459/2588acf7-7c1d-46d1-923b-83dc335230e6", - "siteName": "GitHub", - "url": "https://github.com/pmndrs/jotai/blob/main/src/vanilla/store.ts", - "favicon": "https://www.google.com/s2/favicons?domain=github.com&sz=64" - } - } } ] \ No newline at end of file diff --git a/packages/notion-to-jsx/src/components/Renderer/components/Block/BlockRenderer.tsx b/packages/notion-to-jsx/src/components/Renderer/components/Block/BlockRenderer.tsx index 3ab0ae5..0a85085 100644 --- a/packages/notion-to-jsx/src/components/Renderer/components/Block/BlockRenderer.tsx +++ b/packages/notion-to-jsx/src/components/Renderer/components/Block/BlockRenderer.tsx @@ -10,6 +10,7 @@ import { ColumnList } from '../Column'; import { Quote } from '../Quote'; import Table from '../Table'; import { Toggle } from '../Toggle'; +import { Video } from '../Video'; import { NotionBlock } from '../../../../types'; export interface Props { @@ -99,6 +100,9 @@ const BlockRenderer = ({ block, isColumn = false }: Props) => { case 'toggle': return ; + case 'video': + return