차세대 Node.js 및 TypeScript ORM(Object Relational Mapping)
Prisma는 앱 개발자가 PostgreSQL, MySQL, SQL Server, SQLite 및 MongoDB(현재 프리뷰)용 오픈 소스 데이터베이스 도구를 사용하여 더 빠르게 빌드하고 오류를 줄이는 데 도움이 됩니다.
- Node.js and Typescript ORM(Object Relational Mapping)
- => JS or TS 와 데이터베이스 사이에 다리를 놓아줌 (기본적으로 번역기의 역할을 한다고 생각하면 됨)
- Prisma를 사용하기 위해서는 먼저 Prisma에게 DB가 어떻게 생겼는지, 데이터의 모양을 설명해줘야 함 => schema.prisma
- Prisma가 이런 타입에 관한 정보를 알고 있으면 client를 생성해줄 수 있음. client를 이용하면 TS로 DB와 직접 상호작용 가능, 자동완성 제공.
- Prisma Studio : Visual Database Browser, DB를 위한 관리자 패널같은 것.
Prisma
Prisma is an ORM that helps app developers build faster and make fewer errors. Combined with its Data Platform developers gain reliability and visibility when working with databases.
www.prisma.io
setup
1. 설치
npm install prisma
or
yarn add prisma
2. npx prisma init
- 이 명령을 실행하면 schema.prisma라는 파일과 프로젝트 루트에 .env 파일을 포함하는 prisma라는 새 디렉토리를 생성한다.
- schema.prisma는 데이터베이스 연결과 Prisma Client 생성기가 있는 Prisma 스키마를 포함합니다.
- .env는 환경 변수를 정의하기 위한 dotenv 파일입니다. (데이터베이스 연결에 사용됨)
3. prisma 설정
- 생성된 .env 파일에 제대로된 DATABASE_URL을 작성한다.
- schema.prisma 파일에서 datasource의 provider를 설정한다. provider는 사용할 데이터베이스이다.
- 데이터베이스에서 사용할 model을 만든다.
//schema.prisma
generator client {
provider = "prisma-client-js"
}
datasource db {
provider = "mysql"
url = env("DATABASE_URL")
}
model User {
id Int @id @default(autoincrement())
phone Int? @unique
email String? @unique
name String
avatar String?
createdAt DateTime @default(now())
updatedAt DateTime @updatedAt
}
설명
? : 필수적인 필드가 아닌 옵셔널한 필드인 경우 ?를 붙여준다.
@unique : 중복된 값이 들어가면 안된다는 표시 (유일한 값이여야 한다.)
@autoincrement : 기본 DB 내에 정수 형태의 시퀀스를 만들고 시퀀스에 따라 생성된 레코드의 ID 값에 증가된 값을 할당한다. (자동으로 증가는 필드를 설정할 때 사용)
@id : 모델에 단일 필드 id를 지정한다. (모델의 id라는 걸 알려주는 역할을 하는 유니크 식별자)
@updateAt : 레코드가 마지막으로 업데이트된 시간을 자동으로 저장한다. 시간을 직접 지정하지 않으면 Prisma Client는 이 속성이 있는 필드의 값을 자동으로 설정한다.
실행
npx prisma db push 를 통해 Prisma client 생성
db push
db push는 Prisma Migrate와 동일한 엔진을 사용하여 Prisma 스키마를 데이터베이스 스키마와 동기화하며 스키마 프로토타이핑에 가장 적합합니다.
Prisma Client and schema preview features
- Prisma Client 및 Prisma 스키마에 대해 Preview feature 플래그를 사용할 수 있습니다.
Referential integrity (참조 무결성)
(어떤 다른 모델을 참조하는 경우 해당 모델이 반드시 존재해야 함)
참조 무결성은 모든 참조가 유효함을 나타내는 데이터 세트의 속성입니다. 참조 무결성을 위해서는 한 레코드가 다른 레코드를 참조하는 경우 반드시 해당 참조하는 레코드가 존재해야 한다.
예를 들어 Post 모델이 user필드를 정의하는 경우 User(모델)도 반드시 존재해야 합니다.
참조 무결성은 참조를 손상시키는 변경을 방지하는 제약 조건과 레코드를 업데이트하거나 삭제할 때 실행되는 참조 작업을 정의함으로써 적용됩니다.
datasource에서 referential integrity 설정
referential integrity(참조 무결성)은 현재 previewFeatures입니다. 이를 활성화하려면 schema.prisma의 generator 블록에 있는 previewFeatures 목록에 추가합니다.
//schema.prisma
generator client {
provider = "prisma-client-js"
previewFeatures = ["referentialIntegrity"]
}
datasource db {
provider = "mysql"
url = env("DATABASE_URL")
referentialIntegrity = "prisma"
}
model User {
id Int @id @default(autoincrement())
phone Int? @unique
email String? @unique
name String
avatar String?
createdAt DateTime @default(now())
updatedAt DateTime @updatedAt
}
Prisma Client
TypeScript 및 Node.js용 직관적인 데이터베이스 클라이언트
Prisma Client는 생각하는 방식으로 구성하고 앱에 맞춤화된 유형으로 Prisma 스키마에서 자동 생성되는 쿼리 빌더입니다.
Prisma Client는 브라우저에서 실행할 수 없다. (프론트 영역에서 사용하면 안 된다.)
- 프론트 영역에서 import해서 사용하면 컴포넌트가 렌더링되면서 js파일이 다운로드 되고 그렇다면 사용자가 Prisma Client에 직접적으로 접근할 수 있기 때문에 보안적으로 큰 문제가 생긴다.
- 서버에서 실행한다.
- nextjs에서는 pages 경로에 api 폴더를 생성함으로써 api서버가 생성됨
- connection 핸들러 함수를 export defualt해주면 됨
# 설치
npm install @prisma/client
npx prisma generate : client 생성(type이 생성됨, node_module에서 확인 가능)
// client.ts
import { PrismaClient } from '@prisma/client'
const prisma = new PrismaClient()
Prisma Studio
npx prisma studio
데이터베이스 관리자 패널을 볼 수 있다.
프리즈마 스튜디오가 프로젝트에 있는 schema.prisma 파일을 읽어서 파일에 있는 모델을 관리할 수 있는 패널을 준비해준다.