기록을 불러오는 중입니다...
<script> 태그를 만들어줍니다. 이 코드를 복사하여 댓글을 보여주고 싶은 페이지 내에 삽입하면 끝!@giscus/react 패키지를 설치했습니다.// [slug]/page.tsx
// 메타데이터 설정
export async function generateMetadata({ params }: Props): Promise<Metadata> { ... }
// ISR 적용
export const revalidate = 3600;
export const dynamicParams = true;
export async function generateStaticParams() { ... }
type RecordPageProps = { params: Promise<{ slug: string }> };
export default async function RecordPage({ params }: RecordPageProps) {
const { slug } = await params;
const recordMap = await getPageByPageId(slug);
return (
<RecordPageLayout>
<NotionPage recordMap={recordMap} />
</RecordPageLayout>
);
}
// Notion API로 글 내용 가져오기
function getPageByPageId(pageId: string) {
return notionAPI.getPage(pageId);
}// NotionPage.tsx
"use client";
type NotionPageProps = { recordMap: ExtendedRecordMap };
export function NotionPage({ recordMap }: NotionPageprops) {
// ...
return (
<NotionRenderer
recordMap={recordMap}
// ...
/>
);
}
[slug]/page.tsx)는 현재 서버 컴포넌트로서, Notion API를 이용해 글 데이터를 가져온 뒤, NotionPage 라는 컴포넌트로 렌더링을 하고 있습니다. NotionPage 컴포넌트는 동적 렌더링 특성 상, 클라이언트 컴포넌트입니다.Comments 라는 컴포넌트를 별도의 파일로 구현해줍니다.// Comments.tsx
"use client";
import Giscus from "@giscus/react";
export function Comments() {
return (
<Giscus
id="comments"
repo="..."
repoId="..."
category="Announcements"
categoryId="..."
mapping="title"
strict="0"
reactionsEnabled="1"
emitMetadata="0"
inputPosition="top"
theme="noborder_light"
lang="ko"
loading="lazy"
/>
);
}
Comments 컴포넌트를 RecordPage 컴포넌트에 추가해줍니다.// [slug]/page.tsx
// ...
export default async function RecordPage({ params }: RecordPageProps) {
// ...
return (
<RecordPageLayout>
<NotionPage recordMap={recordMap} />
<Comments /> {/* 여기에 댓글을 보여줍니다. */}
</RecordPageLayout>
);
}RecordPage 가 있는 파일은 generateMetadata 및 generateStaticParams 를 활용하고 있으므로, 서버 컴포넌트여야 함.NotionPage 는 동일한 클라이언트 컴포넌트이고 글 내용과 댓글이 UI 상으로는 붙어있기는 해도, 서로 같이 붙어있어야 할 이유는 없고 단일 책임을 위반하기 때문에 해당 위치에 Giscus 컴포넌트를 구현하지 않음.Giscus 컴포넌트가 있는 것 또한 위와 같은 사유로 옳지 않아보임.Giscus 컴포넌트 넣었는데 서버/클라 컴포넌트 관련 에러가 터지거나 노션 API에서 CORS 발생하는 등 문제가 좌라락 터지더라구요…ㅎㅎ