// SSR 방식
import { ReactNode, useEffect } from "react";
import SearchableLayout from "@/components/SearchableLayout";
import { InferGetServerSidePropsType } from "next";
import BookItem from "@/components/BookItem";
import { GetServerSidePropsContext } from "next";
import fetchBooks from "@/library/fetchBooks";
import { BookData } from "@/types";
export const getServerSideProps = async (
context: GetServerSidePropsContext
) => {
const q = context.query.q;
const books = await fetchBooks(q as string);
return {
props: { books },
};
};
export default function SearchPage({
books,
}: InferGetServerSidePropsType<typeof getServerSideProps>) {
return (
<div>
{books.map((book) => (
<BookItem key={book.id} {...book} />
))}
</div>
);
}
// SSG 방식
import { ReactNode, useState, useEffect } from "react";
import SearchableLayout from "@/components/SearchableLayout";
import BookItem from "@/components/BookItem";
import fetchBooks from "@/library/fetchBooks";
import { BookData } from "@/types";
import { useRouter } from "next/router";
export default function SearchPage() {
const [books, setBooks] = useState<BookData[]>([]);
const router = useRouter();
const q = router.query.q;
const fetchSearchResult = async () => {
const data = await fetchBooks(q as string);
setBooks(data);
};
useEffect(() => {
if(q) {
fetchSearchResult()
}
}, [q]);
return (
<div>
{books.map((book) => (
<BookItem key={book.id} {...book} />
))}
</div>
);
}
SearchPage.getLayout = (page: ReactNode) => {
return <SearchableLayout>{page}</SearchableLayout>;
};
GetServerSidePropsContext
- Next.js에서 서버 측 렌더링(SSR) 시 사용되는 컨텍스트 객체로, 요청과 관련된 정보를 제공
- 서버 측에서만 사용 가능
특징
- getServerSideProps 함수의 첫 번째 매개변수로 제공됨
- URL의 쿼리 파라미터, 동적 경로 매개변수, 요청/응답 객체 등 서버 측 정보를 포함
- 주로 SSR에서 데이터를 페칭하거나 URL에 따라 조건부 렌더링을 구현할 때 사용
useRouter()
- React Hook으로, Next.js의 클라이언트 측에서 라우팅 정보를 가져오고 라우팅을 제어하기 위해 사용
- 클라이언트 측에서만 사용 가능
특징
- 브라우저 환경에서 실행되며, 현재 경로, 쿼리 파라미터, 라우팅 관련 메서드 등을 제공
- 주로 페이지 컴포넌트나 클라이언트 사이드 렌더링(CSR)에서 사용
'Next.js' 카테고리의 다른 글
Next.js - SSR, SSG와 빌드 시 기본값 (1) | 2024.12.15 |
---|---|
Next.js 페이지 라우팅 - Link 태그와 useRouter의 차이점, Pre-Fetch의 개념 (1) | 2024.12.12 |
Next.js - SSR과 Server Component, Client Component (2) | 2024.12.09 |