{"componentChunkName":"component---src-templates-blog-post-js","path":"/react/2022-12.18---next-study-04/","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":"5c40115b-4ca8-57d6-857f-1796dc5471c6","excerpt":"들어가기 앞서 검색엔진최적화(SEO)를 위해서 사이트의 head안에 meta 데이터 관리가 중요합니다. 따라서 이번에는\nNext.js에서 Meta Data를 처리하는 방법에 대해서 정리 하였습니다. 1.  Component Next.js 에서 페이지에 head를 추가하는 방법은 간단합니다.  의  컴포넌트를 사용하면 됩니다. 2. _app.js head를 각 페이지마다 추가하지 않고 App 전체의 기본 head를 관리하고 싶은경우 _app.js에 추가하면 됩니다. _app.js…","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>검색엔진최적화(SEO)를 위해서 사이트의 head안에 meta 데이터 관리가 중요합니다. 따라서 이번에는\nNext.js에서 Meta Data를 처리하는 방법에 대해서 정리 하였습니다.</p>\n<h2 id=\"1-head-component\" style=\"position:relative;\"><a href=\"#1-head-component\" aria-label=\"1 head component 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. <code class=\"language-text\">&lt;Head></code> Component</h2>\n<p>Next.js 에서 페이지에 head를 추가하는 방법은 간단합니다. <code class=\"language-text\">next/head</code> 의 <code class=\"language-text\">&lt;Head></code> 컴포넌트를 사용하면 됩니다.</p>\n<div class=\"gatsby-highlight\" data-language=\"javascript\"><pre class=\"language-javascript\"><code class=\"language-javascript\"><span class=\"token keyword\">import</span> Head <span class=\"token keyword\">from</span> <span class=\"token string\">'next/head'</span>\n\n<span class=\"token keyword\">function</span> <span class=\"token function\">IndexPage</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>div<span class=\"token operator\">></span>\n      <span class=\"token operator\">&lt;</span>Head<span class=\"token operator\">></span>\n        <span class=\"token operator\">&lt;</span>title<span class=\"token operator\">></span>My page title<span class=\"token operator\">&lt;</span><span class=\"token operator\">/</span>title<span class=\"token operator\">></span>\n        <span class=\"token operator\">&lt;</span>meta name<span class=\"token operator\">=</span><span class=\"token string\">\"viewport\"</span> content<span class=\"token operator\">=</span><span class=\"token string\">\"initial-scale=1.0, width=device-width\"</span> <span class=\"token operator\">/</span><span class=\"token operator\">></span>\n      <span class=\"token operator\">&lt;</span><span class=\"token operator\">/</span>Head<span class=\"token operator\">></span>\n      <span class=\"token operator\">&lt;</span>p<span class=\"token operator\">></span>Hello world<span class=\"token operator\">!</span><span class=\"token operator\">&lt;</span><span class=\"token operator\">/</span>p<span class=\"token operator\">></span>\n    <span class=\"token operator\">&lt;</span><span class=\"token operator\">/</span>div<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> IndexPage</code></pre></div>\n<h2 id=\"2-_appjs\" style=\"position:relative;\"><a href=\"#2-_appjs\" aria-label=\"2 _appjs 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. _app.js</h2>\n<p>head를 각 페이지마다 추가하지 않고 App 전체의 기본 head를 관리하고 싶은경우 _app.js에 추가하면 됩니다.</p>\n<p><strong>_app.js</strong> 는 모든 페이지에서 렌더링되는 애플리케이션 컴포넌트입니다. 모든 컴포넌트에 head를 추가하고 싶다면 아래와 같이 추가하면 됩니다.\n물론 각 페이지의 <code class=\"language-text\">&lt;Head></code> component가 존재하는 경우 가장 최신의 <code class=\"language-text\">&lt;head></code> 정보로 덮어쓰기가 됩니다.</p>\n<div class=\"gatsby-highlight\" data-language=\"javascript\"><pre class=\"language-javascript\"><code class=\"language-javascript\"><span class=\"token keyword\">import</span> type <span class=\"token punctuation\">{</span> AppProps <span class=\"token punctuation\">}</span> <span class=\"token keyword\">from</span> <span class=\"token string\">'next/app'</span>\n<span class=\"token keyword\">import</span> Head <span class=\"token keyword\">from</span> <span class=\"token string\">'next/head'</span>\n\n<span class=\"token keyword\">function</span> <span class=\"token function\">MyApp</span><span class=\"token punctuation\">(</span><span class=\"token parameter\"><span class=\"token punctuation\">{</span> Component<span class=\"token punctuation\">,</span> pageProps <span class=\"token punctuation\">}</span><span class=\"token operator\">:</span> AppProps</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>Layout<span class=\"token operator\">></span>\n      <span class=\"token operator\">&lt;</span>Head<span class=\"token operator\">></span>\n        <span class=\"token operator\">&lt;</span>title<span class=\"token operator\">></span>My page title<span class=\"token operator\">&lt;</span><span class=\"token operator\">/</span>title<span class=\"token operator\">></span>\n        <span class=\"token operator\">&lt;</span>meta name<span class=\"token operator\">=</span><span class=\"token string\">\"viewport\"</span> content<span class=\"token operator\">=</span><span class=\"token string\">\"initial-scale=1.0, width=device-width\"</span> <span class=\"token operator\">/</span><span class=\"token operator\">></span>\n      <span class=\"token operator\">&lt;</span><span class=\"token operator\">/</span>Head<span class=\"token operator\">></span>\n      <span class=\"token operator\">&lt;</span>Component <span class=\"token punctuation\">{</span><span class=\"token operator\">...</span>pageProps<span class=\"token punctuation\">}</span> <span class=\"token operator\">/</span><span class=\"token operator\">></span>\n    <span class=\"token operator\">&lt;</span><span class=\"token operator\">/</span>Layout<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> MyApp</code></pre></div>\n<h2 id=\"3-_documentjs\" style=\"position:relative;\"><a href=\"#3-_documentjs\" aria-label=\"3 _documentjs 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>3. _document.js</h2>\n<p>_app.js 다음에 실행되며 _document.js는 전체 HTML 문서를 커스터마이징할 수 있게 해줍니다</p>\n<p>쉽게 정리하면, 공통적으로 적용할 HTML 마크업을 커스텀 하는 공간으로 볼 수 있습니다.\n_document.js는 정적인 것중에 공통 적용할 사항들을 처리합니다.</p>\n<p>_document를 작성할 때는 Document 클래스를 상속받는 클래스 컴포넌트로 작성해야만 하며, 렌더 함수는 꼭<code class=\"language-text\">&lt;Html></code>, <code class=\"language-text\">&lt;Head></code>, <code class=\"language-text\">&lt;Main></code>, <code class=\"language-text\">&lt;NextScript></code> 요소를 리턴해줘야 합니다.</p>\n<p>_document에서 사용하는 <code class=\"language-text\">&lt;Head></code> 태그는 next/head가 아닌 next/document 모듈에서 불러와야 하는데요, _document의 <code class=\"language-text\">&lt;Head></code>태그에는 모든 문서에 공통적으로 적용될 내용(Ex. charset, 뷰포트 메타태그 등)이 들어가야 합니다.</p>\n<p><strong><em>주의</em></strong> :_document는 언제나 서버에서 실행되므로 브라우저 api 또는 이벤트 핸들러가 포함된 코드는 실행되지 않습니다. 또한 <code class=\"language-text\">&lt;Main /></code> 부분을 제외한 부분은 브라우저에서 실행되지 않으므로 이곳에 비즈니스 로직을 추가해서는 안되며, _app과 마찬가지로 getStaticProps와 getServerSideProps 를 통해 데이터를 불러올 수 없습니다.</p>\n<div class=\"gatsby-highlight\" data-language=\"javascript\"><pre class=\"language-javascript\"><code class=\"language-javascript\"><span class=\"token comment\">// 기본적인 _document의 형태</span>\n\n<span class=\"token keyword\">import</span> Document<span class=\"token punctuation\">,</span> <span class=\"token punctuation\">{</span> Html<span class=\"token punctuation\">,</span> Head<span class=\"token punctuation\">,</span> Main<span class=\"token punctuation\">,</span> NextScript <span class=\"token punctuation\">}</span> <span class=\"token keyword\">from</span> <span class=\"token string\">'next/document'</span>\n\n<span class=\"token keyword\">class</span> <span class=\"token class-name\">MyDocument</span> <span class=\"token keyword\">extends</span> <span class=\"token class-name\">Document</span> <span class=\"token punctuation\">{</span>\n  <span class=\"token keyword\">static</span> <span class=\"token keyword\">async</span> <span class=\"token function\">getInitialProps</span><span class=\"token punctuation\">(</span><span class=\"token parameter\">ctx</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n    <span class=\"token keyword\">const</span> initialProps <span class=\"token operator\">=</span> <span class=\"token keyword\">await</span> Document<span class=\"token punctuation\">.</span><span class=\"token function\">getInitialProps</span><span class=\"token punctuation\">(</span>ctx<span class=\"token punctuation\">)</span>\n    <span class=\"token keyword\">return</span> <span class=\"token punctuation\">{</span> <span class=\"token operator\">...</span>initialProps <span class=\"token punctuation\">}</span>\n  <span class=\"token punctuation\">}</span>\n\n  <span class=\"token function\">render</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>Html<span class=\"token operator\">></span>\n        <span class=\"token operator\">&lt;</span>Head <span class=\"token operator\">/</span><span class=\"token operator\">></span>\n        <span class=\"token operator\">&lt;</span>body<span class=\"token operator\">></span>\n          <span class=\"token operator\">&lt;</span>Main <span class=\"token operator\">/</span><span class=\"token operator\">></span>\n          <span class=\"token operator\">&lt;</span>NextScript <span class=\"token operator\">/</span><span class=\"token operator\">></span>\n        <span class=\"token operator\">&lt;</span><span class=\"token operator\">/</span>body<span class=\"token operator\">></span>\n      <span class=\"token operator\">&lt;</span><span class=\"token operator\">/</span>Html<span class=\"token operator\">></span>\n    <span class=\"token punctuation\">)</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> MyDocument</code></pre></div>\n<h2 id=\"4-_appjs-vs-_documentjs\" style=\"position:relative;\"><a href=\"#4-_appjs-vs-_documentjs\" aria-label=\"4 _appjs vs _documentjs 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>4. _app.js vs _document.js</h2>\n<p>head를 _app.js에 추가하여 전역적으로 사용해도 된다고 정리 하였습니다. 또한 _document.js에 사용해도 된다고 정리했습니다.\n과연 어디써야 맞는걸까요?</p>\n<p>이 의문에 대한 해답은 공식문서를 참고하여 정리 하였습니다.</p>\n<p>_app.js는 React Element에 대한 초기화 과정을 담당합니다.</p>\n<p>_.document.js는 정적인 <code class=\"language-text\">&lt;html></code>, <code class=\"language-text\">&lt;body></code>에 대한 설정을 하는 것으로 표기 되어 있습니다.</p>\n<p>_app.js는 전역적으로 컴포넌트 관리<br>\n_document.js는 전역적 정적 HTML 마크업을 담당</p>\n<p>위 내용으로 판단했을때 _document.js 에서 <code class=\"language-text\">&lt;Head></code>를 통한 meta data 관리가 타당하다 할 수 있습니다.</p>","tableOfContents":"<ul>\n<li>\n<p><a href=\"/react/2022-12.18---next-study-04/#%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.18---next-study-04/#1-head-component\">1. <code class=\"language-text\">&lt;Head></code> Component</a></li>\n<li><a href=\"/react/2022-12.18---next-study-04/#2-_appjs\">2. _app.js</a></li>\n<li><a href=\"/react/2022-12.18---next-study-04/#3-_documentjs\">3. _document.js</a></li>\n<li><a href=\"/react/2022-12.18---next-study-04/#4-_appjs-vs-_documentjs\">4. _app.js vs _document.js</a></li>\n</ul>\n</li>\n</ul>","frontmatter":{"title":"Next.js & React Study (4)","date":"December 18, 2022"}}},"pageContext":{"slug":"/react/2022-12.18---next-study-04/","previous":{"fields":{"slug":"/react/2022-12.17---next-study-03/"},"frontmatter":{"title":"Next.js & React Study (3)"}},"next":null}},"staticQueryHashes":["2486386679","3128451518"]}