template
<->metadata
, template
<->wedding_hall
이 one-to-many로 연결되어 있어서, template 데이터를 불러올 때 각 테이블에 해당하는 데이터가 배열로 들어오고 있었다.
one-to-one으로 연결할 수는 없을까? 검색하다가 다음 유튜브 영상을 보고 알게되었다.
one-to-one-relation
pk 값으로 참조를 하도록 함.
기존 metadata
테이블의 컬럼 구조 (one-to-many)
변경한 metadata
테이블의 컬럼 구조 (one-to-one)
page.tsx
type MetadataProps = {
params: { id: string };
searchParams: { [key: string]: string | string[] | undefined };
};
export async function generateMetadata(
{ params, searchParams }: MetadataProps,
parent: ResolvingMetadata,
): Promise<Metadata> {
// ...
const res = await fetch(url);
if (!res.ok) {
return {
title: "결혼식 청첩장",
description: "결혼식에 초대합니다.",
};
}
const body = await res.json();
const instaTemplate = instaTemplateSchema.parse(body);
return {
title: instaTemplate.metadata.title,
description: instaTemplate.metadata.description,
};
}
chatGPT 한테, favicon 이미지 생성을 부탁했다. (만족)
insta-template
데이터를 요청하는 페이지가 많아서, 각 페이지별로 supabase로 요청하는 로직을 가지고 있는 것은 비효율적이라고 생각했음.export const GET = async (req: NextRequest) => {
const cookieStore = cookies();
const supabase = createClient(cookieStore);
const { data } = await supabase.from("template").select("*");
// ...
return NextResponse.json({ ...template });
}
cookies()의 반환값도 쿠키 정보를 가지고 있고,
req.cookies도 쿠키 정보를 가지고 있는데,
둘이 어떻게 다른건지는 좀 알아봐야 할 것 같다.
const Page = async (props) => {
// ...
const id = props.params.id;
const res = await fetch(`/api/template/${id}`);
// Internal error: TypeError: Failed to parse URL from /api/template/test1
// ...
}
protocol과 host를 구하는 로직을 추가하여, 해결
protocol은 꼭 저렇게 되지 않을 수 있지만, 현재는 로컬만 동작하고 있기 때문에 일단 두기로 했음
import { headers } from "next/headers";
const Page = async (props) => {
const id = props.params.id;
const host = headers().get("host") || "localhost:3000";
const protocol = host.includes("localhost") ? "http" : "https";
const url = `${protocol}://${host}/api/templates/${id}`;
const res = await fetch(url);
// ...
}