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

TypeORM Adapter

리소스

설정

설치

npm install @auth/typeorm-adapter typeorm

환경 변수

AUTH_TYPEORM_CONNECTION=postgres://postgres:adminadmin@0.0.0.0:5432/db

설정

./auth.ts
import NextAuth from "next-auth"
import { TypeORMAdapter } from "@auth/typeorm-adapter"
 
export const { handlers, auth, signIn, signOut } = NextAuth({
  adapter: TypeORMAdapter(process.env.AUTH_TYPEORM_CONNECTION),
})

TypeORMAdapter는 첫 번째 매개변수로 연결 문자열 또는 ConnectionOptions 객체를 받습니다.

Advanced usage

커스텀 모델

TypeORM 어댑터는 데이터의 구조를 정의하기 위해 Entity 클래스를 사용합니다.

기본 엔티티를 재정의하고 추가 필드를 포함한 커스텀 엔티티 파일을 만들 수 있습니다.

  1. 수정된 엔티티를 포함하는 파일을 생성하세요:
lib/entities.ts
import {
  Entity,
  PrimaryGeneratedColumn,
  Column,
  ManyToOne,
  OneToMany,
  ValueTransformer,
} from "typeorm"
 
const transformer: Record<"date" | "bigint", ValueTransformer> = {
  date: {
    from: (date: string | null) => date && new Date(parseInt(date, 10)),
    to: (date?: Date) => date?.valueOf().toString(),
  },
  bigint: {
    from: (bigInt: string | null) => bigInt && parseInt(bigInt, 10),
    to: (bigInt?: number) => bigInt?.toString(),
  },
}
 
@Entity({ name: "users" })
export class UserEntity {
  @PrimaryGeneratedColumn("uuid")
  id!: string
 
  @Column({ type: "varchar", nullable: true })
  name!: string | null
 
  @Column({ type: "varchar", nullable: true, unique: true })
  email!: string | null
 
  @Column({ type: "varchar", nullable: true, transformer: transformer.date })
  emailVerified!: string | null
 
  @Column({ type: "varchar", nullable: true })
  image!: string | null
 
+ @Column({ type: "varchar", nullable: true })
+ role!: string | null
 
  @OneToMany(() => SessionEntity, (session) => session.userId)
  sessions!: SessionEntity[]
 
  @OneToMany(() => AccountEntity, (account) => account.userId)
  accounts!: AccountEntity[]
}
 
@Entity({ name: "accounts" })
export class AccountEntity {
  @PrimaryGeneratedColumn("uuid")
  id!: string
 
  @Column({ type: "uuid" })
  userId!: string
 
  @Column()
  type!: string
 
  @Column()
  provider!: string
 
  @Column()
  providerAccountId!: string
 
  @Column({ type: "varchar", nullable: true })
  refresh_token!: string | null
 
  @Column({ type: "varchar", nullable: true })
  access_token!: string | null
 
  @Column({
    nullable: true,
    type: "bigint",
    transformer: transformer.bigint,
  })
  expires_at!: number | null
 
  @Column({ type: "varchar", nullable: true })
  token_type!: string | null
 
  @Column({ type: "varchar", nullable: true })
  scope!: string | null
 
  @Column({ type: "varchar", nullable: true })
  id_token!: string | null
 
  @Column({ type: "varchar", nullable: true })
  session_state!: string | null
 
  @Column({ type: "varchar", nullable: true })
  oauth_token_secret!: string | null
 
  @Column({ type: "varchar", nullable: true })
  oauth_token!: string | null
 
  @ManyToOne(() => UserEntity, (user) => user.accounts, {
    createForeignKeyConstraints: true,
  })
  user!: UserEntity
}
 
@Entity({ name: "sessions" })
export class SessionEntity {
  @PrimaryGeneratedColumn("uuid")
  id!: string
 
  @Column({ unique: true })
  sessionToken!: string
 
  @Column({ type: "uuid" })
  userId!: string
 
  @Column({ transformer: transformer.date })
  expires!: string
 
  @ManyToOne(() => UserEntity, (user) => user.sessions)
  user!: UserEntity
}
 
@Entity({ name: "verification_tokens" })
export class VerificationTokenEntity {
  @PrimaryGeneratedColumn("uuid")
  id!: string
 
  @Column()
  token!: string
 
  @Column()
  identifier!: string
 
  @Column({ transformer: transformer.date })
  expires!: string
}
  1. TypeORMAdapter에 전달하세요:
./auth.ts
import NextAuth from "next-auth"
import { TypeORMAdapter } from "@auth/typeorm-adapter"
import * as entities from "lib/entities"
 
export const { handlers, auth, signIn, signOut } = NextAuth({
  adapter: TypeORMAdapter("yourconnectionstring", { entities }),
})

TypeORM의 synchronize: true 옵션은 엔티티와 정확히 일치하는 SQL을 생성합니다. 이 옵션은 엔티티 모델에서 발견된 변경 사항을 자동으로 적용합니다. 개발 환경에서 유용한 옵션입니다.

⚠️

synchronize: true는 프로덕션 데이터베이스에 대해 활성화하지 마세요. 구성된 스키마가 예상 스키마와 일치하지 않으면 데이터 손실이 발생할 수 있습니다! 프로덕션 데이터베이스는 빌드 시점에 동기화/마이그레이션하는 것을 권장합니다.

네이밍 컨벤션

만약 여러분이 사용하는 데이터베이스 시스템에서 snake_casecamelCase 컬럼 이름이 혼용되는 것이 문제가 된다면, TypeORM의 네이밍 전략 기능을 사용하여 대상 필드 이름을 변경하는 것을 추천합니다. typeorm-naming-strategies라는 패키지가 있는데, 여기에는 snake_case 전략이 포함되어 있습니다. 이 전략은 Auth.js가 기대하는 필드 이름을 실제 데이터베이스에서 snake_case로 변환해 줍니다.

예를 들어, NextAuth 설정에서 연결 객체에 네이밍 컨벤션 옵션을 추가할 수 있습니다.

./auth.ts
import NextAuth from "next-auth"
import { TypeORMAdapter } from "@auth/typeorm-adapter"
import { SnakeNamingStrategy } from "typeorm-naming-strategies"
import { ConnectionOptions } from "typeorm"
 
const connection: ConnectionOptions = {
  type: "mysql",
  host: "localhost",
  port: 3306,
  username: "test",
  password: "test",
  database: "test",
  namingStrategy: new SnakeNamingStrategy(),
}
 
export const { handlers, auth, signIn, signOut } = NextAuth({
  adapter: TypeORMAdapter(connection),
})
Auth.js © Balázs Orbán and Team - 2025