Before

// page.tsx

/** meta data **/
export async function generateMetadata({ searchParams }: {
  searchParams: Promise<{ [key: string]: string | undefined }>;
}): Promise<Metadata> {
  const searchParam = (await searchParams) as
    | string
    | string[][]
    | Record<string, string>
    | URLSearchParams
    | undefined;
  const queryString = new URLSearchParams(searchParam).toString();

  return getDefaultMetaData({
    title: "mock",
    openGraphUrl: `https://mock-url.com${queryString ? "?" + queryString : ""}`,
  });
}

/// 

type mockProps = {
  searchParams: Promise<{ [key: string]: string | undefined }>;
};

export default async function MockPage({ searchParams }: mockProps) {
  const searchParam = await searchParams;

  const serverId = !searchParam?.temporaryServerId
    ? Number(searchParam?.serverId || 1)
    : Number(searchParam?.temporaryServerId || 1);

  if (isNaN(serverId)) {
    return await getUserInfo(searchParam);
  }

  const [queryData, serverData] = await Promise.all([
    queryMock(
      serverId,
      searchParam?.keyword,
      searchParam?.nickname,
      { lastId: undefined, pageSize: 70 },
      header
    ),
    queryMockServer(),
  ]);

  return (
    <Mock
      mockData={queryData}
      mockServerData={serverData}
      serverId={serverId}
      nickname={searchParam?.nickname}
      keyword={searchParam?.keyword}
    />
  );
}

After

// type.ts
export type SearchParams = Record<string, string | undefined>;

export type SearchParamsWithServerId = {
  serverId?: string;
} & SearchParams;

export type PageProps<T extends SearchParams = SearchParams> = {
  params: Promise<T>;
  searchParams: Promise<T>;
};

/** generateMetadata 전용 제네릭 타입 **/
export type GenerateMetadata<T extends SearchParams> = (
  props: PageProps<T>
) => Promise<Metadata>;
// page.tsx

/** meta data **/
export async function generateMetadata({ searchParams }: PageProps<mockProps>) {
  const searchParam = await searchParams;

  return getDefaultMetaData({
    title: "mock",
    openGraphUrl: `https://mock-url.com${searchParam}`,
  });
}

///

type mockProps = {
  keyword: string;
  nickname: string;
} & SearchParamsWithServerId;

export default async function MockPage({ searchParams }: PageProps<mockProps>) {
  const { serverId, keyword, nickname } = await searchParams;

  const id = isNaN(Number(serverId)) ? 1 : Number(serverId);

  const [queryData, serverData] = await Promise.all([
    queryMock(
      id,
      keyword,
      nickname,
      { lastId: undefined, pageSize: 70 },
      header
    ),
    queryMockServer(),
  ]);

  return (
    <Mock
      mockData={queryData}
      mockServerData={serverData}
      serverId={id}
      nickname={nickname}
      keyword={keyword}
    />
  );
}