난 내부 태그 페이지에서도 metadata를 함께 적용시키기 위해 layout.tsx에 정의했다.
동적 metadata는 generateMetadata()를 사용 해야한다.
layout.tsx에서는 테스트 해 볼 생각은 하지 않아서 모르겠다만, page.tsx에서만 generateMetadata()가 실행된다. 내 경우 [slug]/page.tsx에서는 무조건 MdxPage 컴포넌트를 렌더링 하게 해놨는데, MdxPage에서는 위 generateMetadata()가 호출되지 않는다. <head> 태그를 바꿔줄 페이지 상단에 generateMetadata()를 모두 호출해줬고 slug로부터 특정 Metadata를 얻게해주는 유틸함수를 만들어서 함수 내부에서 같은 내용을 호출하도록 했다.
정말 다양한 <meta> 태그가 있었지만 주로 사용하는 태그만 적용시켰다.
원하는 필드가 없을 경우 Next.js 공식문서 - Metadata에서 확인 가능하다. 내가 적용한 <meta> 태그는 아래와 같다.
이제 각 포스트 화면에 <meta> 태그가 적용이 되었다.🎉
👇 될 줄 알고 처음에 만들었던 HeadMeta.tsx (이전 버전에서는 적용되는 듯 하다. 현재 내 버전에서는 적용되지 않는다.)
sitemap.xml 설정
sitemap.xml는 검색 엔진 크롤러에게 웹 사이트의 구조를 제공하는 파일이다. sitemap.xml에 모든 url을 설정하고 페이지 별 우선 순위를 알려줄 수 있다.
Next.js 공식문서 - sitemap에 적혀있는대로 sitemap.ts를 만들었다. 검색을 해보니 next-sitemap 라이브러리를 사용하기도 하는데, 공식문서에선 /app 폴더에 추가하라고 해서 우선 공식문서를 따라 하기로 했다.
작성 내용은 아래와 같다.
브라우저 주소창에 블로그주소/sitemap.xml 을 검색해서 아래와 같은 화면이 뜨는지 확인해보자.
robots.txt 설정
robots.txt는 검색 엔진 크롤러에게 웹 사이트의 url 별 접근을 결정하는 파일이다. 모든 책의 목차에서 원하는 페이지를 바로 볼 수 있듯이, robots.txt는 어느 페이지를 방문하고, 방문하지 않을 지 결정하도록 도와준다.
Next.js 공식문서 - robots.txt는 /app 폴더에 robots.txt 파일을 생성하라고 한다. sitemap.ts와 통일성을 주기 위해 robots.ts로 생성했다.
작성 내용은 아래와 같다.
브라우저 주소창에 블로그주소/robots.txt 를 검색해서 아래와 같은 화면이 뜨는지 확인해보자.
캐노니컬(Canonical) 태그 설정
url에 query string이 있으면 query string을 무시하고 통합된 하나의 url만 검색하도록 해서 페이지의 크롤링 작업을 줄여주는 태그이다.
쇼핑몰에서 하나의 상품을 클릭하여 해당 상품 페이지로 이동하면 상품의 옵션마다 각 url이 달라질 수 있다. 옵션이 제각각이어도 모두 같은 하나의 상품이기 때문에 뒤의 query string을 제거하여 기존의 상품 페이지 단 하나만 크롤링되도록 한다.