Skip to content
Migrating from NextAuth.js v4? Read our migration guide.

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 인스턴스를 가져올 수 있습니다.

prisma.ts
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 이상 버전을 사용하는 것을 권장합니다. 자세한 내용은 아래 엣지 호환성을 참조하세요.

./auth.ts
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_casecamelCase가 혼합된 컬럼 이름이 여러분이나 데이터베이스 시스템에 문제가 된다면, Prisma의 @map() 기능을 사용해 필드 이름을 변경하는 것을 추천합니다. 이 방법은 Auth.js에는 영향을 미치지 않으면서도 원하는 네이밍 컨벤션에 맞게 컬럼 이름을 커스터마이징할 수 있습니다.

예를 들어, snake_case와 복수형 테이블 이름으로 변경할 수 있습니다.

schema.prisma
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")
}
Auth.js © Balázs Orbán and Team - 2025