nextjs + Prisma + supabase
Prisma를 사용하여 프로젝트를 설정하고 데이터베이스 마이그레이션을 수행하는 기본 단계를 설명하겠습니다.
아래는 각 단계에 대한 자세한 설명입니다:
- Prisma 설치 및 프로젝트 초기화:
- 프로젝트 폴더로 이동한 후 다음 명령어를 사용하여 Prisma를 설치합니다.
- 다음으로, 프로젝트 초기화를 위해 다음 명령어를 실행합니다.
npx prisma init - 이 명령어는 프로젝트 루트에 prisma 디렉토리를 생성하고, schema.prisma 파일을 초기화합니다. 이 파일은 데이터 모델을 정의하는데 사용됩니다.
- 프로젝트 폴더로 이동한 후 다음 명령어를 사용하여 Prisma를 설치합니다.
- Prisma Client 설치:
- Prisma Client는 데이터베이스와 상호 작용하기 위한 클라이언트 라이브러리입니다. 아래 명령어를 사용하여 Prisma Client를 설치합니다.
- yarn add @prisma/client
- 이렇게 하면 node_modules 디렉토리에 @prisma/client 패키지가 설치됩니다.
- 마이그레이션 생성 및 적용:
- 마이그레이션은 데이터베이스 스키마 변경을 추적하고 적용하는 과정입니다. 아래 명령어를 사용하여 초기 마이그레이션을 생성합니다.
npx prisma migrate dev --name init
- 이 명령어는 마이그레이션을 생성하고 즉시 적용합니다. init은 마이그레이션의 이름입니다. 여러 번 실행되는 마이그레이션은 각각 고유한 이름을 가져야 합니다.
- 마이그레이션은 데이터베이스 스키마 변경을 추적하고 적용하는 과정입니다. 아래 명령어를 사용하여 초기 마이그레이션을 생성합니다.
이제 프로젝트에는 Prisma 설정 파일(schema.prisma)과 Prisma Client가 설치되어 있으며, 초기 마이그레이션이 데이터베이스에 적용되었습니다. 이제 Prisma를 사용하여 데이터베이스에 쿼리를 날리거나 데이터를 조작할 수 있게 되었습니다.
커넥션 풀
Connection pooling(연결 풀링)은 데이터베이스 연결을 효과적으로 관리하기 위한 기술입니다. 일반적으로 데이터베이스에 연결하려면 애플리케이션은 데이터베이스 서버와의 연결을 설정하고, 작업을 수행한 후에는 해당 연결을 종료합니다. 그러나 매번 연결을 설정하고 종료하는 것은 비용이 많이 들고, 성능에도 영향을 미칠 수 있습니다.
이러한 문제를 해결하기 위해 연결 풀링이 도입되었습니다. 연결 풀링은 미리 일정 수의 연결을 생성하고 이를 풀(pool)에 저장해두는 방식입니다. 애플리케이션이 데이터베이스에 연결을 요청하면, 풀에 이미 생성된 연결이 있다면 해당 연결을 제공하고, 작업이 완료되면 다시 풀에 반환됩니다.
간단한 예를 들어보겠습니다. 연결 풀을 사용하지 않는다면 애플리케이션이 데이터베이스에 연결할 때마다 새로운 연결을 생성하고, 작업이 끝나면 해당 연결을 닫아야 합니다. 그러나 연결 풀을 사용하면 이미 생성된 연결을 재활용하여 더 효율적으로 데이터베이스 연결을 관리할 수 있습니다.
연결 풀의 장점은 다음과 같습니다:
- 성능 향상: 이미 생성된 연결을 재사용하기 때문에 연결을 설정하고 종료하는 오버헤드가 감소하고, 빠른 응답 속도를 얻을 수 있습니다.
- 리소스 절약: 연결을 매번 새로 만들지 않고 재사용함으로써 시스템 자원을 절약할 수 있습니다.
- 스케일링 용이성: 여러 사용자나 스레드에서 동시에 작업하는 경우 연결 풀은 데이터베이스 연결을 효과적으로 관리하여 시스템의 확장성을 높입니다.
연결 풀은 주로 웹 애플리케이션, 데이터베이스 액세스를 다루는 서버 애플리케이션 등에서 사용되며, 다양한 프로그래밍 언어와 데이터베이스 관리 시스템에서 지원됩니다.
prisma unable to connect to supabase database
prisma 폴더 안에 있는 schema.prisma 파일에 data model을 설정해준다.
<shema.prisma>
// This is your Prisma schema file,
// learn more about it in the docs: https://pris.ly/d/prisma-schema
generator client {
provider = "prisma-client-js"
}
datasource db {
provider = "postgresql"
url = env("DATABASE_URL")
}
model User {
id Int @id @default(autoincrement())
email String @unique
name String
}
model Store {
id Int @id @default(autoincrement())
phone String? // tel_no
address String? // rdn_code_nm
lat String? // y_dnts
lng String? // x_cnts
name String? // upso_nm
category String? // bizcnd_code_nm
storeType String? // cob_code_nm
foodCertifyName String? // crtfc_gbn_nm
}
<env>
DATABASE_URL=""
.env 파일에서 DATABASE_URL 값을 넣어줘야한다.
Supabase에서 Settings > Database에 들어가면 Connection string이 존재한다. 여기서 URI값을 복사해주면 된다.
🚨Use connection pooling 이 자동 선택되는데 이를 선택하면 다른 방법으로 연결 해줘야함 🚨
1단계: Supabase 프로젝트 설정에서 연결 문자열 가져오기
데이터베이스 설정 페이지로 이동합니다. 이 예시에서는 커넥션 풀러를 사용하여 연결하겠습니다. 네트워크가 IPv6를 지원하는 경우, 커넥션 풀러를 사용하지 않고 데이터베이스에 직접 연결할 수도 있습니다.
우리는 트랜잭션 모드 및 세션 모드에서 모두 풀러를 사용할 것입니다. 트랜잭션 모드는 애플리케이션 쿼리에 사용되며, 세션 모드는 Prisma를 사용하여 마이그레이션을 실행할 때 사용됩니다.
이를 위해 데이터베이스 설정 페이지에서 연결 모드를 트랜잭션으로 설정하고, 연결 문자열을 복사한 후에 ?pgbouncer=true&connection_limit=1을 추가하세요. pgbouncer=true는 Prisma가 준비된 문을 생성하지 않도록 비활성화합니다. 이는 저희의 커넥션 풀러가 아직 트랜잭션 모드에서 준비된 문을 지원하지 않기 때문에 필요합니다. connection_limit=1 매개변수는 서버리스 환경에서 Prisma를 사용하는 경우에만 필요합니다. 이러한 매개변수에 대한 자세한 내용은 아래의 문제 해결 섹션을 참조하세요. 만약 데이터베이스가 Postgres 14 이상이라면, 트랜잭션 커넥션 풀러 문자열은 다음과 같이 보일 것입니다:
postgres://[db-user].[project-ref]:[db-password]@aws-0-[aws-region].pooler.supabase.com:6543/[db-name]?pgbouncer=true&connection_limit=1
- "연결 풀러"는 연결을 "활성" 상태로 유지하는 도구입니다. Prisma, Drizzle, Kysely 등과 같이 데이터베이스에서 자주 연결이 끊어지는 서버리스 기능 및 도구에 이 기능을 사용해야 합니다. 네트워크가 ipv6를 지원하지 않는 경우에도 이 기능을 사용해야 합니다.
- "직접 연결"은 Postgres의 기본 연결 시스템입니다. 네트워크가 ipv6을 지원하는 한 장기 실행 서버와 같이 항상 활성화된 도구에 이를 사용할 수 있습니다.
연결 풀을 사용하는 이유는 무엇입니까? 주로 Postgres가 연결을 처리하는 방식은 많은 수의 임시 연결에 대해 확장성이 떨어지기 때문입니다. 다음과 같은 간단한 질문을 사용하여 사용할 연결 방법을 결정할 수 있습니다.
- IPv6을 지원하지 않는 네트워크에 있습니까? 연결 풀러를 사용하십시오.
- 데이터베이스에 연결한 후 즉시 연결을 끊 습니까 (예: 서버리스 환경)? 연결 풀러를 사용하십시오.
- 데이터베이스에 연결하고 연결을 유지하고 있습니까? 네트워크가 ipv6을 지원합니까? 그렇다면 직접 연결을 사용하십시오.
모든 Supabase 프로젝트에는 Postgres 데이터베이스에 대한 연결을 관리하는 커넥션 풀러가 함께 제공됩니다.
커넥션 풀러는 많은 수의 일시적인 연결을 관리하는 데 유용합니다. 예를 들어, Prisma, Drizzle, Kysely 또는 AWS Lambdas나 Edge Functions과 같은 서버리스 환경에 배포된 어떤 것을 사용하고 있다면 커넥션 풀러가 유용합니다. Supabase의 커넥션 풀러는 기본적으로 ipv4를 지원합니다.
대시보드 내의 데이터베이스 설정에서 커넥션 풀 구성을 찾을 수 있습니다:
- 대시보드에서 "Settings" 섹션으로 이동합니다.
- "Database"를 클릭합니다.
- "Connect to your database via connection pooling" 아래에서 연결 문자열을 복사하세요.
이를 통해 Supabase의 커넥션 풀러를 설정하고 데이터베이스 연결을 효과적으로 관리할 수 있습니다.
npx prisma migrate:dev --name init