[TIL_2023.11.29] prisma 셋팅&사용법(yarn 사용)

김효진·2023년 11월 29일
1
post-custom-banner

오늘은 ORM 중 하나인 prisma에 대해 배웠다.

<라이브러리 설치 방법&순서>
(yarn init 및 express 등 다른 필요한 패키지는 설치되었다는 전제 하에)

  1. express, prisma, @prisma/client 라이브러리를 설치
    $yarn add prisma @prisma/client

  2. 설치한 prisma를 초기화 하여, prisma를 사용할 수 있는 구조를 생성
    (prisma 폴더 안에 prisma.schema파일, root 폴더에 .env 파일 및 .gitignore 파일이 생성됨)
    $npx prisma init

  3. 각 파일에 들어가는 내용

  • schema.prisma : Prisma가 사용할 데이터베이스의 설정 정보를 정의하기 위해 사용하는 파일
  • datasource
    • 데이터베이스에 대한 정의를 하기 위해 사용
    • Prisma가 어떤 데이터베이스 엔진을 사용할 것인지, 데이터베이스의 위치(URL)는 어디인지 등의 정보를 정의하는데 사용
    • 설정
  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

    • Prisma 클라이언트를 생성하는 방식을 설정하는 구문
  • 모델 작성 예시, 문법 내용

// 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 형태로 데이터를 넣고 싶을때 사용
  1. 모델 작성 완료 후 DB,Table 생성
    $npx prisma db push
  • 번외로 이런 명령도 있다.
    `[prisma db pull]'
    • 현재 연결된 데이터베이스의 구조를 prisma.schema 파일로 가져옴.(pull)
    • 데이터베이스에서 구조 변경이 발생했을 때, 이 명령어를 사용하면 Prisma Schema를 최신 상태로 유지할 수 있다
    • 이후 prisma generate 명령어를 사용해 변경 사항을 Prisma Client에 반영할 수 있다.
  1. prisma의 메서드
  • 조회 관련: findMany(), findFirst(), findUnique()
  • 작성 관련: create()
  • 수정 관련: update()
  • 삭제 관련: delete()
  1. 각 기능별 라우터에 각각 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';
profile
더 많은 사람들이 더 좋은 정보와 서비스를 누릴 수 있게!!
post-custom-banner

0개의 댓글