{"componentChunkName":"component---src-templates-blog-post-js","path":"/react/2022-12.13---next-study-02/","result":{"data":{"site":{"siteMetadata":{"title":"주 1회 작성하는 개발 블로그","author":"JinhyeongKim","siteUrl":"https://bnt10.github.io","comment":{"disqusShortName":"bnt10-github-io","utterances":"JinHyongKim/blog"},"sponsor":{"buyMeACoffeeId":""}}},"markdownRemark":{"id":"d532b183-8834-5923-9d1c-1615ee2f2b67","excerpt":"들어가기 앞서 Next.js에서 제공하는 내장 라우팅 시스템이 무엇이고 어떤방식으로 사용하는지를 중점으로 정리 하였습니다. 1. File-system based router Next.js에서 기본 내장 되어 있는 라우팅 시스템은 File-system 기반으로 정적 파일을 생성하여 동작합니다. Next.js에서는 pages 폴더 아래 파일들이 라우팅 경로로 사용 됩니다. Index routes pages폴더 안에 index.js는 → / 경로를 표현합니다. 그렇다면 /blog…","html":"<h1 id=\"들어가기-앞서\" style=\"position:relative;\"><a href=\"#%EB%93%A4%EC%96%B4%EA%B0%80%EA%B8%B0-%EC%95%9E%EC%84%9C\" aria-label=\"들어가기 앞서 permalink\" class=\"anchor 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>들어가기 앞서</h1>\n<p>Next.js에서 제공하는 내장 라우팅 시스템이 무엇이고 어떤방식으로 사용하는지를 중점으로 정리 하였습니다.</p>\n<h2 id=\"1-file-system-based-router\" style=\"position:relative;\"><a href=\"#1-file-system-based-router\" aria-label=\"1 file system based router permalink\" class=\"anchor 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>1. File-system based router</h2>\n<p>Next.js에서 기본 내장 되어 있는 라우팅 시스템은 File-system 기반으로 정적 파일을 생성하여 동작합니다.</p>\n<p>Next.js에서는 pages 폴더 아래 파일들이 라우팅 경로로 사용 됩니다.</p>\n<ul>\n<li>\n<p>Index routes</p>\n<p>pages폴더 안에 index.js는 → / 경로를 표현합니다. 그렇다면 /blog를 표현하고 싶다면 어떻게 해야 할까요?<br>\n다음과 같이 pages/blog/index.js 표현 하면 됩니다.</p>\n</li>\n</ul>\n</br>\n<ul>\n<li>\n<p>Nested routes</p>\n<p>중첩된 라우팅을 표현하고 싶다면 파일 구조를 중첩하여 사용하면 됩니다.</p>\n<ul>\n<li>/blog/post.js → /blog/post</li>\n<li>/blog/content.js → /blog/content</li>\n<li>/blog/settings/username.js → /blog/settings/username</li>\n</ul>\n</li>\n</ul>\n</br>\n<ul>\n<li>\n<p>Dynamic route segments</p>\n<p>블로그 포스트를 에로 포스트 번호가 1번 2번 3번이 있다고 가정한다면\n각각 /blog/1<em>post.js, /blog/2</em>post.js, /blog/3_post.js 이런식으로 작성한다는 것은 매우 비효율적입니다.\n따라서 동적으로 라우팅 페이지를 구성하고 싶은 경우 아래와 같은 양식으로 파일을 작성해야 합니다.</p>\n<ul>\n<li>pages/blog/[slug].js → /blog/:slug (/blog/hello-world)</li>\n<li>pages/[username]/settings.js → /:username/settings (/foo/settings)</li>\n<li>pages/post/[…all].js → /post/* (/post/2020/id/title) # 여러개의 인자를 받고 싶은경우</li>\n</ul>\n</li>\n</ul>\n<h2 id=\"2-linking-between-pages\" style=\"position:relative;\"><a href=\"#2-linking-between-pages\" aria-label=\"2 linking between pages permalink\" class=\"anchor 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>2. Linking between pages</h2>\n<p>Next.js 에서 페이지 간에 이동을 위해서는 <strong>next/router</strong> , <strong>next/link</strong> 를 사용 할 수 있습니다.</p>\n<h3 id=\"21-nextlink\" style=\"position:relative;\"><a href=\"#21-nextlink\" aria-label=\"21 nextlink permalink\" class=\"anchor 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>2.1 next/link</h3>\n<p>Link를 사용하는 기본적인 예시 입니다.</p>\n<div class=\"gatsby-highlight\" data-language=\"javascript\"><pre class=\"language-javascript\"><code class=\"language-javascript\"><span class=\"token keyword\">import</span> Link <span class=\"token keyword\">from</span> <span class=\"token string\">'next/link'</span>\n\n<span class=\"token keyword\">function</span> <span class=\"token function\">Home</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n  <span class=\"token keyword\">return</span> <span class=\"token punctuation\">(</span>\n    <span class=\"token operator\">&lt;</span>ul<span class=\"token operator\">></span>\n      <span class=\"token operator\">&lt;</span>li<span class=\"token operator\">></span>\n        <span class=\"token operator\">&lt;</span>Link href<span class=\"token operator\">=</span><span class=\"token string\">\"/\"</span><span class=\"token operator\">></span>Home<span class=\"token operator\">&lt;</span><span class=\"token operator\">/</span>Link<span class=\"token operator\">></span>\n      <span class=\"token operator\">&lt;</span><span class=\"token operator\">/</span>li<span class=\"token operator\">></span>\n      <span class=\"token operator\">&lt;</span>li<span class=\"token operator\">></span>\n        <span class=\"token operator\">&lt;</span>Link href<span class=\"token operator\">=</span><span class=\"token string\">\"/about\"</span><span class=\"token operator\">></span>About Us<span class=\"token operator\">&lt;</span><span class=\"token operator\">/</span>Link<span class=\"token operator\">></span>\n      <span class=\"token operator\">&lt;</span><span class=\"token operator\">/</span>li<span class=\"token operator\">></span>\n      <span class=\"token operator\">&lt;</span>li<span class=\"token operator\">></span>\n        <span class=\"token operator\">&lt;</span>Link href<span class=\"token operator\">=</span><span class=\"token string\">\"/blog/hello-world\"</span><span class=\"token operator\">></span>Blog Post<span class=\"token operator\">&lt;</span><span class=\"token operator\">/</span>Link<span class=\"token operator\">></span>\n      <span class=\"token operator\">&lt;</span><span class=\"token operator\">/</span>li<span class=\"token operator\">></span>\n    <span class=\"token operator\">&lt;</span><span class=\"token operator\">/</span>ul<span class=\"token operator\">></span>\n  <span class=\"token punctuation\">)</span>\n<span class=\"token punctuation\">}</span>\n\n<span class=\"token keyword\">export</span> <span class=\"token keyword\">default</span> Home</code></pre></div>\n<h3 id=\"22-nextrouter\" style=\"position:relative;\"><a href=\"#22-nextrouter\" aria-label=\"22 nextrouter permalink\" class=\"anchor 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>2.2 next/router</h3>\n<p>Router를 사용하는 기본적인 예시 입니다.</p>\n<div class=\"gatsby-highlight\" data-language=\"javascript\"><pre class=\"language-javascript\"><code class=\"language-javascript\"><span class=\"token keyword\">import</span> <span class=\"token punctuation\">{</span> useRouter <span class=\"token punctuation\">}</span> <span class=\"token keyword\">from</span> <span class=\"token string\">'next/router'</span>\n\n<span class=\"token keyword\">function</span> <span class=\"token function\">ActiveLink</span><span class=\"token punctuation\">(</span><span class=\"token parameter\"><span class=\"token punctuation\">{</span> children<span class=\"token punctuation\">,</span> href <span class=\"token punctuation\">}</span></span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n  <span class=\"token keyword\">const</span> router <span class=\"token operator\">=</span> <span class=\"token function\">useRouter</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span>\n  <span class=\"token keyword\">const</span> style <span class=\"token operator\">=</span> <span class=\"token punctuation\">{</span>\n    <span class=\"token literal-property property\">marginRight</span><span class=\"token operator\">:</span> <span class=\"token number\">10</span><span class=\"token punctuation\">,</span>\n    <span class=\"token literal-property property\">color</span><span class=\"token operator\">:</span> router<span class=\"token punctuation\">.</span>asPath <span class=\"token operator\">===</span> href <span class=\"token operator\">?</span> <span class=\"token string\">'red'</span> <span class=\"token operator\">:</span> <span class=\"token string\">'black'</span><span class=\"token punctuation\">,</span>\n  <span class=\"token punctuation\">}</span>\n\n  <span class=\"token keyword\">const</span> <span class=\"token function-variable function\">handleClick</span> <span class=\"token operator\">=</span> <span class=\"token parameter\">e</span> <span class=\"token operator\">=></span> <span class=\"token punctuation\">{</span>\n    e<span class=\"token punctuation\">.</span><span class=\"token function\">preventDefault</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span>\n    router<span class=\"token punctuation\">.</span><span class=\"token function\">push</span><span class=\"token punctuation\">(</span>href<span class=\"token punctuation\">)</span> <span class=\"token comment\">// 페이지 이동</span>\n  <span class=\"token punctuation\">}</span>\n\n  <span class=\"token keyword\">return</span> <span class=\"token punctuation\">(</span>\n    <span class=\"token operator\">&lt;</span>a href<span class=\"token operator\">=</span><span class=\"token punctuation\">{</span>href<span class=\"token punctuation\">}</span> onClick<span class=\"token operator\">=</span><span class=\"token punctuation\">{</span>handleClick<span class=\"token punctuation\">}</span> style<span class=\"token operator\">=</span><span class=\"token punctuation\">{</span>style<span class=\"token punctuation\">}</span><span class=\"token operator\">></span>\n      <span class=\"token punctuation\">{</span>children<span class=\"token punctuation\">}</span>\n    <span class=\"token operator\">&lt;</span><span class=\"token operator\">/</span>a<span class=\"token operator\">></span>\n  <span class=\"token punctuation\">)</span>\n<span class=\"token punctuation\">}</span>\n\n<span class=\"token keyword\">export</span> <span class=\"token keyword\">default</span> ActiveLink</code></pre></div>\n</br>\n<h3 id=\"23-어느-방식을-사용해야-하나요\" style=\"position:relative;\"><a href=\"#23-%EC%96%B4%EB%8A%90-%EB%B0%A9%EC%8B%9D%EC%9D%84-%EC%82%AC%EC%9A%A9%ED%95%B4%EC%95%BC-%ED%95%98%EB%82%98%EC%9A%94\" aria-label=\"23 어느 방식을 사용해야 하나요 permalink\" class=\"anchor 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>2.3 어느 방식을 사용해야 하나요?</h3>\n<p><strong>router.push</strong>를 사용해서 화면을 전환하는 경우는 javascript에서 <code class=\"language-text\">window.location</code>을 하는 경우와 비슷합니다.</p>\n<p><strong>Link</strong>를 사용해서 화면을 전환하는 경우는 <code class=\"language-text\">&lt;a></code> tag를 이용해서 화면을 전환 하는 경우와 비슷합니다. 다만 Next.js에서의 일반적인 <code class=\"language-text\">&lt;a></code> tag와는 다르게client-side 의 라우팅을 지원합니다.</p>\n<p>여기서 확인되는 차이점은 <code class=\"language-text\">&lt;a></code> tag가 생성된다는 점 입니다.</p>\n<p>즉 <code class=\"language-text\">&lt;a></code> tag 가 생성된다는 것은 SEO 최적화에 더 유리하다는 것을 의미합니다. (<code class=\"language-text\">&lt;a></code> tag에 링크를 크롤링 봇이 이동 할 수 있습니다.)</p>\n<p>추가적으로 link는 <code class=\"language-text\">data prefetch</code> 기능을 제공하여 사용자의 화면에 link 태그가 보이게 되면 해당 링크에 연결된 페이지를 서버에 요청하여 prefetch 할 수 있습니다.\n미리 가져온 페이지가 존재하기 때문에 이동시 더욱 빠르게 이동 할 수 있습니다.</p>","tableOfContents":"<ul>\n<li>\n<p><a href=\"/react/2022-12.13---next-study-02/#%EB%93%A4%EC%96%B4%EA%B0%80%EA%B8%B0-%EC%95%9E%EC%84%9C\">들어가기 앞서</a></p>\n<ul>\n<li><a href=\"/react/2022-12.13---next-study-02/#1-file-system-based-router\">1. File-system based router</a></li>\n<li>\n<p><a href=\"/react/2022-12.13---next-study-02/#2-linking-between-pages\">2. Linking between pages</a></p>\n<ul>\n<li><a href=\"/react/2022-12.13---next-study-02/#21-nextlink\">2.1 next/link</a></li>\n<li><a href=\"/react/2022-12.13---next-study-02/#22-nextrouter\">2.2 next/router</a></li>\n<li><a href=\"/react/2022-12.13---next-study-02/#23-%EC%96%B4%EB%8A%90-%EB%B0%A9%EC%8B%9D%EC%9D%84-%EC%82%AC%EC%9A%A9%ED%95%B4%EC%95%BC-%ED%95%98%EB%82%98%EC%9A%94\">2.3 어느 방식을 사용해야 하나요?</a></li>\n</ul>\n</li>\n</ul>\n</li>\n</ul>","frontmatter":{"title":"Next.js & React Study (2)","date":"December 13, 2022"}}},"pageContext":{"slug":"/react/2022-12.13---next-study-02/","previous":{"fields":{"slug":"/react/2022-12.10---next-study-01/"},"frontmatter":{"title":"Next.js & React Study (1)"}},"next":{"fields":{"slug":"/react/2022-12.17---next-study-03/"},"frontmatter":{"title":"Next.js & React Study (3)"}}}},"staticQueryHashes":["2486386679","3128451518"]}