메타태그
import Head from 'next/head';
Next.js
에서는 이 Head
컴포넌트를 이용해서 메타태그를 작성 할 수 있다.참고로 이 전에 CSR 환경에서는
react-helmet
이라는 외부 라이브러리를 이용했었는데, 이렇게 내부 패키지에서 제공하는것을 보면 확실히 Next.js
가 편리한점이 한두가지가 아닌듯하다. 괜히 인기가 많겠나 싶다.import Head from 'next/head'; interface Props { title: string; description: string; url: string; } const Meta: React.FC<Props> = ({ title, description, url }) => { return ( <Head> <title>{title}</title> <meta name="description" content={description} /> <link rel="image_src" href="/public/byseop.png" /> <meta property="og:site_name" content="byseop.dev" /> <meta property="og:title" content={title} /> <meta property="og:description" content={description} /> <meta property="og:url" content={url} /> <meta property="og:locale" content="ko-KR" /> <meta property="og:type" content="website" /> <meta property="og:image" content="/public/byseop.png" /> <meta property="fb:pages" content="byseop.dev" /> </Head> ); }; export default Meta;
참고로 나의 메타태그는 이렇다. 이 메타 컴포넌트를 각 페이지에 넣어줄 것이다.
import Home from '../components/Home'; import { postApis } from '../core/apis/posts'; import Meta from '../components/Meta'; import type { Response } from '../interfaces'; import type { PageObjectResponse } from '@notionhq/client/build/src/api-endpoints'; export default function ({ data }: { data: Response<PageObjectResponse[]> }) { return ( <> <Meta title="byseop.dev" description="프론트엔드 개발자 byseop 개발블로그 입니다. 세상에서 가장 빠르게 최신 개발 트렌드를 확인해보세요." url="https://byseop.dev" /> <Home initialPosts={data} /> </> ); } export const getServerSideProps = async () => { try { const res = await postApis.getPosts(); return { props: { data: res } }; } catch (e) { console.error(e); } };
실제로 메타태그를 적용해보았다.
next-seo
이용해보기
next-seo
는 next.js
에서 사용하는 SEO 최적화 라이브러리이다. 위클리 다운로드가 20~30만회 정도 나오는것을 보면 꽤나 통상적으로 사용하는듯 하다. 이참에 내 코드도 변경하려고 한다. 먼저 components/Meta
폴더를 과감하게 날려준다.yarn add next-seo
next-seo
를 설치해준다.제일 먼저 디폴트 SEO를 설정해줄것이다. 말 그대로 아무런 SEO 컴포넌트가 제공되지 않았을때 표시할 디폴트 값이다.
// root/next-seo.config.ts import type { DefaultSeoProps } from 'next-seo'; const config: DefaultSeoProps = { openGraph: { type: 'website', locale: 'ko_KR', url: 'https://www.url.ie/', siteName: 'SiteName', }, twitter: { handle: '@handle', site: '@site', cardType: 'summary_large_image', }, }; export default config;
이런식으로 기본정보를 입력해준다.
// pages/_app.tsx export default function App({ Component, pageProps }: AppProps) { return ( //... //... <ThemeProvider theme={theme}> <DefaultSeo {...SEO} /> <DefaultLayout> <LayoutInner> <Component {...pageProps} /> </LayoutInner> </DefaultLayout> </ThemeProvider> //... //... ); }
이렇게
_app.tsx
에 추가해주면 된다.이제 각 페이지에도 필요한 SEO 태그를 넣어주려고 한다.
// pages/posts/[id].tsx // import ... // import ... // interface ... export default function ({ id, data }: IPostPageProps) { // logic ... return ( <> <NextSeo title={...} description={...} openGraph={{ url: [...], title: [...], description: [...], images: [ { url: [...], secureUrl: [...], width: [...], height: [...], alt: [...], type: [...] } ], siteName: [...] }} twitter={{ handle: [...], site: [...], cardType: [...] }} /> <Post id={id} data={data} /> </> ); } export const getServerSideProps: GetServerSideProps = async (context) => { // logic ... };
포스트에서
getServerSideProps
로 가져온 초기데이터를 SEO 컴포넌트에 주입해준다.이렇게 SEO 구성이 끝났다. 이제 배포 후 페이스북 디버거를 통해 1차적으로 테스트 해 볼 계획이다.
배포
가장 쉬운 방법중 하나인 vercel 에서 배포하려고 했다.
![notion image](https://www.notion.so/image/https%3A%2F%2Ffile.notion.so%2Ff%2Ff%2F3b78fcca-37ce-4b3e-946b-08dd42e690b1%2Fd73de492-5649-469f-a77d-6cb5dc8b13f0%2FUntitled.png%3Ftable%3Dblock%26id%3D364a9bf5-a3f5-4120-b235-ba981d1a6f48%26spaceId%3D3b78fcca-37ce-4b3e-946b-08dd42e690b1%26expirationTimestamp%3D1725631200000%26signature%3D6Qu8xyOaJvdPecFA1hxz73tly_hpOTcD8Kwsfuho92Q?table=block&id=364a9bf5-a3f5-4120-b235-ba981d1a6f48&cache=v2)
여기서 깃헙으로 연결해준다.
![notion image](https://www.notion.so/image/https%3A%2F%2Ffile.notion.so%2Ff%2Ff%2F3b78fcca-37ce-4b3e-946b-08dd42e690b1%2F58c8b6aa-cac7-41e8-813e-4aa50b7a2b6a%2FUntitled.png%3Ftable%3Dblock%26id%3D6db5c223-7654-40dc-b489-ac22c61c73d0%26spaceId%3D3b78fcca-37ce-4b3e-946b-08dd42e690b1%26expirationTimestamp%3D1725631200000%26signature%3DJz9DRQENv5A2j9SzdqLlkUyy11ujkOyo4v45DkQ1A-Y?table=block&id=6db5c223-7654-40dc-b489-ac22c61c73d0&cache=v2)
해당하는 레포를 선택해주고
![notion image](https://www.notion.so/image/https%3A%2F%2Ffile.notion.so%2Ff%2Ff%2F3b78fcca-37ce-4b3e-946b-08dd42e690b1%2Faf2f44ef-6ae2-408b-b97f-9cffa878c924%2FUntitled.png%3Ftable%3Dblock%26id%3De6f94a32-58cd-493a-8893-d338e16f394e%26spaceId%3D3b78fcca-37ce-4b3e-946b-08dd42e690b1%26expirationTimestamp%3D1725631200000%26signature%3DVM7W6k3KuTeWYBd77bUn49XhzzxO4_10Y2WtYylwqqg?table=block&id=e6f94a32-58cd-493a-8893-d338e16f394e&cache=v2)
여기에 미리 정의해두었던 환경변수를 넣어주면 된다. 예를들어 notion database id, notion api key 를 넣어주어야 한다.
![notion image](https://www.notion.so/image/https%3A%2F%2Ffile.notion.so%2Ff%2Ff%2F3b78fcca-37ce-4b3e-946b-08dd42e690b1%2F8ce8723d-58e5-4436-b19f-badbc975ea43%2FUntitled.png%3Ftable%3Dblock%26id%3D647bfb3c-0814-4660-aa26-eef96023977a%26spaceId%3D3b78fcca-37ce-4b3e-946b-08dd42e690b1%26expirationTimestamp%3D1725631200000%26signature%3DwygfWELvSmeTZlo83STXLEDtwyP7ZjzSYzm0IFAetpc?table=block&id=647bfb3c-0814-4660-aa26-eef96023977a&cache=v2)
Deploy 가 시작된걸 확인할 수 있다. 나중에 다 개발이 끝나고 나서는 원활하게 크롤링이 되도록
robot.txt
나 sitemap.xml
을 추가해주고, 구글서치콘솔 또한 추가해야 한다. 나는 나중에 도메인도 사서 연결해야지마무리
![notion image](https://www.notion.so/image/https%3A%2F%2Ffile.notion.so%2Ff%2Ff%2F3b78fcca-37ce-4b3e-946b-08dd42e690b1%2Ff91f0b85-be0b-49e6-beff-f5e0e8c73ada%2FUntitled.png%3Ftable%3Dblock%26id%3Da947b724-cfb5-4776-9375-b6edbf0d5812%26spaceId%3D3b78fcca-37ce-4b3e-946b-08dd42e690b1%26expirationTimestamp%3D1725631200000%26signature%3DyIn8MD2TStCB5ZIeI8NQBcP1lzze1S9BVUSQ4M52LQo?table=block&id=a947b724-cfb5-4776-9375-b6edbf0d5812&cache=v2)
배포까지 잘 마무리 되었다. vercel 그는 신인가…