1. ServerComponent를 생성

<aside> 💡 서버 컴포넌트는 직접적으로 서버에서 실행되므로 DB에 직접 접근 가능. 즉 API 통신 없이 서버 컴포넌트에서 prisma로 DB에 접근하여 email에 해당하는 유저정보를 가져

</aside>

  1. getCurrentUser.ts인 서버컴포넌트에서 session 정보를 가져온다.
  2. session 정보에서 session.user.email 로 현재 로그인 된 유저의 이메일을 가져온다.
  3. prisma로 mongoDB에서 해당 이메일로 조회하여 유저정보를 가져온다.

로직

import { getServerSession } from 'next-auth/next';

import { authOptions } from '@/pages/api/auth/[...nextauth]';
import prisma from '@/app/libs/prismadb';

export async function getSession() {
  return await getServerSession(authOptions);
}

export default async function getCurrentUser() {
  try {
    const session = await getSession();

    if (!session?.user?.email) {
      return null;
    }
		// DB에서 실제로 조회해 오는 로직
    const currentUser = await prisma.user.findUnique({
      where: {
        email: session.user.email as string,
      },
    });

    if (!currentUser) {
      return null;
    }

    return currentUser;
  } catch (error: any) {
    return null;
  }
}

또다른 서버컴포넌트인 layout.tsx에서 해당 함수를 호출

export default async function RootLayout({
  children,
}: {
  children: React.ReactNode;
}) {
  const currentUser = await getCurrentUser();

  return (
    <html lang='en'>
      <body className={font.className}>
        <ClientOnly>
          <ToasterProvider />
          <LoginModal />
          <RegisterModal />
          {/* <Modal actionLabel='Submit' title='hello world' isOpen={true} /> */}
          <NavBar currentUser={currentUser} />
        </ClientOnly>
        {children}
      </body>
    </html>
  );
}