<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Kanban on kenji.blog</title><link>http://kenji.blog/ko/tags/kanban/</link><description>Recent content in Kanban on kenji.blog</description><generator>Hugo -- gohugo.io</generator><language>ko</language><copyright>kenjinote</copyright><lastBuildDate>Sat, 12 Sep 2026 12:00:00 +0900</lastBuildDate><atom:link href="http://kenji.blog/ko/tags/kanban/index.xml" rel="self" type="application/rss+xml"/><item><title>Notion을 활용한 개인 개발 및 블로그 집필 태스크 관리술</title><link>http://kenji.blog/ko/p/notion-task-management-blog-dev/</link><pubDate>Sat, 12 Sep 2026 12:00:00 +0900</pubDate><guid>http://kenji.blog/ko/p/notion-task-management-blog-dev/</guid><description>&lt;img src="http://kenji.blog/p/notion-task-management-blog-dev/img/eyecatch.jpg" alt="Featured image of post Notion을 활용한 개인 개발 및 블로그 집필 태스크 관리술" />&lt;h1 id="notion을-활용한-개인-개발-및-블로그-집필-태스크-관리술">Notion을 활용한 개인 개발 및 블로그 집필 태스크 관리술
&lt;/h1>&lt;p>개인 개발이나 블로그 집필을 지속해 나가는 데 있어, 태스크 관리와 동기 부여 유지, 그리고 일상의 아이디어를 어떻게 축적하고 활용할 것인가는 매우 중요한 주제입니다. 프로젝트가 커지면 커질수록 해야 할 일은 늘어나고, 어떤 작업부터 손을 대야 할지 망설이게 되는 경우가 많습니다. 더욱이 블로그 소재나 기술적인 메모 등 일상적으로 발생하는 정보를 어디에, 어떻게 저장할 것인지도 과제가 됩니다.&lt;/p>
&lt;p>이러한 다양한 니즈를 하나의 플랫폼에서 해결할 수 있는 도구로서 현재 가장 강력한 것이 &lt;strong>Notion&lt;/strong>입니다. 본 기사에서는 Notion을 단순한 메모장이나 태스크 관리 도구로 끝내지 않고, 개인 개발과 블로그 집필을 원활하게 통합하며, 자동화 및 고도화된 진척 관리를 도입한 &amp;lsquo;궁극의 태스크 관리술&amp;rsquo;을 매우 상세하고 기술적인 관점에서 해설합니다.&lt;/p>
&lt;hr>
&lt;h2 id="1-para-메서드와-notion의-친화성">1. PARA 메서드와 Notion의 친화성
&lt;/h2>&lt;p>먼저 정보를 어떻게 정리할 것인가 하는 토대 부분부터 이야기하겠습니다. Notion과 같이 자유도가 높은 도구에서는 페이지나 데이터베이스가 무질서하게 증식해 버려 &amp;lsquo;어디에 무엇이 있는지 모르는&amp;rsquo; 상태에 빠지기 쉽습니다. 이를 방지하기 위해 Tiago Forte 씨가 제창하는 &lt;strong>PARA 메서드&lt;/strong>를 도입합니다.&lt;/p>
&lt;p>PARA 메서드는 정보를 다음 4가지 카테고리로 분류하는 기법입니다.&lt;/p>
&lt;ol>
&lt;li>&lt;strong>Projects (프로젝트)&lt;/strong>: 명확한 목표와 기한을 가진 태스크의 집합 (예: &amp;ldquo;새로운 웹 앱 릴리스&amp;rdquo;, &amp;ldquo;블로그 디자인 리뉴얼&amp;rdquo;).&lt;/li>
&lt;li>&lt;strong>Areas (영역)&lt;/strong>: 장기적으로 유지 및 관리해야 하는 책임 영역 (예: &amp;ldquo;건강&amp;rdquo;, &amp;ldquo;블로그 운영(지속적)&amp;rdquo;, &amp;ldquo;재무&amp;rdquo;).&lt;/li>
&lt;li>&lt;strong>Resources (리소스)&lt;/strong>: 관심 있는 주제나 장래에 도움이 될지도 모르는 정보 (예: &amp;ldquo;Python 코드 스니펫&amp;rdquo;, &amp;ldquo;UI 디자인 참고 자료&amp;rdquo;).&lt;/li>
&lt;li>&lt;strong>Archives (아카이브)&lt;/strong>: 완료된 프로젝트나 현재는 활성화되어 있지 않지만 저장해 두고 싶은 정보.&lt;/li>
&lt;/ol>
&lt;p>Notion에서 이를 실현하기 위해서는 왼쪽 사이드바의 계층을 이 4가지로 엄격하게 나누는 것부터 시작합니다. 특히 &amp;lsquo;Projects&amp;rsquo;와 &amp;lsquo;Areas/Resources&amp;rsquo;를 분리함으로써, 지금 집중해야 할 태스크(Projects)와 이를 위한 인풋(Resources)이 섞이지 않고 명확한 사고를 유지할 수 있습니다.&lt;/p>
&lt;hr>
&lt;h2 id="2-데이터베이스-설계-projects와-tasks의-관계형-구조">2. 데이터베이스 설계: Projects와 Tasks의 관계형 구조
&lt;/h2>&lt;p>Notion의 진정한 힘은 관계형 데이터베이스에 있습니다. 태스크 관리에서 가장 피해야 할 것은 모든 태스크를 플랫한 하나의 리스트로 관리해 버리는 것입니다. 프로젝트별로 태스크를 분할하고 이들을 연관시킴으로써, 전체적인 흐름과 세부 사항을 동시에 파악할 수 있게 됩니다.&lt;/p>
&lt;p>여기에서는 &amp;lsquo;Projects(프로젝트)&amp;rsquo; 데이터베이스와 &amp;lsquo;Tasks(태스크)&amp;rsquo; 데이터베이스를 생성하고, 이들을 관계형 속성(Relation)으로 연결합니다.&lt;/p>
&lt;h3 id="데이터베이스의-상관도">데이터베이스의 상관도
&lt;/h3>&lt;p>다음의 Mermaid 다이어그램은 Projects, Tasks, 그리고 후술할 Notes(Zettelkasten) 데이터베이스 간의 관계를 보여줍니다.&lt;/p>
&lt;pre class="mermaid">
flowchart TD
P[&amp;#34;Projects (프로젝트 DB)&amp;#34;]
T[&amp;#34;Tasks (태스크 DB)&amp;#34;]
N[&amp;#34;Notes (Zettelkasten DB)&amp;#34;]
P --&amp;gt;| 1:N 관계 | T
T --&amp;gt;| N:N 관계 | N
P --&amp;gt;| 1:N 관계 | N
&lt;/pre>
&lt;h3 id="projects-데이터베이스의-속성">Projects 데이터베이스의 속성
&lt;/h3>&lt;ul>
&lt;li>&lt;code>Project Name&lt;/code> (Title)&lt;/li>
&lt;li>&lt;code>Status&lt;/code> (Select: &amp;ldquo;Not Started&amp;rdquo;, &amp;ldquo;In Progress&amp;rdquo;, &amp;ldquo;Completed&amp;rdquo;)&lt;/li>
&lt;li>&lt;code>Deadline&lt;/code> (Date)&lt;/li>
&lt;li>&lt;code>Tasks&lt;/code> (Relation: Tasks 데이터베이스와 연결)&lt;/li>
&lt;li>&lt;code>Progress&lt;/code> (Rollup &amp;amp; Formula: 후술)&lt;/li>
&lt;/ul>
&lt;h3 id="tasks-데이터베이스의-속성">Tasks 데이터베이스의 속성
&lt;/h3>&lt;ul>
&lt;li>&lt;code>Task Name&lt;/code> (Title)&lt;/li>
&lt;li>&lt;code>Status&lt;/code> (Status: &amp;ldquo;To Do&amp;rdquo;, &amp;ldquo;In Progress&amp;rdquo;, &amp;ldquo;Done&amp;rdquo;)&lt;/li>
&lt;li>&lt;code>Priority&lt;/code> (Select: &amp;ldquo;High&amp;rdquo;, &amp;ldquo;Medium&amp;rdquo;, &amp;ldquo;Low&amp;rdquo;)&lt;/li>
&lt;li>&lt;code>Project&lt;/code> (Relation: Projects 데이터베이스와 연결)&lt;/li>
&lt;li>&lt;code>Due Date&lt;/code> (Date)&lt;/li>
&lt;li>&lt;code>Story Points&lt;/code> (Number: 태스크의 규모를 추정)&lt;/li>
&lt;/ul>
&lt;p>이처럼 데이터베이스를 분리함으로써, 프로젝트 화면을 열었을 때 해당 프로젝트에 속하는 태스크만 필터링하여 표시하는(링크된 데이터베이스 활용) 등 고도화된 뷰(View)를 작성할 수 있게 됩니다.&lt;/p>
&lt;hr>
&lt;h2 id="3-rollup과-formula를-활용한-진척-상황의-시각화">3. Rollup과 Formula를 활용한 진척 상황의 시각화
&lt;/h2>&lt;p>프로젝트의 진척을 직관적으로 파악하기 위해 Notion의 Formula(수식) 기능을 사용하여 프로그레스 바(진행률 표시줄)를 작성합니다. 이를 통해 &amp;lsquo;지금 이 프로젝트는 어느 정도 진행되었는가&amp;rsquo;를 한눈에 알 수 있게 됩니다.&lt;/p>
&lt;h3 id="rollup을-통한-데이터-집계">Rollup을 통한 데이터 집계
&lt;/h3>&lt;p>먼저 Projects 데이터베이스에서, Tasks 데이터베이스로부터 다음 2가지 Rollup 속성을 생성합니다.&lt;/p>
&lt;ol>
&lt;li>&lt;code>Total Tasks&lt;/code> (Rollup): Tasks 관계형에서 태스크의 &amp;lsquo;수(Count all)&amp;lsquo;를 가져옴.&lt;/li>
&lt;li>&lt;code>Completed Tasks&lt;/code> (Rollup): Tasks 관계형에서 상태(Status)가 &amp;ldquo;Done&amp;quot;으로 되어 있는 태스크의 수를 가져옴 (※또는 함수를 사용하여 완료 태스크를 카운트).&lt;/li>
&lt;/ol>
&lt;h3 id="formula에-의한-프로그레스-바-계산">Formula에 의한 프로그레스 바 계산
&lt;/h3>&lt;p>다음으로 Formula 속성을 생성하고, 이하의 계산식을 입력합니다.&lt;/p>
&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code>&lt;span class="lnt">1
&lt;/span>&lt;span class="lnt">2
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code class="language-javascript" data-lang="javascript">&lt;span class="line">&lt;span class="cl">&lt;span class="c1">// 프로그레스 바 계산식
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span>&lt;span class="nx">round&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="nx">prop&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s2">&amp;#34;Completed Tasks&amp;#34;&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="o">/&lt;/span> &lt;span class="nx">prop&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s2">&amp;#34;Total Tasks&amp;#34;&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="o">*&lt;/span> &lt;span class="mi">100&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;p>Notion의 최신 Formula 2.0에서는 이를 바탕으로 시각적인 프로그레스 바(링 모양이나 바 모양)를 UI 상에서 직접 설정할 수 있게 되었습니다. 만약 구형 작성 방법이나 텍스트 형태의 프로그레스 바 표시를 고집한다면, 다음과 같은 조건 분기를 사용하는 것도 가능합니다.&lt;/p>
&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code>&lt;span class="lnt">1
&lt;/span>&lt;span class="lnt">2
&lt;/span>&lt;span class="lnt">3
&lt;/span>&lt;span class="lnt">4
&lt;/span>&lt;span class="lnt">5
&lt;/span>&lt;span class="lnt">6
&lt;/span>&lt;span class="lnt">7
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code class="language-javascript" data-lang="javascript">&lt;span class="line">&lt;span class="cl">&lt;span class="c1">// 텍스트 기반의 프로그레스 바 (예)
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span>&lt;span class="kd">let&lt;/span>&lt;span class="p">(&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nx">percent&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="nx">round&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="nx">prop&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s2">&amp;#34;Completed Tasks&amp;#34;&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="o">/&lt;/span> &lt;span class="nx">prop&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s2">&amp;#34;Total Tasks&amp;#34;&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="o">*&lt;/span> &lt;span class="mi">100&lt;/span>&lt;span class="p">),&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nx">style&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="nx">percent&lt;/span> &lt;span class="o">+&lt;/span> &lt;span class="s2">&amp;#34;% &amp;#34;&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="s2">&amp;#34;b&amp;#34;&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="o">+&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nx">slice&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s2">&amp;#34;▓▓▓▓▓▓▓▓▓▓&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mi">0&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="nx">floor&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="nx">percent&lt;/span> &lt;span class="o">/&lt;/span> &lt;span class="mi">10&lt;/span>&lt;span class="p">))&lt;/span> &lt;span class="o">+&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nx">slice&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s2">&amp;#34;░░░░░░░░░░&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mi">0&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mi">10&lt;/span> &lt;span class="o">-&lt;/span> &lt;span class="nx">floor&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="nx">percent&lt;/span> &lt;span class="o">/&lt;/span> &lt;span class="mi">10&lt;/span>&lt;span class="p">))&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;h3 id="벨로시티개발-속도와-완료-예측의-수리적-접근">벨로시티(개발 속도)와 완료 예측의 수리적 접근
&lt;/h3>&lt;p>개인 개발에 있어서, 자신이 어느 정도의 페이스로 태스크를 소화할 수 있는지(벨로시티)를 아는 것은 정밀도 높은 일정 관리에 직결됩니다.
1주일에 소화할 수 있는 스토리 포인트의 합계를 벨로시티 $V$ 라고 하면, 다음과 같은 식으로 표현됩니다.&lt;/p>
$$ V = \frac{\sum_{i=1}^{n} SP_i}{T} $$&lt;p>여기서 $SP_i$ 는 완료한 태스크 $i$ 의 스토리 포인트, $T$ 는 측정 기간(예를 들어 스프린트의 주 수)입니다.&lt;/p>
&lt;p>만약 현재 프로젝트의 남은 전체 스토리 포인트가 $W$ 라면, 프로젝트 완료까지의 예측 기간 $E$ 는 다음과 같이 계산할 수 있습니다.&lt;/p>
$$ E = \frac{W}{V} $$&lt;p>이 계산을 Notion 내에서 완벽하게 수행하는 것은 조금 복잡하지만, 주간 리뷰(Weekly Review) 태스크 등에서 계산용 블록(Math block)을 두고 자기 평가의 지표로서 기록해 나가는 것이 매우 효과적입니다.&lt;/p>
&lt;hr>
&lt;h2 id="4-kanban-보드와-타임라인-뷰의-실천">4. Kanban 보드와 타임라인 뷰의 실천
&lt;/h2>&lt;p>태스크를 관리하기 위한 &amp;lsquo;뷰(View)&amp;lsquo;도 중요합니다. Notion에서는 같은 데이터베이스를 다양한 형식으로 표시(뷰)할 수 있습니다.&lt;/p>
&lt;h3 id="kanban-보드-board-view">Kanban 보드 (Board View)
&lt;/h3>&lt;p>&amp;lsquo;Tasks&amp;rsquo; 데이터베이스의 기본 뷰는 Status(To Do / In Progress / Done)를 그룹화한 칸반(Kanban) 보드로 설정합니다. 이를 통해 태스크를 드래그 앤 드롭으로 직관적으로 움직일 수 있으며, 현재의 병목 현상이 &amp;lsquo;진행 중&amp;rsquo; 열에 쌓여 있지 않은지를 시각적으로 체크할 수 있습니다.&lt;/p>
&lt;h3 id="타임라인-timeline-view">타임라인 (Timeline View)
&lt;/h3>&lt;p>&amp;lsquo;Projects&amp;rsquo;나 스케일이 조금 큰 &amp;lsquo;Tasks&amp;rsquo;에 대해서는 타임라인(Timeline) 뷰가 유용합니다. 이를 통해 간트 차트(Gantt chart)처럼 언제부터 언제까지 어떤 작업을 할 것인지가 시각화되며, 태스크의 병행 작업(병렬 태스크)에 무리가 없는지, 의존 관계(어떤 태스크가 끝나지 않으면 다음으로 진행할 수 없음)를 파악하기 쉬워집니다.&lt;/p>
&lt;hr>
&lt;h2 id="5-zettelkasten과-notes-데이터베이스를-통한-지식의-네트워크화">5. Zettelkasten과 Notes 데이터베이스를 통한 지식의 네트워크화
&lt;/h2>&lt;p>블로그 집필에 있어서, &amp;lsquo;백지 상태에서 기사를 쓰기 시작하는 것&amp;rsquo;은 가장 고통스러우며 펜이 멈추는 원인입니다. 그래서 독일의 사회학자 니클라스 루만(Niklas Luhmann)이 고안한 &amp;lsquo;&lt;strong>Zettelkasten(제텔카스텐, 카드박스법)&lt;/strong>&amp;rsquo; 개념을 Notion에 도입합니다.&lt;/p>
&lt;p>Zettelkasten의 기본 규칙은 &amp;lsquo;하나의 노트에는 하나의 아이디어만 적는다(Atomic한 성질)&amp;lsquo;는 것과 &amp;lsquo;노트끼리 링크를 연결하여 네트워크를 만든다&amp;rsquo;는 것입니다.&lt;/p>
&lt;h3 id="notes-데이터베이스-설계">Notes 데이터베이스 설계
&lt;/h3>&lt;ul>
&lt;li>&lt;code>Note Title&lt;/code> (Title)&lt;/li>
&lt;li>&lt;code>Tags&lt;/code> (Multi-select)&lt;/li>
&lt;li>&lt;code>Related Notes&lt;/code> (Relation: Notes 데이터베이스 자신과 연결)&lt;/li>
&lt;li>&lt;code>Tasks&lt;/code> (Relation: 블로그 집필 태스크와 연결)&lt;/li>
&lt;/ul>
&lt;h3 id="블로그-집필의-워크플로우">블로그 집필의 워크플로우
&lt;/h3>&lt;ol>
&lt;li>일상적인 개발에서 얻은 지식이나, 떠오른 아이디어를 단편적인 &amp;lsquo;Notes&amp;rsquo;로서 계속해서 축적합니다.&lt;/li>
&lt;li>그 노트들 간에 공통된 테마가 있다면, &lt;code>Related Notes&lt;/code> 속성을 사용하여 링크(양방향 링크)시킵니다.&lt;/li>
&lt;li>막상 블로그를 쓰는 태스크(Tasks)에 착수할 때, 해당 태스크 페이지 내에서 링크된 데이터베이스를 불러와 관련 Notes를 나열합니다.&lt;/li>
&lt;li>노트의 단편들을 이어 붙이는 것만으로 블로그의 뼈대(아웃라인)가 완성됩니다.&lt;/li>
&lt;/ol>
&lt;p>이를 통해 블로그 집필은 &amp;lsquo;무(無)에서의 창조&amp;rsquo;가 아니라 &amp;lsquo;축적한 지식의 편집 작업&amp;rsquo;으로 변화하며, 극적으로 집필 속도가 향상됩니다.&lt;/p>
&lt;hr>
&lt;h2 id="6-notion-api와-python을-사용한-궁극의-자동화">6. Notion API와 Python을 사용한 궁극의 자동화
&lt;/h2>&lt;p>여기서부터가 본 기사의 최대 하이라이트인 기술적인 자동화 섹션입니다. 수동으로 태스크를 입력하거나 상태를 변경하는 것은 개인 개발에 있어서 시간 낭비입니다. Notion API를 활용하여, GitHub의 Issue와 Notion의 태스크를 동기화하거나 블로그의 배포(Deploy) 상황을 Notion에 반영하는 시스템을 구축합니다.&lt;/p>
&lt;h3 id="아키텍처-개요">아키텍처 개요
&lt;/h3>&lt;pre class="mermaid">
flowchart TD
GH[&amp;#34;GitHub (Issue / PR)&amp;#34;]
GHA[&amp;#34;GitHub Actions&amp;#34;]
WEB[&amp;#34;Web Server / Lambda&amp;#34;]
NOTION[&amp;#34;Notion API&amp;#34;]
DB[&amp;#34;Notion Tasks DB&amp;#34;]
GH --&amp;gt;| Webhook 전송 | GHA
GHA --&amp;gt;| Python 스크립트 실행 | NOTION
NOTION --&amp;gt;| DB 갱신 및 태스크 추가 | DB
&lt;/pre>
&lt;h3 id="github-issues에서-notion-태스크-자동-생성하기">GitHub Issues에서 Notion 태스크 자동 생성하기
&lt;/h3>&lt;p>GitHub에서 Issue가 생성되었을 때 자동으로 Notion의 Tasks 데이터베이스에 항목을 추가하는 Python 스크립트의 구현 예시입니다.&lt;/p>
&lt;p>사전에 Notion의 인테그레이션(Integration)을 생성하고, &lt;code>NOTION_API_KEY&lt;/code>와 &lt;code>DATABASE_ID&lt;/code>를 얻어 두어야 합니다.&lt;/p>
&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code>&lt;span class="lnt"> 1
&lt;/span>&lt;span class="lnt"> 2
&lt;/span>&lt;span class="lnt"> 3
&lt;/span>&lt;span class="lnt"> 4
&lt;/span>&lt;span class="lnt"> 5
&lt;/span>&lt;span class="lnt"> 6
&lt;/span>&lt;span class="lnt"> 7
&lt;/span>&lt;span class="lnt"> 8
&lt;/span>&lt;span class="lnt"> 9
&lt;/span>&lt;span class="lnt">10
&lt;/span>&lt;span class="lnt">11
&lt;/span>&lt;span class="lnt">12
&lt;/span>&lt;span class="lnt">13
&lt;/span>&lt;span class="lnt">14
&lt;/span>&lt;span class="lnt">15
&lt;/span>&lt;span class="lnt">16
&lt;/span>&lt;span class="lnt">17
&lt;/span>&lt;span class="lnt">18
&lt;/span>&lt;span class="lnt">19
&lt;/span>&lt;span class="lnt">20
&lt;/span>&lt;span class="lnt">21
&lt;/span>&lt;span class="lnt">22
&lt;/span>&lt;span class="lnt">23
&lt;/span>&lt;span class="lnt">24
&lt;/span>&lt;span class="lnt">25
&lt;/span>&lt;span class="lnt">26
&lt;/span>&lt;span class="lnt">27
&lt;/span>&lt;span class="lnt">28
&lt;/span>&lt;span class="lnt">29
&lt;/span>&lt;span class="lnt">30
&lt;/span>&lt;span class="lnt">31
&lt;/span>&lt;span class="lnt">32
&lt;/span>&lt;span class="lnt">33
&lt;/span>&lt;span class="lnt">34
&lt;/span>&lt;span class="lnt">35
&lt;/span>&lt;span class="lnt">36
&lt;/span>&lt;span class="lnt">37
&lt;/span>&lt;span class="lnt">38
&lt;/span>&lt;span class="lnt">39
&lt;/span>&lt;span class="lnt">40
&lt;/span>&lt;span class="lnt">41
&lt;/span>&lt;span class="lnt">42
&lt;/span>&lt;span class="lnt">43
&lt;/span>&lt;span class="lnt">44
&lt;/span>&lt;span class="lnt">45
&lt;/span>&lt;span class="lnt">46
&lt;/span>&lt;span class="lnt">47
&lt;/span>&lt;span class="lnt">48
&lt;/span>&lt;span class="lnt">49
&lt;/span>&lt;span class="lnt">50
&lt;/span>&lt;span class="lnt">51
&lt;/span>&lt;span class="lnt">52
&lt;/span>&lt;span class="lnt">53
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code class="language-python" data-lang="python">&lt;span class="line">&lt;span class="cl">&lt;span class="kn">import&lt;/span> &lt;span class="nn">os&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="kn">import&lt;/span> &lt;span class="nn">requests&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="kn">import&lt;/span> &lt;span class="nn">json&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># 환경 변수에서 토큰과 데이터베이스 ID를 가져옴&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">NOTION_API_KEY&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">os&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">environ&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">get&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s2">&amp;#34;NOTION_API_KEY&amp;#34;&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">DATABASE_ID&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">os&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">environ&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">get&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s2">&amp;#34;DATABASE_ID&amp;#34;&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="k">def&lt;/span> &lt;span class="nf">create_notion_task&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">issue_title&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">issue_url&lt;/span>&lt;span class="p">):&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">url&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="s2">&amp;#34;https://api.notion.com/v1/pages&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">headers&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="s2">&amp;#34;Authorization&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="sa">f&lt;/span>&lt;span class="s2">&amp;#34;Bearer &lt;/span>&lt;span class="si">{&lt;/span>&lt;span class="n">NOTION_API_KEY&lt;/span>&lt;span class="si">}&lt;/span>&lt;span class="s2">&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="s2">&amp;#34;Content-Type&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="s2">&amp;#34;application/json&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="s2">&amp;#34;Notion-Version&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="s2">&amp;#34;2022-06-28&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">}&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">data&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="s2">&amp;#34;parent&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="p">{&lt;/span> &lt;span class="s2">&amp;#34;database_id&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="n">DATABASE_ID&lt;/span> &lt;span class="p">},&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="s2">&amp;#34;properties&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="s2">&amp;#34;Task Name&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="s2">&amp;#34;title&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="p">[&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="s2">&amp;#34;text&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="s2">&amp;#34;content&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="n">issue_title&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">}&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">}&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">]&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">},&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="s2">&amp;#34;Status&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="s2">&amp;#34;status&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="s2">&amp;#34;name&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="s2">&amp;#34;To Do&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">}&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">},&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="s2">&amp;#34;URL&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="s2">&amp;#34;url&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="n">issue_url&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">}&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">}&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">}&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">response&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">requests&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">post&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">url&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">headers&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="n">headers&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">data&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="n">json&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">dumps&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">data&lt;/span>&lt;span class="p">))&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">if&lt;/span> &lt;span class="n">response&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">status_code&lt;/span> &lt;span class="o">==&lt;/span> &lt;span class="mi">200&lt;/span>&lt;span class="p">:&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nb">print&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s2">&amp;#34;Task created successfully in Notion!&amp;#34;&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">else&lt;/span>&lt;span class="p">:&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nb">print&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="sa">f&lt;/span>&lt;span class="s2">&amp;#34;Failed to create task: &lt;/span>&lt;span class="si">{&lt;/span>&lt;span class="n">response&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">text&lt;/span>&lt;span class="si">}&lt;/span>&lt;span class="s2">&amp;#34;&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># GitHub Actions 등에서 인수로 받을 것을 가정&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="k">if&lt;/span> &lt;span class="vm">__name__&lt;/span> &lt;span class="o">==&lt;/span> &lt;span class="s2">&amp;#34;__main__&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="c1"># 예: python sync.py &amp;#34;버그 수정: 로그인 화면이 깨짐&amp;#34; &amp;#34;https://github.com/user/repo/issues/1&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="kn">import&lt;/span> &lt;span class="nn">sys&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">if&lt;/span> &lt;span class="nb">len&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">sys&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">argv&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="o">&amp;gt;=&lt;/span> &lt;span class="mi">3&lt;/span>&lt;span class="p">:&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">create_notion_task&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">sys&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">argv&lt;/span>&lt;span class="p">[&lt;/span>&lt;span class="mi">1&lt;/span>&lt;span class="p">],&lt;/span> &lt;span class="n">sys&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">argv&lt;/span>&lt;span class="p">[&lt;/span>&lt;span class="mi">2&lt;/span>&lt;span class="p">])&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;p>이 스크립트를 GitHub Actions의 워크플로우(&lt;code>.github/workflows/issue_to_notion.yml&lt;/code>)에 포함시킴으로써, 리포지토리에 Issue가 등록될 때마다 Notion에 태스크가 자동 생성되게 됩니다. 개발자는 GitHub와 Notion을 오가는 수고에서 해방됩니다.&lt;/p>
&lt;h3 id="curl을-이용한-블로그-공개-상태의-자동-갱신">cURL을 이용한 블로그 공개 상태의 자동 갱신
&lt;/h3>&lt;p>블로그를 Vercel이나 Netlify 등 호스팅 서비스에 배포하고 있는 경우, 배포 완료 Webhook을 수신하여 Notion의 태스크(예: &amp;lsquo;기사 A 집필 및 공개&amp;rsquo;)의 상태를 자동으로 &amp;ldquo;Done&amp;quot;으로 변경하는 것이 가능합니다.&lt;/p>
&lt;p>특정 페이지(태스크)의 속성을 갱신하는 cURL 명령어의 예는 다음과 같습니다.&lt;/p>
&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code>&lt;span class="lnt"> 1
&lt;/span>&lt;span class="lnt"> 2
&lt;/span>&lt;span class="lnt"> 3
&lt;/span>&lt;span class="lnt"> 4
&lt;/span>&lt;span class="lnt"> 5
&lt;/span>&lt;span class="lnt"> 6
&lt;/span>&lt;span class="lnt"> 7
&lt;/span>&lt;span class="lnt"> 8
&lt;/span>&lt;span class="lnt"> 9
&lt;/span>&lt;span class="lnt">10
&lt;/span>&lt;span class="lnt">11
&lt;/span>&lt;span class="lnt">12
&lt;/span>&lt;span class="lnt">13
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">curl -X PATCH &lt;span class="s1">&amp;#39;https://api.notion.com/v1/pages/PAGE_ID&amp;#39;&lt;/span> &lt;span class="se">\
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="se">&lt;/span> -H &lt;span class="s1">&amp;#39;Authorization: Bearer &amp;#39;&lt;/span>&lt;span class="s2">&amp;#34;&lt;/span>&lt;span class="nv">$NOTION_API_KEY&lt;/span>&lt;span class="s2">&amp;#34;&lt;/span>&lt;span class="s1">&amp;#39;&amp;#39;&lt;/span> &lt;span class="se">\
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="se">&lt;/span> -H &lt;span class="s2">&amp;#34;Content-Type: application/json&amp;#34;&lt;/span> &lt;span class="se">\
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="se">&lt;/span> -H &lt;span class="s2">&amp;#34;Notion-Version: 2022-06-28&amp;#34;&lt;/span> &lt;span class="se">\
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="se">&lt;/span> --data &lt;span class="s1">&amp;#39;{
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="s1"> &amp;#34;properties&amp;#34;: {
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="s1"> &amp;#34;Status&amp;#34;: {
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="s1"> &amp;#34;status&amp;#34;: {
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="s1"> &amp;#34;name&amp;#34;: &amp;#34;Done&amp;#34;
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="s1"> }
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="s1"> }
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="s1"> }
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="s1"> }&amp;#39;&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;p>이 API 호출을 CI/CD 파이프라인의 마지막 단계에 조립해 넣으면, &amp;lsquo;코드를 푸시한다 → 자동 배포된다 → Notion 태스크가 자동으로 완료(Done)된다&amp;rsquo;는 풀 오토메이션이 완성됩니다.&lt;/p>
&lt;hr>
&lt;h2 id="7-운용상의-베스트-프랙티스와-지속의-비결">7. 운용상의 베스트 프랙티스와 지속의 비결
&lt;/h2>&lt;p>시스템이나 도구를 아무리 고도화하여 구축하더라도, 그것을 운용하는 사람이 지쳐 버리면 주객전도가 됩니다. 마지막으로 이 Notion 시스템을 파탄 내지 않고 지속하기 위한 비결을 몇 가지 소개합니다.&lt;/p>
&lt;ol>
&lt;li>&lt;strong>단순함을 유지할 것&lt;/strong>: 처음부터 완벽한 속성이나 복잡한 관계형을 너무 많이 만들지 마세요. 필요해진 시점에 속성을 추가하는 &amp;lsquo;애자일(Agile)한 Notion 구축&amp;rsquo;을 명심합시다.&lt;/li>
&lt;li>&lt;strong>주간 리뷰(Weekly Review)의 철저화&lt;/strong>: 매주 일요일 밤 등 시간을 정해 Notion 전체를 재검토합니다. 완료된 태스크의 정리, 기한이 지난 태스크의 재스케줄링, 미분류 Notes의 태그 지정 등을 수행하여 시스템을 깔끔하게 유지합니다.&lt;/li>
&lt;li>&lt;strong>Inbox의 활용&lt;/strong>: 떠오른 아이디어나 태스크를 일일이 적절한 데이터베이스에 분류하는 것은 번거로운 일입니다. 우선은 모든 것을 집어넣는 &amp;lsquo;Inbox&amp;rsquo; 데이터베이스를 만들고, 나중에(주간 리뷰 등에서) Projects나 Notes로 분류하는 방식이 스트레스가 없습니다.&lt;/li>
&lt;/ol>
&lt;h2 id="8-정리">8. 정리
&lt;/h2>&lt;p>Notion을 활용한 태스크 관리는 단순한 To-Do 리스트의 영역을 훨씬 넘어서고 있습니다. PARA 메서드에 의한 정보 정리, Zettelkasten에 의한 지식의 네트워크화, 그리고 Notion API를 통한 엔지니어링을 결합함으로써 개인 개발과 블로그 집필을 강력하게 부스트하는 &amp;lsquo;제2의 뇌(Second Brain)&amp;lsquo;를 구축할 수 있습니다.&lt;/p>
&lt;p>초기 설정에는 다소 시간이 걸리지만, 한 번 시스템이 돌아가기 시작하면 태스크 관리에 드는 인지 부하는 극적으로 낮아지고 정말로 중요한 &amp;lsquo;코드를 작성하는 것&amp;rsquo;과 &amp;lsquo;글을 쓰는 것&amp;rsquo;에 온전히 집중할 수 있게 됩니다. 부디 본 기사를 참고하여 여러분만의 최강의 Notion 워크스페이스를 만들어 보시기 바랍니다.&lt;/p></description></item></channel></rss>