오늘은 ORM 중 하나인 prisma에 대해 배웠다.
<라이브러리 설치 방법&순서>
(yarn init 및 express 등 다른 필요한 패키지는 설치되었다는 전제 하에)
express, prisma, @prisma/client 라이브러리를 설치
$yarn add prisma @prisma/client
설치한 prisma를 초기화 하여, prisma를 사용할 수 있는 구조를 생성
(prisma 폴더 안에 prisma.schema파일, root 폴더에 .env 파일 및 .gitignore 파일이 생성됨)
$npx prisma init
각 파일에 들어가는 내용
datasource db {
// MySQL 데이터베이스 엔진을 사용
provider = "mysql"
// 데이터베이스 연결 정보를 .env 파일의 DATABASE_URL 로부터 읽어옴
url = env("DATABASE_URL")
}
-> 아래는 .env 파일에 데이터베이스 연결 URL 예시
mysql 데이터베이스를 사용
사용자 아이디는 johndoe,
패스워드는 randompassword,
포트번호는 localhost:5432,
db 이름은 mydb,
옵션 schema=public 인것
# .env
DATABASE_URL="mysql://johndoe:randompassword@localhost:5432/mydb?schema=public"
generator
모델 작성 예시, 문법 내용
// schema.prisma
model Products {
productId Int @id @default(autoincrement()) @map("productId")
productName String @unique @map("productName")
price Int @default(1000) @map("price")
info String? @map("info") @db.Text
createdAt DateTime @default(now()) @map("createdAt")
updatedAt DateTime @updatedAt @map("updatedAt")
@@map("Products")
}
- 데이터 유형 뒤에 ?가 붙게 된다면, 해당 컬럼이 NULL을 허용한다는 뜻
- SQL 에서 사용하는 것과 동일하게, UNIQUE 제약 조건과 AUTO_INCREMENT 제약조건을 사용할 수 있다
- @@map("Products")는 Products 테이블을 MySQL에서도 Products란 이름으로 사용하겠다는 뜻 (앞글자 대문자로 사용하기 위함)
- @db.Text : String 으로 지정한 경우 text 형태로 데이터를 넣고 싶을때 사용
prisma.schema
파일로 가져옴.(pull)prisma generate
명령어를 사용해 변경 사항을 Prisma Client에 반영할 수 있다.각 기능별 라우터에 각각 prisma 연결을 하게 되면 리소스가 과도하게 사용되며, 그로인해 어플리케이션의 성능이 저하될 수 있다. -> utils 폴더를 만들고 그 안에 prisma 폴더 생성 후 index.js 같은 파일을 구현하여, 하나의 파일에서 데이터베이스 커넥션을 관리하여 최초로 1번만 MySQL과 커넥션을 생성하도록 코드를 구현하면 됨.
// utils/prisma/index.js
import { PrismaClient } from '@prisma/client';
export const prisma = new PrismaClient({
// Prisma를 이용해 데이터베이스를 접근할 때, SQL을 출력
log: ['query', 'info', 'warn', 'error'],
// 에러 메시지를 평문이 아닌, 개발자가 읽기 쉬운 형태로 출력
errorFormat: 'pretty',
}); // PrismaClient 인스턴스를 생성합니다.
그 후 아래와 같은 형식으로 사용할 라우터에 등록
// routes/posts.router.js
import { prisma } from '../utils/prisma/index.js';