이정환 강사님의 한 입 크기로 잘라먹는 Next.js강의를 들으며 정리한 내용.
npx create-next-app@14/pages
	index.tsx = ~/
    search.tsx = ~/search
    book
    	index.tsx = ~/book
        [id].tsx = ~/book/1 (dynamic routes)
        [...id].tsx = ~/book/1, ~/book/1/2 (catch all segment)
        [[...id]].tsx = ~/book, ~/book/1 (optional catch all segment)// src/pages/_app.tsx
export default function App({
  Component,
  pageProps,
}: AppProps & {
  Component: NextPageWithLayout;
}) {
  const getLayout =
    Component.getLayout ?? ((page: ReactNode) => page);
  return (
    <GlobalLayout>
      {getLayout(<Component {...pageProps} />)}
    </GlobalLayout>
  );
}
// src/pages/search/index.tsx
...
Page.getLayout = (page: ReactNode) => {
  return <SearchableLayout>{page}</SearchableLayout>;
};
데이터 페칭이 페이지 컴포넌트에 집중.
getServerSideProps
getStaticProps
   export const getServerSideProps = async (
      context: GetServerSidePropsContext
    ) => {
      // ssr로 동작하도록 자동으로 설정(getServerSideProps)
      const q = context.query.q;
      const books = await fetchBooks(q as string);
      return {
        props: { books },
      };
      // 반드시 객체타입의 props가 들어있어야만 함.
    };
    export default function Page({
      books,
    }: InferGetStaticPropsType<typeof getServerSideProps>) {
      return (
      );
    }
    export const getStaticPaths = () => {
      return {
        paths: [
          { params: { id: '1' } },
          { params: { id: '2' } },
          { params: { id: '3' } },
        ],
        // fallback: false, // 1,2,3 을 제외한 경로는 404 경로로 지정(not found)
        // blocking : 즉시 생성(SSR) , true : 즉시 생성 + 페이지만 미리 반환
        fallback: false,
      };
    };
    export const getStaticProps = async (context: GetStaticPropsContext) => {
      // ssr로 동작하도록 자동으로 설정(getServerSideProps)
      if (!book) {
        return {
          notFound: true,
        };
      }
      return {
        props: { book },
      };
    };불 필요한 컴포넌트들도 JS Bundle에 포함.