구분 | 장점 | 단점 |
---|---|---|
자체 엔드포인트 API | - ORM을 사용할 수 있어서 DB를 쉽게 다룰 수 있다. - DB에 직접 접근할 수 있어서 데이터를 더 효율적으로 가져올 수 있다. | - API를 직접 만들어야 하므로 시간이 더 걸린다. - DB에 직접 접근하므로 보안에 취약할 수 있다. - 많이 복잡한 편이다 |
Supabase의 REST API | - DB에 직접 접근하지 않아도 된다. - 코드가 매우 간결하다. | - 데이터를 가져오는데 제약이 있을 수 있다. - 데이터를 가져오는데 시간이 더 걸릴 수 있다. |
npm i -D prisma
npm i @prisma/client
npx prisma init
[YOUR-PASSWORD]
는 본인의 프로젝트 비밀번호로 바꿔주어야 한다.
뒤에 붙어있는 :[포트번호]/postgress
는 지워주도록 하자.DATABASE_URL="postgres://postgres.[Reference ID]:[YOUR-PASSWORD]@aws-0-ap-northeast-2.pooler.supabase.com
{
"scripts": {
// ...
"postinstall": "prisma generate"
}
}
npx prisma db pull
generator client {
provider = "prisma-client-js"
}
datasource db {
provider = "postgresql"
url = env("DATABASE_URL")
directUrl = env("DIRECT_URL")
}
model Tag { // 추가
id BigInt @id @unique @default(autoincrement())
name String @default("")
}
npx prisma generate
npx prisma db push
npx prisma generate
const { PrismaClient } = require("@prisma/client");
import { NextResponse, NextRequest } from "next/server";
const prisma = new PrismaClient();
export async function GET() {
try {
return NextResponse.json( {data: await getTags()}, { status: 200 });
} catch (error) {
return NextResponse.json(
{ error: error || "Tags not Found" },
{ status: 405 },
);
}
}
async function getTags() {
const Tags = await prisma.tag.findMany({
orderBy: {
id: "asc",
},
});
return Tags;
}
${process.env.NEXT_PUBLIC_API_BASE_URL}
는 .env.local
파일에 설정한 API URL이다.
디버그 모드에서는 http://localhost:3000
으로 설정하고, 배포 시에는 https://[your-domain]
으로 설정해주어야 한다.export const Page = async () => {
let tags;
try {
tags = await fetch(
`${process.env.NEXT_PUBLIC_API_BASE_URL}/api/tag`,
{ next: { revalidate: 60 } },
)
.then((res) => res.json())
.then((data) => data.data);
} catch (e) {
tags = [];
}
return (
<div>
{tags.map((tag) => (
<div key={tag.id}>
<h1>{tag.name}</h1>
</div>
))}
</div>
);
};
"use client";
import { useState, useEffect } from "react";
export const Page = () => {
const [tags, setTags] = useState([]);
useEffect(() => {
fetch(`${process.env.NEXT_PUBLIC_API_BASE_URL}/api/tag`)
.then((res) => res.json())
.then((data) => setTags(data.data));
}, []);
return (
<div>
{tags.map((tag) => (
<div key={tag.id}>
<h1>{tag.name}</h1>
</div>
))}
</div>
);
};
npm i @supabase/supabase-js @supabase/ssr
3. Declare Supabase Environment Variables
섹션에서 쉽게 확인 가능하다.NEXT_PUBLIC_SUPABASE_URL=https://[your-project-id].supabase.co
NEXT_PUBLIC_SUPABASE_ANON_KEY=[your-anon-key]
import { createServerClient, type CookieOptions } from "@supabase/ssr";
import { cookies } from "next/headers";
export const createClient = () => {
const cookieStore = cookies();
return createServerClient(
process.env.NEXT_PUBLIC_SUPABASE_URL!,
process.env.NEXT_PUBLIC_SUPABASE_ANON_KEY!,
{
cookies: {
get(name: string) {
return cookieStore.get(name)?.value;
},
set(name: string, value: string, options: CookieOptions) {
try {
cookieStore.set({ name, value, ...options });
} catch (error) {
}
},
remove(name: string, options: CookieOptions) {
try {
cookieStore.set({ name, value: "", ...options });
} catch (error) {
}
},
},
},
);
};
import { createClient } from "@supabase/supabase-js";
export const supabase = createClient(
process.env.NEXT_PUBLIC_SUPABASE_URL!,
process.env.NEXT_PUBLIC_SUPABASE_ANON_KEY!,
);
import { createClient } from "@/utils/serverclientSSR";
interface Tag { // 데이터의 타입 정의
id: number;
name: string;
}
const getData = async () => {
const supabase = createClient();
const { data }: { data: Tag[] } = await supabase
.from("Tag") // 테이블 이름
.select(); // 모든 열의 데이터 가져오기
return data;
};
export const Page = async () => {
const tags = await getData();
return (
<div>
{tags.map((tag) => (
<div key={tag.id}>
<h1>{tag.name}</h1>
</div>
))}
</div>
);
};
"use client";
import { supabase } from "@/utils/serverclientCSR";
import { useEffect, useState } from "react";
interface Tag { // 데이터의 타입 정의
id: number;
name: string;
}
export const Page = () => {
const [tags, setTags] = useState<Tag[]>([]);
useEffect(() => {
const getData = async () => {
const { data }: { data: Tag[] } = await supabase
.from("Tag") // 테이블 이름
.select(); // 모든 열의 데이터 가져오기
setTags(data);
};
getData();
}, []);
return (
<div>
{tags.map((tag) => (
<div key={tag.id}>
<h1>{tag.name}</h1>
</div>
))}
</div>
);
};
NEWNAME_DATABASE_URL="postgres://postgres.[Reference ID]:[YOUR-PASSWORD]@aws-0-ap-northeast-2.pooler.supabase.com"
datasource db {
provider = "postgresql"
url = env("NEWNAME_DATABASE_URL")
}
Error: EPERM: operation not permitted, unlink "C:\\**\\node_modules\\.prisma\\client\\query-engine-windows.exe"