Prisma Adapter
리소스
설정
설치
npm install @prisma/client @auth/prisma-adapter
npm install prisma --save-dev
환경 변수
Prisma는 데이터베이스와 연결을 설정하고 데이터를 가져오기 위해 환경 변수를 설정해야 합니다. Prisma는 연결을 생성하기 위해 DATABASE_URL
환경 변수가 필요합니다. 더 자세한 정보는 공식 문서를 참고하세요.
DATABASE_URL=postgresql://USER:PASSWORD@HOST:PORT/DATABASE?schema=SCHEMA
설정
Prisma ORM
을 사용하여 성능을 개선하려면, 프로젝트 전체에서 단 하나의 인스턴스만 생성되도록 Prisma 인스턴스를 설정한 후 필요할 때마다 파일에서 가져와 사용할 수 있습니다. 이 방법은 PrismaClient를 매번 사용할 때마다 새로 생성하는 것을 방지합니다. 마지막으로, auth.ts
파일 설정에서 Prisma 인스턴스를 가져올 수 있습니다.
import { PrismaClient } from "@prisma/client"
const globalForPrisma = globalThis as unknown as { prisma: PrismaClient }
export const prisma = globalForPrisma.prisma || new PrismaClient()
if (process.env.NODE_ENV !== "production") globalForPrisma.prisma = prisma
미들웨어나 다른 엣지 런타임을 사용하는 경우 @prisma/client@5.12.0
이상
버전을 사용하는 것을 권장합니다. 자세한 내용은 아래 엣지
호환성을 참조하세요.
import NextAuth from "next-auth"
import { PrismaAdapter } from "@auth/prisma-adapter"
import { prisma } from "@/prisma"
export const { handlers, auth, signIn, signOut } = NextAuth({
adapter: PrismaAdapter(prisma),
providers: [],
})
Edge 호환성
Prisma는 클라이언트에 대한 엣지 런타임 지원을 5.12.0
버전부터 제공하고 있습니다. 자세한 내용은 Prisma 엣지 문서에서 확인할 수 있습니다. 이 기능은 특정 데이터베이스 드라이버가 필요하므로, 일부 데이터베이스 타입 및 호스팅 제공자와만 호환됩니다. 시작하기 전에 지원되는 드라이버 목록을 확인하세요. next-auth
와 Prisma를 엣지 환경에서 사용한 Auth.js 애플리케이션 예제는 여기에서 확인할 수 있습니다.
엣지 호환성에 대한 일반적인 정보는 엣지 호환성 가이드를 참고하세요.
이전에 사용하던 데이터베이스 엣지 런타임 해결 방법인 auth.ts
설정을 두 부분으로 나누는 방법은 아래에 그대로 남겨둡니다.
Old Edge 해결 방법
현재 Prisma는 Vercel과 같은 엣지 런타임과 완전히 호환되도록 작업 중입니다. 이 문제는 여기에서 추적 중이며, Prisma는 5.9.1
변경 로그에서 초기 엣지 지원에 대해 발표했습니다. 이 문제를 해결하기 위한 두 가지 방법이 있습니다:
- Prisma의 Accelerate 기능 사용
- Edge Compatibility 페이지에 설명된 해결 방법을 따르기. 이 방법은
jwt
세션 전략을 사용하고auth.ts
설정을 두 개의 파일로 분리합니다.
jwt
세션 전략과 @prisma/client@5.9.1
이상 버전을 사용할 경우, 미들웨어에서 데이터베이스 쿼리를 실행하지 않는 것만 확인하면 추가 수정이 필요하지 않습니다.
@prisma/client@5.9.1
부터 Prisma는 인스턴스화 시점이 아니라 쿼리 실행 시점에 엣지 런타임과의 비호환성에 대해 오류를 발생시킵니다. 따라서 미들웨어에서 사용되는 파일에서 Prisma를 가져올 수 있지만, 미들웨어 내에서 쿼리를 실행하지 않도록 주의해야 합니다.
스키마
Prisma 2.26.0
이상 버전을 사용해야 합니다. prisma/schema.prisma
파일에 다음 모델들을 포함한 스키마 파일을 생성하세요.
스키마 적용하기
이 명령어는 SQL 마이그레이션 파일을 생성하고 실행합니다:
npm exec prisma migrate dev
데이터베이스 연결 문자열을 DATABASE_URL
환경 변수로 지정해야 합니다. 프로젝트 루트에 .env
파일을 만들고 여기에 설정할 수 있습니다.
Prisma Client 생성하기
prisma migrate dev
명령어를 실행하면 Prisma 클라이언트도 함께 생성됩니다. 하지만 수동으로 다시 생성해야 하는 경우, 다음 명령어를 실행할 수 있습니다.
npm exec prisma generate
개발 워크플로우
애플리케이션을 개발하면서 데이터베이스 스키마를 변경할 때마다, Prisma가 (1) 마이그레이션 파일을 생성하고 이를 데이터베이스에 적용하고, (2) 최신 타입과 모델 메서드를 포함한 Prisma 클라이언트를 프로젝트에서 다시 생성할 수 있도록 migrate
명령어를 다시 실행해야 합니다.
npm exec prisma migrate dev
네이밍 컨벤션
snake_case
와 camelCase
가 혼합된 컬럼 이름이 여러분이나 데이터베이스 시스템에 문제가 된다면, Prisma의 @map()
기능을 사용해 필드 이름을 변경하는 것을 추천합니다. 이 방법은 Auth.js에는 영향을 미치지 않으면서도 원하는 네이밍 컨벤션에 맞게 컬럼 이름을 커스터마이징할 수 있습니다.
예를 들어, snake_case
와 복수형 테이블 이름으로 변경할 수 있습니다.
model Account {
id String @id @default(cuid())
userId String @map("user_id")
type String
provider String
providerAccountId String @map("provider_account_id")
refresh_token String? @db.Text
access_token String? @db.Text
expires_at Int?
token_type String?
scope String?
id_token String? @db.Text
session_state String?
user User @relation(fields: [userId], references: [id], onDelete: Cascade)
@@unique([provider, providerAccountId])
@@map("accounts")
}
model Session {
id String @id @default(cuid())
sessionToken String @unique @map("session_token")
userId String @map("user_id")
expires DateTime
user User @relation(fields: [userId], references: [id], onDelete: Cascade)
@@map("sessions")
}
model User {
id String @id @default(cuid())
name String?
email String? @unique
emailVerified DateTime? @map("email_verified")
image String?
accounts Account[]
sessions Session[]
@@map("users")
}
model VerificationToken {
identifier String
token String
expires DateTime
@@unique([identifier, token])
@@map("verification_tokens")
}