{
    "componentChunkName": "component---src-templates-index-jsx",
    "path": "/index/projects/FrontEnd/Gatsby-starter-oasis/",
    "result": {"data":{"directorys":{"nodes":[{"id":"25a7ea47-9810-57c2-aed3-170559f514a4","name":"posts"},{"id":"f5729257-7c38-58ab-830f-1d18809687ec","name":"develop"},{"id":"70c762b1-287c-5a42-b45b-c7f7fb8095dc","name":"projects"}]},"markdown":{"html":"<p><span\n      class=\"gatsby-resp-image-wrapper\"\n      style=\"position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 950px; margin-left: 0; margin-right: 0;\"\n    >\n      <span\n    class=\"gatsby-resp-image-background-image\"\n    style=\"padding-bottom: 51.68067226890756%; position: relative; bottom: 0; left: 0; background-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAKCAYAAAC0VX7mAAAACXBIWXMAABYlAAAWJQFJUiTwAAABw0lEQVQoz42R7U/TUBSH90/j4t5EBUxQYA4YRKOfMPg/7BsmKN9QNxZjwvoy2rW1K127tdr2PubeMUDExJP8ck/uy+8+55zSq71tyuUlqg8r1Ks1pVqlypPlx6w+XWFtZZXleoN6pUqjVudRvUF56QGfT0+5sEccHL7n9Zu3dDod/PGY0ruDQ9bWN3j2YkuptdNmt70/194+z5svWW+22GztstHcZrO5w1arzfHxR0xrhOn+wHQ9hq7P93OdErdC8HdkQH4lmUdJrvbDScTJpxMMXSdJErIsR9MNaSj4cHTEt/4ZfjgljGcgBKIQCCFUfi0EaZKAKPA8j263h6ZpmKZJHMcYhkmpKAp03cCyLPxgwuUkRhSFMrtPixiPx8rI931msxlpmjIcXsxLtm1bHUr8oWnguu5NG65M7q5BEDDQNM4HA2zLIgwvMc0hJXlBGkp0ecEPApI0Vb9mWXZtcpdSEhqGoQhd18Nx3RtDSeS5DlEcEUwmzJJElZDn+R9Ut/MwDJWBfCvNZessy56X7IcxTviT4p4p/6uP0+lUDcFxHNWuKIoXhAXTNMOPc9JfmaL6Hy2G2Tvr8+Vrl16vz8hx+A19KtsGMVD36gAAAABJRU5ErkJggg=='); background-size: cover; display: block;\"\n  ></span>\n  <img\n        class=\"gatsby-resp-image-image\"\n        alt=\"main-intro\"\n        title=\"main-intro\"\n        src=\"/static/7530c1c823055cb2b28b4ce432cd439a/906b5/intro-img.png\"\n        srcset=\"/static/7530c1c823055cb2b28b4ce432cd439a/5ea4d/intro-img.png 238w,\n/static/7530c1c823055cb2b28b4ce432cd439a/466da/intro-img.png 475w,\n/static/7530c1c823055cb2b28b4ce432cd439a/906b5/intro-img.png 950w,\n/static/7530c1c823055cb2b28b4ce432cd439a/010c2/intro-img.png 1425w,\n/static/7530c1c823055cb2b28b4ce432cd439a/a88f6/intro-img.png 1900w,\n/static/7530c1c823055cb2b28b4ce432cd439a/de0bd/intro-img.png 2238w\"\n        sizes=\"(max-width: 950px) 100vw, 950px\"\n        style=\"width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;\"\n        loading=\"lazy\"\n        decoding=\"async\"\n      />\n    </span></p>\n<h2 id=\"table-of-contents\" style=\"position:relative;\"><a href=\"#table-of-contents\" aria-label=\"table of contents permalink\" class=\"anchor-header before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>Table Of Contents</h2>\n<blockquote>\n<ul>\n<li><a href=\"#motivation\">Motivation</a></li>\n<li><a href=\"#why-use-gatsby\">Why use gatsby?</a></li>\n<li><a href=\"#key-functions\">Key Functions</a></li>\n<li><a href=\"#learned-it\">Learned it</a></li>\n</ul>\n</blockquote>\n<h2 id=\"motivation\" style=\"position:relative;\"><a href=\"#motivation\" aria-label=\"motivation permalink\" class=\"anchor-header before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>Motivation</h2>\n<p>약 반년전 개인블로그를 React와 Gatsby 프레임워크를 통해 제작한 후에 진로방향을 웹 프론트엔드 개발자로\n결정하였습니다.<br>\n두달간 Javascript를 새로 공부함과 동시에 틈틈히 코딩테스트 문제도 Javascript로 풀어보는 시간을 가졌습니다.<br>\n두달이 지난 후 과거에 진행했던 프로젝트 코드를 보게 되었고 리펙토링의 필요성을 느꼈습니다.\n리펙토링을 진행하면서 아직 부족한 실력이지만 남들도 쉽게 사용할 수 있는 템플릿을 하나 만들어보자 라고 결심하였고\n많은 블로그 템플릿이 있지만 페이지별로 관심사를 나누어 포스팅 할 수 있는 템플릿은 찾아보기 힘들었기 때문에 페이지별로 관심사를 나눌수 있게 하는것을 주 목표로 하여 프로젝트를 진행하게 되었습니다.</p>\n<h2 id=\"why-use-gatsby\" style=\"position:relative;\"><a href=\"#why-use-gatsby\" aria-label=\"why use gatsby permalink\" class=\"anchor-header before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>Why use gatsby?</h2>\n<p>많은 유입을 통해 내 게시물을 더 널리 알려야하는 블로그의 특성상 SEO의 적용은 필수였습니다. 또한 프론트엔드에만 집중하기 위해 추가적인 서버를 개발하고싶지 않았고\nSSG 프레임워크를 통해 마크다운으로 포스트를 작성하고 배포시점에 미리 페이지를 생성하는 방식을 사용하기로 결정하였습니다.<br>\nSSG를 지원하는 프레임워크로는 React 진영의 <strong>Next, Gatsby</strong> 와 Vue 진영의 <strong>Nuxt, Vue Press</strong> 가 있었고\n저는 React에 흥미가 좀더 있고 더 공부하길 원했기 때문에 Next와 Gatsby로 선택지를 좁혔습니다. 이중 Gatsby의 GraphQl로 포스트(마크다운 파일)를 조회하는 방식이\n마음에들었으며 SSG에 특화된 여러 플러그인들을 쉽게 검색하고 적용할 수 있었기 때문에 Gatsby를 선택하게 되었습니다.</p>\n<h2 id=\"key-functions\" style=\"position:relative;\"><a href=\"#key-functions\" aria-label=\"key functions permalink\" class=\"anchor-header before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>Key Functions</h2>\n<p>블로그 스타터의 주요 기능은 다음과 같습니다.</p>\n<h3 id=\"페이지-기반-관심사-분류\" style=\"position:relative;\"><a href=\"#%ED%8E%98%EC%9D%B4%EC%A7%80-%EA%B8%B0%EB%B0%98-%EA%B4%80%EC%8B%AC%EC%82%AC-%EB%B6%84%EB%A5%98\" aria-label=\"페이지 기반 관심사 분류 permalink\" class=\"anchor-header before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>페이지 기반 관심사 분류</h3>\n<p>Next나 Gatsby의 <strong>파일기반 정적 라우팅 방식</strong>처럼 사용자가 특정위치에 마크다운 파일을 생성하면 폴더구조에 따라 자동으로 주소가 생성되게 하고 싶었습니다. 이를위해 먼저 posts 폴더를 하나 만들어서 기준점으로 설정하고 하위에 생성되는 폴더구조에 따라 포스트의 주소가 자동적으로 알맞게 부여 될 수 있도록 개발하였습니다.</p>\n<div class=\"gatsby-highlight\" data-language=\"bash\"><pre class=\"language-bash\"><code class=\"language-bash\">./posts\n├── index.md <span class=\"token comment\"># 홈화면 내용</span>\n└── projects <span class=\"token comment\"># 프로젝트 페이지의 게시물들</span>\n    ├── BackEnd <span class=\"token comment\"># 세부 카테고리 (사이드바 카테고리에 포함)</span>\n    │   ├── 10plusServer.md\n    │   └── Cardme.md\n    └── FrontEnd <span class=\"token comment\"># 세부 카테고리 (사이드바 카테고리에 포함)</span>\n        ├── 10plusKiosk.md\n        ├── Gatsby-starter-oasis-img\n        │   ├── CLI-tool.gif\n        │   └── intro-img.png\n        └── Gatsby-starter-oasis.md <span class=\"token comment\"># 현재 포스트</span>\n</code></pre></div>\n<p><strong>위는 현재 포스트를 작성하는 시점의 일부 폴더구조입니다.</strong><br>\n현재 포스트인 <code class=\"language-text\">Gatsby-starter-oasis.md</code> 파일은 <code class=\"language-text\">${사용자주소}/projects/FrontEnd/Gatsby-starter-oasis/</code>의 URI로 생성됩니다.</p>\n<p>이를 구현하기 위해 Gatsby에서 markdown파일만을 조회하는 플러그인 대신 쿼리가 길어질 수 있지만 <a href=\"https://github.com/je0ngyun/gatsby-starter-oasis/blob/master/src/pages/projects/index.js#L52\">전체 파일을 조회하여 필터링</a> 하는 방식을 사용하였습니다.</p>\n<h3 id=\"보다-쉬운-페이지-생성을-위한-cli-tool\" style=\"position:relative;\"><a href=\"#%EB%B3%B4%EB%8B%A4-%EC%89%AC%EC%9A%B4-%ED%8E%98%EC%9D%B4%EC%A7%80-%EC%83%9D%EC%84%B1%EC%9D%84-%EC%9C%84%ED%95%9C-cli-tool\" aria-label=\"보다 쉬운 페이지 생성을 위한 cli tool permalink\" class=\"anchor-header before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>보다 쉬운 페이지 생성을 위한 CLI tool</h3>\n<p>페이지기반으로 포스트를 분류했지만 여전히 문제점은 남아있었습니다. 사용자가 새로운 주제의 포스트들을 포함할 페이지를 만들고자 할때 해야할 작업이 많아지기 때문이었습니다. 이를 해결하기 위해 쉬운 페이지 생성을 위한 CLI tool을 개발하였습니다.</p>\n<p><img src=\"/cce74bc3e1c66817e854765cf18ad3cc/CLI-tool.gif\" alt=\"CLI tool\"></p>\n<p><strong>위는 CLI tool을 실행하여 Life란 이름의 페이지를 생성하는 모습입니다.</strong><br>\n만들 페이지 이름 및 페이지 설명을 입력하면 자동으로 Gatsby가 라우팅 하는 <code class=\"language-text\">./src/pages/</code> 폴더에 기입한 정보를 바탕으로 파일이 만들어지고 <code class=\"language-text\">./posts/</code> 폴더의 하위에도 life란 이름의 폴더가 새로 만들어지게 됩니다.<br>\n그 덕분에 사용자는 아래와 같이 config 파일에 페이지를 추가하기만 하면 될 수 있게 하였습니다.</p>\n<div class=\"gatsby-highlight\" data-language=\"js\"><pre class=\"language-js\"><code class=\"language-js\"><span class=\"token comment\">//user-meta-config.js</span>\n<span class=\"token keyword\">const</span> pageMetadata <span class=\"token operator\">=</span> <span class=\"token punctuation\">{</span>\n  <span class=\"token comment\">//menu - Please enter a menu link to add to the navbar.</span>\n  <span class=\"token comment\">//If you do not want to add a link to the navbar, you can leave it blank.</span>\n  <span class=\"token literal-property property\">menu</span><span class=\"token operator\">:</span> <span class=\"token punctuation\">[</span>\n    <span class=\"token punctuation\">{</span> <span class=\"token literal-property property\">path</span><span class=\"token operator\">:</span> <span class=\"token string\">'/'</span><span class=\"token punctuation\">,</span> <span class=\"token literal-property property\">linkname</span><span class=\"token operator\">:</span> <span class=\"token string\">'Home'</span> <span class=\"token punctuation\">}</span><span class=\"token punctuation\">,</span>\n    <span class=\"token punctuation\">{</span> <span class=\"token literal-property property\">path</span><span class=\"token operator\">:</span> <span class=\"token string\">'/projects'</span><span class=\"token punctuation\">,</span> <span class=\"token literal-property property\">linkname</span><span class=\"token operator\">:</span> <span class=\"token string\">'Projects'</span> <span class=\"token punctuation\">}</span><span class=\"token punctuation\">,</span>\n    <span class=\"token punctuation\">{</span> <span class=\"token literal-property property\">path</span><span class=\"token operator\">:</span> <span class=\"token string\">'/develop'</span><span class=\"token punctuation\">,</span> <span class=\"token literal-property property\">linkname</span><span class=\"token operator\">:</span> <span class=\"token string\">'Develop'</span> <span class=\"token punctuation\">}</span><span class=\"token punctuation\">,</span>\n    <span class=\"token punctuation\">{</span> <span class=\"token literal-property property\">path</span><span class=\"token operator\">:</span> <span class=\"token string\">'/life'</span><span class=\"token punctuation\">,</span> <span class=\"token literal-property property\">linkname</span><span class=\"token operator\">:</span> <span class=\"token string\">'Life'</span> <span class=\"token punctuation\">}</span><span class=\"token punctuation\">,</span> <span class=\"token comment\">// 새로 추가!</span>\n  <span class=\"token punctuation\">]</span><span class=\"token punctuation\">,</span>\n  <span class=\"token comment\">//directorys - Enter the directory to be mapped with the page.</span>\n  <span class=\"token comment\">//That directory is automatically linked to the gatsby filesystem.</span>\n  <span class=\"token literal-property property\">directorys</span><span class=\"token operator\">:</span> <span class=\"token punctuation\">[</span><span class=\"token string\">'develop'</span><span class=\"token punctuation\">,</span> <span class=\"token string\">'projects'</span><span class=\"token punctuation\">,</span> <span class=\"token string\">'life'</span><span class=\"token punctuation\">]</span><span class=\"token punctuation\">,</span> <span class=\"token comment\">// life 추가</span>\n<span class=\"token punctuation\">}</span></code></pre></div>\n<h3 id=\"쉬운-포스트-탐색을-위한-사이드바-및-포스트검색기능\" style=\"position:relative;\"><a href=\"#%EC%89%AC%EC%9A%B4-%ED%8F%AC%EC%8A%A4%ED%8A%B8-%ED%83%90%EC%83%89%EC%9D%84-%EC%9C%84%ED%95%9C-%EC%82%AC%EC%9D%B4%EB%93%9C%EB%B0%94-%EB%B0%8F-%ED%8F%AC%EC%8A%A4%ED%8A%B8%EA%B2%80%EC%83%89%EA%B8%B0%EB%8A%A5\" aria-label=\"쉬운 포스트 탐색을 위한 사이드바 및 포스트검색기능 permalink\" class=\"anchor-header before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>쉬운 포스트 탐색을 위한 사이드바 및 포스트검색기능</h3>\n<p><img src=\"/3d578e5e06b27909411f8db9aee44828/sidebar.gif\" class=\"gatsby-img-attributes\" style=\"width: 50%;\" alt=\"sidebar\" title=\"\"/><br>\n위와같이 페이지 별로 관심사를 분류하는것 만으로는 부족한것 같아 사이드바를 통해 세부적으로 분류된 포스트를 볼 수 있게 하였고 현재 어느 카테고리의 포스트를 읽고있는지 알 수 있게 하이라이트 기능을 추가하였습니다.\n또한 제목 및 태그를 기반으로 검색할 수 있는 검색창도 추가하였습니다.</p>\n<h3 id=\"통합된-config-file\" style=\"position:relative;\"><a href=\"#%ED%86%B5%ED%95%A9%EB%90%9C-config-file\" aria-label=\"통합된 config file permalink\" class=\"anchor-header before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>통합된 Config File</h3>\n<p>사용자가 초기에 블로그를 자신의 정보로 세팅할때 불편함이 없도록 사용자 기본정보는 물론 Google이나 Naver의 Search console verification code나 Google analytics tracking ID등을 <code class=\"language-text\">user-meta-config</code>이라는 설정파일 안에서 모두 설정할 수 있도록 하였고 프로필 이미지와 favicon은 지정된 이름 (favicon, profile) 으로 <code class=\"language-text\">./assets</code> 폴더에 넣으면 자동 적용되도록 하였습니다.</p>\n<h2 id=\"learned-it\" style=\"position:relative;\"><a href=\"#learned-it\" aria-label=\"learned it permalink\" class=\"anchor-header before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>Learned it</h2>\n<h3 id=\"state의-lazy-initialization\" style=\"position:relative;\"><a href=\"#state%EC%9D%98-lazy-initialization\" aria-label=\"state의 lazy initialization permalink\" class=\"anchor-header before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>State의 lazy initialization</h3>\n<p>State의 초기값으로 비싼비용의 계산이 필요할 경우 lazy 초기화를 통해 리 렌더링시 불필요한 계산을 줄이는 법을 배웠고 최초 렌더링 시에만 해당 값이 필요할함과 동시에\n<code class=\"language-text\">localStorage</code> 의 접근 및 <code class=\"language-text\">배열조작의</code> 결과물을 State로 써야한다면 lazy 초기화를 적극적으로 활용해야한다는 것을 알게되었습니다.<br>\n해당 프로젝트에서 사이드바를 열었을때 현재 보고있는 페이지의 카테고리를 하이라이팅함과 동시에 자동적으로 열리게 구현하였고 이를 위해 categoryStatus 라는 State를 lazy 초기화 하였습니다.</p>\n<h3 id=\"csr-ssr-ssg-의-개념\" style=\"position:relative;\"><a href=\"#csr-ssr-ssg-%EC%9D%98-%EA%B0%9C%EB%85%90\" aria-label=\"csr ssr ssg 의 개념 permalink\" class=\"anchor-header before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>CSR, SSR, SSG 의 개념</h3>\n<p>Gatsby 프레임워크에서 제공하는 <code class=\"language-text\">useStaticQuery</code> Custom hook이 반환하는 결과값이 같아도 변경된것으로 간주되어 <a href=\"https://github.com/gatsbyjs/gatsby/issues/29011\">리렌더링을 유발하는 이슈가</a> 있었습니다.\n찾아본 결과 이러한 현상은 부분적으로 의도된것이며 SSG는 빌드시에 HTML을 모두 생성하기 때문에 개발시에만 영향이 있고 실제 배포에는 영향이 없다는 것을 알게됨과 동시에 여러 렌더링 방식에 대한 개념이 부족한 것 같아서\nCSR, SSR, SSG 및 TTV,TTI 에대한 개념과 렌더링 방식들간에 어떤차이가 있고 어떠한 상황에 써야할지 공부해보는 시간을 가졌습니다.</p>\n<h3 id=\"intersection-observer\" style=\"position:relative;\"><a href=\"#intersection-observer\" aria-label=\"intersection observer permalink\" class=\"anchor-header before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>Intersection Observer</h3>\n<p>페이지내 포스트아이템의 무한스크롤을 구현하기 위해 메인쓰레드에 영향을 줄 수 있고 리플로우를 유발하는 Scroll Event 대신 Intersection Observer를 공부하여 적용하였습니다.\n해당 기능구현시 5개씩 포스트아이템이 추가되도록 하였으며 5개씩 포스트를 불러올때 맨 마지막 포스트를 관찰하도록 하였고 관찰되는 아이템박스가 Viewport 안에 들어오면 연속해서 5개의 포스트를 불러옴과 동시에\n관찰대상을 바꾸어주었습니다.</p>\n<h3 id=\"requestanimationframe\" style=\"position:relative;\"><a href=\"#requestanimationframe\" aria-label=\"requestanimationframe permalink\" class=\"anchor-header before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>requestAnimationFrame</h3>\n<p>스크롤 게이지바를 적용하기 위해 스크롤 이벤트를 등록해야했습니다. 이때\nrequestAnimationFrame을 사용한 throttle로 브라우저가 처리할수 있는 범위내에서 이벤트를 처리하는 방법을 알게되었으며 Javascript의 이벤트루프와 태스크큐에대해 다시 공부해 보며 왜\nsetTimeout의 시간이 정확하지 않을 수 있는지 requestAnimationFrame 으로 어떻게 최적화 할 수 있는지를 배우게 되었습니다.</p>","id":"10add1d1-8af1-561a-8856-b3e1adbcd728","excerpt":"Table Of Contents Motivation Why use gatsby? Key Functions Learned it Motivation 약 반년전 개인블로그를 React…","tableOfContents":"<ul>\n<li>\n<p><a href=\"#table-of-contents\">Table Of Contents</a></p>\n</li>\n<li>\n<p><a href=\"#motivation\">Motivation</a></p>\n</li>\n<li>\n<p><a href=\"#why-use-gatsby\">Why use gatsby?</a></p>\n</li>\n<li>\n<p><a href=\"#key-functions\">Key Functions</a></p>\n<ul>\n<li><a href=\"#%ED%8E%98%EC%9D%B4%EC%A7%80-%EA%B8%B0%EB%B0%98-%EA%B4%80%EC%8B%AC%EC%82%AC-%EB%B6%84%EB%A5%98\">페이지 기반 관심사 분류</a></li>\n<li><a href=\"#%EB%B3%B4%EB%8B%A4-%EC%89%AC%EC%9A%B4-%ED%8E%98%EC%9D%B4%EC%A7%80-%EC%83%9D%EC%84%B1%EC%9D%84-%EC%9C%84%ED%95%9C-cli-tool\">보다 쉬운 페이지 생성을 위한 CLI tool</a></li>\n<li><a href=\"#%EC%89%AC%EC%9A%B4-%ED%8F%AC%EC%8A%A4%ED%8A%B8-%ED%83%90%EC%83%89%EC%9D%84-%EC%9C%84%ED%95%9C-%EC%82%AC%EC%9D%B4%EB%93%9C%EB%B0%94-%EB%B0%8F-%ED%8F%AC%EC%8A%A4%ED%8A%B8%EA%B2%80%EC%83%89%EA%B8%B0%EB%8A%A5\">쉬운 포스트 탐색을 위한 사이드바 및 포스트검색기능</a></li>\n<li><a href=\"#%ED%86%B5%ED%95%A9%EB%90%9C-config-file\">통합된 Config File</a></li>\n</ul>\n</li>\n<li>\n<p><a href=\"#learned-it\">Learned it</a></p>\n<ul>\n<li><a href=\"#state%EC%9D%98-lazy-initialization\">State의 lazy initialization</a></li>\n<li><a href=\"#csr-ssr-ssg-%EC%9D%98-%EA%B0%9C%EB%85%90\">CSR, SSR, SSG 의 개념</a></li>\n<li><a href=\"#intersection-observer\">Intersection Observer</a></li>\n<li><a href=\"#requestanimationframe\">requestAnimationFrame</a></li>\n</ul>\n</li>\n</ul>","fields":{"slug":"/projects/FrontEnd/Gatsby-starter-oasis/"},"frontmatter":{"title":"Gasby-Starter-Oasis","date":"February 21 , 2022","tags":"쉽게 시작하는 풀 패키지 블로그 스타터"}}},"pageContext":{"slug":"/projects/FrontEnd/Gatsby-starter-oasis/","curSrcInsName":"index","previous":{"title":"","slug":"/","sourceInstanceName":"index"},"next":{"title":"CardMe","slug":"/projects/BackEnd/Cardme/","sourceInstanceName":"index"}}},
    "staticQueryHashes": ["1603766897","3484302218","993254799"]}