<Nestjs> nestjs 에서 prisma 사용하기 / Sequelize, TypeORM 대신 / npx prisma
Prisma!!!
Sequelize, TypeORM 말고 왜 나는 prisma를 썼냐?
답은 간단하다 테이블 생성하는게 진짜진짜 간단해보인다.... 그래서 예시를 보자마자 바로 이걸 쓰겠다고 마음먹었다ㅋㅋㅋ
(하지만 블로그글은 typeorm이 훨씬 더 많았다ㅎㅎ 대신 우리에겐 Doc가 있다..!!!)
예전에 처음 Sequelize를 사용했을때 직접 쿼리문을 작성하지 않고도 원하는 대로 테이블을 생성해주는 것에 진짜 너무 기뻤는데 훨씬 사용하기 편해보이는 라이브러리라니...!!! 너무 좋아!!!
여기까지가 선택한 이유이고 실제로 어떻게 사용하는지 작성해 보겠다.
1. prisma 설치, 내가 쓰는 RDBMS에 맞게 기본 설정하기
$ npm install prisma --save-dev // 설치
$ npx prisma init // 기본디렉토리 생성
$ npm install @prisma/client // javascript와 prisma가 db에서 작업할 수 있도록 쿼리 빌드를 해준다
이 명령어를 실행하고 나면 요렇게 생성해준다
prisma 폴더와 기본 설정할 파일 그리고 .env까지!
만들어진걸 확인했다면
내가 사용하는 db에 맞게 src/prisma/schema.prisma 파일을 수정해준다.
<태초의... schema.prisma 파일>
// This is your Prisma schema file,
// learn more about it in the docs: https://pris.ly/d/prisma-schema
generator client {
provider = "prisma-client-js"
}
datasource db {
provider = "postgresql"
url = env("DATABASE_URL")
}
예시이자 내가 한 설정은
나는 mysql을 사용했기 때문에 이렇게 수정했다.
<schema.prisma 수정 후>
generator client {
provider = "prisma-client-js"
}
datasource db {
provider = "mysql"
url = env("DATABASE_URL")
}
2. prisma.service.ts 파일 만들기
그 다음 공식 Doc에도 나와있지만 src의 최상단에 prisma.service.ts파일을 만들어 줘야한다.
방법은 쉽다ㅋㅋㅋ 파일명을 똑같이 만들고 그냥 복붙하면 된다.
<prisma.service.ts>
import { INestApplication, Injectable, OnModuleInit } from '@nestjs/common';
import { PrismaClient } from '@prisma/client';
@Injectable()
export class PrismaService extends PrismaClient implements OnModuleInit {
async onModuleInit() {
await this.$connect();
}
async enableShutdownHooks(app: INestApplication) {
this.$on('beforeExit', async () => {
await app.close();
});
}
}
이건 따로 수정할 필요없다.
3. .env 수정하기
자 이제 마지막으로 설정해줄게 남았다. 아까 명령어를 통해 생성한 .env를 열어보면
# Environment variables declared in this file are automatically made available to Prisma.
# See the documentation for more detail: https://pris.ly/d/prisma-schema#accessing-environment-variables-from-the-schema
# Prisma supports the native connection string format for PostgreSQL, MySQL, SQLite, SQL Server, MongoDB and CockroachDB.
# See the documentation for all the connection string options: https://pris.ly/d/connection-strings
DATABASE_URL="postgresql://johndoe:randompassword@localhost:5432/mydb?schema=public"
요렇게 있을 것이다. 이것도 내가 사용하는 환경에 맞게 수정해줘야 한다.
DATABASE_URL="내가 사용하는 DBMS 이름://내가 db에 접속할때 사용하는 사용자명:해당 사용자의 비밀번호@localhost:삭제해도 무방/연동시킬 스키마명?schema=public"
이렇게 맞춰서 적어주면된다. 나중에 배포할때 이 부분도 수정해야 하니 기억해두자
4. schema.prisma 작성하기
3번까지 다 설정해줬다면 이제 테이블을 생성해주면 된다.
예시로 간단하게 user 테이블을 만들어보겠다.
<schema.prisma 파일>
generator client {
provider = "prisma-client-js"
}
datasource db {
provider = "mysql"
url = env("DATABASE_URL")
}
model User{
user_no Int @default(autoincrement()) @id
user_email String @unique @db.Char(30)
user_pwd String
user_nickname String @db.Char(12)
user_grade Int @default(1)
}
< 데이터 제한해주기 >
@default(autoincrement()) @id // 인덱스로 사용하기 위해 autoincrease로 준 id
@unique // 중복 되는 값이 없도록 제한하기
@db.Char(12) // 글자수 제한
Int @default(1) // 입력값을 따로 지정해주지 않으면 무조건 int형 1로 입력된다
* db에 내가 연결을 원하는 스키마를 먼저 생성해주고 다음 명령어를 실행한다
npx prisma migrate dev // 테이블 생성
그럼 원하는대로 테이블을 생성해준걸 확인 할 수 있다.
+) 만약 테이블을 수정할 일이 있다면
npx prisma migrate reset
npx prisma migrate dev
리셋을 해주고 다시 마이그레이트 해주면 된다.
명령어를 실행하면 진짜 지울거냐 빨간 글씨로 물어보는데 y 를 눌러주면 된다. 설사 날리더라도
다시 마이그레이트 해주면되니까!