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")
}