프리즈마 라이브러리를 사용해 Next.js 에서 애플리케이션을 데이터베이스에 연결하는 방법에 대해 알아보자.
데이터베이스 엔진은 MySQL을 사용한다.
npm install prisma
npx prisma
schema.prisma
라는 파일이 포함된다.npx prisma init
.env
라는 환경변수 파일도 생성되는데, 여기에는 환경 변수들을 저장할 수 있게 된다.gitignore
파일에 반드시 포함시켜야 한다.DATABASE_URL="postgresql://johndoe:randompassword@localhost:5432/mydb?schema=public"
schema.prisma
파일에서 provider
를 MySQL로 수정한다.datasource db {
provider = "mysql"
url = env("DATABASE_URL")
}
.env
파일 DATABASE_URL
수정mysql
root
:
다음에는 mysql 설치시 설정했던 root
사용자의 비밀번호를 입력한다.3306
DATABASE_URL="mysql://root:[root비밀번호]@localhost:3306/[데이터베이스이름]"
schema.prisma
파일에 엔터티들을 모델로 정의할 수 있다.사용자 모델을 만들어보자.
@id
)를 적용@default
속성을 사용하여 기본값을 설정할 수 있다.autoincrement()
함수 사용prisma/schema.prisma
model User {
id Int @id @default(autoincrement())
}
model User {
id Int @id @default(autoincrement())
email String @unique
name String
followers Int @default(0)
isActive Boolean @default(true)
}
npx prisma format
# 관계형 데이터베이스
npx prisma migrate dev
# NoSQL 데이터베이스
npx prisma db push
[오류 해결] Access denied for user 'root'@'localhost’
- 이전에 MariaDB를 사용한 적이 있었는데 그 때 설정했던 비밀번호로 접속을 시도하는 것 같았다.
- 이전 비밀번호가 기억이 안나서 터미널에 아래 명령어를 실행하여 mysql에 접속한 후 비밀번호를 재설정해주었다.
- 재설정한 비밀번호로 .env 파일의
DATABASE_URL
도 수정해준다.# mysql 데이터베이스 서버에 접속 sudo mysql -uroot -p # 비밀번호 변경 -- for MySQL ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY '[새로운비밀번호]'; -- for MariaDB ALTER USER 'root'@'localhost' IDENTIFIED VIA mysql_native_password USING PASSWORD('[새로운비밀번호]');
- 마이그레이션 동작 확인
User
모델에 registeredAt
필드 추가 (기본값 현재)schema.prisma
model User {
id Int @id @default(autoincrement())
email String @unique
name String
followers Int @default(0)
isActive Boolean @default(true)
registerdAt DateTime @default(now()) // 추가
}
Add a registeredAt field
라는 이름의 마이그레이션 생성npx prisma migrate dev
prisma.user.findMany
: 사용자 정보 조회prisma.user.create
: 새로운 사용자 생성client.ts
파일을 생성하고 Prisma Client를 설정해보자./prisma/client.ts
import { PrismaClient } from "@prisma/client";
// PrismaClient 의 새 인스턴스를 생성하여 prisma 객체 정의
const prisma = new PrismaClient();
export default prisma;
Error: Too many Prisma Client
를 발생시킬 수 있다.client.ts
수정/prisma/client.ts
import { PrismaClient } from '@prisma/client'
// 싱글톤 패턴을 사용하여 PrismaClient 인스턴스 생성
const prismaClientSingleton = () => {
return new PrismaClient()
}
// PrismaClientSingleton 타입 정의
declare global {
var prisma: undefined | ReturnType<typeof prismaClientSingleton>
}
const prisma = globalThis.prisma ?? prismaClientSingleton()
export default prisma
// 개발환경에서만 글로벌 객체에 PrismaClient 인스턴스 할당
// 개발환경에서 서버가 리로드될 때마다 새로운 PrismaClient 인스턴스가 생성되는 것 방지
if (process.env.NODE_ENV !== 'production') globalThis.prisma = prisma