티스토리 뷰

프리즈마 공식문서

 

Custom model and field names

Learn how you can decouple the naming of Prisma models from database tables to improve the ergonomics of the generated Prisma Client API.

www.prisma.io

prisma 사용 하는 이유

•  prisma는 Javascript 객체(Object)와 데이터베이스의 관계(Relation)을 연결(Mapping) 해주는 도구입니다.

•  Prisma는 ORM(Object Relational Mapping)으로 Javascript의 객체와 데이터베이스의 관계(Relation)를 연결합니다.

•  Prisma의 경우 Model의 형태로 테이블(Table)의 속성을 설정합니다.

•  ORM의 속성값만 변경할 경우 언제든지 자유롭게 DB를 변경할 수 있게 되어 개발할 때 선택의 폭이 넓어집니다.

•  데이터베이스에서 사용하는 DB 또는 Table 속성이 변경되었을 때 빠르게 수정이 가능합니다.

•  Oracle, MariaDB, PostgreSQL와 같은 다양한 데이터베이스를 사용할 수 있습니다.

 

Prisma 라이브러리 설치하기

# yarn 프로젝트를 초기화합니다.
yarn init -y

# express, prisma, @prisma/client 라이브러리를 설치합니다.
yarn add express prisma @prisma/client

# nodemon 라이브러리를 DevDependency로 설치합니다.
yarn add -D nodemon

# 설치한 prisma를 초기화 하여, prisma를 사용할 수 있는 구조를 생성합니다.
npx prisma init
  • prisma - Prisma를 터미널에서 사용할 수 있도록 도구를 설치하는 패키지
  • @prisma/client - Node.js 에서 Prisma를 사용할 수있게 해주는 라이브러
  • nodemon - 개발 코드가 변경되었을 때 자동으로 서버 재시작을 해주는 패키지
더보기

nodemon 라이브러리란?

파일을 저장할 때마다 변경 사항을 감지하고, 자동으로 서버를 재시작해주는 라이브러리

개발 중 변경사항을 즉시 반영하여 개발 효율성을 향상시킬 수 있습니다.

 

nodemon 명령어

nodemon으로 서버를 실행하기

# 형식

nodemon <실행할 JavaScript 파일명>

// 터미널에 입력
nodemon app.js

 

위처럼 터미널에 명령어를 사용하는 것 뿐만아니라,

package.json에 nodemon을 이용하여 서버를 실행하는 스크립트(scripts)를 등록한다면,

매번 명령어를 입력하지 않아도 간편하게 서버를 시작할 수 있습니다.

// package.json

...

"scripts": {
	"dev": "nodemon app.js"
},

 

이후 터미널에서 yarn run dev 명령어를 실행하면, nodemon을 이용하여 서버를 시작할 수있습니다.

 

[Directory Structure]: npx prisma init(구조 생성)

내 프로젝트 폴더 이름
├── prisma
│      └── schema.prisma
├── .env
├── .gitignore
├── package.json
└── yarn.lock


Prisma는 정해진 경로에 있는 파일을 사용하고 저장하기 때문에 임의로 옮기면 오동작 할 가능성이 높아
생성된 폴더나 파일들은 임의로 옮기거나 삭제 x

 

 

 

schema.prisma

schema.prisma 파일은 Prisma가 사용할 데이터베이스의 설정 정보를 정의하기 위해 사용하는 파일입니다.

Prisma를 가장 처음 초기화 하였을 때,

schema.prisma 파일을 확인한다면, 아래의 datasource, generator 가 작성되어 있는 것을 확인할 수 있습니다.

더보기

datasource

  - 데이터베이스에 대한 정의를 하기 위해 사용됩니다.

  - Prisma가 어떤 데이터베이스 엔진을 사용할 것인지,

    데이터베이스의 위치(URL)는 어디인지 등의 정보를 정의하는데 사용됩니다.

 

generator 

  - Prisma 클라이언트를 생성하는 방식을 설정하는 구문입니다.

 

Prisma datasource

datasource는 Prisma가 데이터베이스를 연결할 수 있도록 설정하고, 관리하는 데 필요한 정보를 설정하는 구문입니다.

Prisma는 연결하려는 데이터베이스의 속성을 schema.prisma 파일에서 관리하고 있습니다.

여기서 datasource 프로퍼티에 정의된 속성들을 수정하여 

사용자 아이디, 비밀번호, 엔드 포인트 등 다양한 설정값을 입력해주어야합니다.

 

DATABASE_URL 설정

데이터베이스 URL은 Prisma가 어떤 데이터베이스와 어떻게 연결할지를 알려주는 중요한 정보입니다.

URL 내부에는 데이터베이스 엔진 유형, 사용자 아이디, 패스워드와 같은 정보가 포함됩니다.

더보기
  • Protocol
    • Prisma가 사용할 데이터베이스 엔진을 나타냅니다.
    • postgresql, sqllite, mysql과 같은 데이터베이스 엔진을 정의합니다.
  • Base URL
    • 데이터베이스의 엔드 포인트아이디, 패스워드, 포트 번호를 나타냅니다.
    • <Id>:<Password>@<RDS Endpoint>:<Port>의 형태로 구성됩니다.
  • Path
    • MySQL에서 사용할 데이터베이스 이름을 설정하는 구성 요소입니다.
  • Arguments
    • Prisma에서 데이터베이스 연결을 설정하는데 필요한 추가 옵션을 나타냅니다.
    • 데이터베이스와 연결할 수 있는 최대 커넥션 갯수, 타임아웃 시간 등이 있습니다.

 

Prisma model

Prisma의 model 구문은 특정 Table과 Column의 속성값을 입력하여,

데이터베이스와 Express 프로젝트를 연결 (Mapping)시켜줍니다.

  • model 구문은 Prisma를 사용할 때 가장 많이 작성하게 될 구문이며, Prisma가 사용할 데이터베이스의 테이블 구조를 정의하기 위해 사용
  • schema.prisma 파일은 model에 작성된 정보를 바탕으로 Prisma Client를 통해 JavaScript에서 MySQL의 테이블을 조작
  • model 구문은 Javascript에서 MySQL의 테이블을 사용하기 위한 다리 역할을 수행하며, MySQL과 실제 연결되어 사용

테이블 예시

// 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")
}
데코레이터 역할
@id 해당 필드를 해당 모델의 기본 키(Primary Key)로 지정합니다.
@default( autoincrement()) 자동으로 증가하는 값으로 초기화 되도록 합니다.
@map("field name") 데이터 베이스에서 해당 필드의 이름을 지정된 값으로 매핑합니다.
@unique 해당 필드가 고유한 값을 가져야 한다는 것을 나타냅니다.
@db.text 데이터베이스에 해당 필드를 텍스트 형식으로 저장하도록 지정합니다.
@updatedAt 업데이트가 발생 할 때마다 자동으로 갱신되도록 합니다.
@@map("") 데이터베이스에서 이 모델을 해당 이름으로 매핑합니다. 
더보기
  • 데이터 유형은 각 필드의 데이터를 어떤 형식으로 저장할 것인지 결정하게됩니다.
  • Prisma에서는 다양한 데이터 유형을 지원하는데, 위 예시에서는 Int, String, DateTime 등의 데이터 유형이 사용되었습니다.
  • 데이터 유형 뒤에 ?가 붙게 된다면, NULL을 허용하는 컬럼이 됩니다.
  • SQL 에서 사용하는 것과 동일하게, UNIQUE 제약 조건과 AUTO_INCREMENT 제약조건을 사용할 수 있습니다.
  • @@map("Products")는 Products 테이블을 MySQL에서도 Products란 이름으로 사용하겠다는 뜻입니다.
    • → @@map() 을 작성하지 않으면, 테이블명의 대문자는 전부 소문자로 치환됩니다

 

위에 정의한 구문을 row query로 확인해 보면

-- CreateTable
CREATE TABLE `Products` (
    `productId` INTEGER NOT NULL AUTO_INCREMENT,
    `productName` VARCHAR(191) NOT NULL,
    `price` INTEGER NOT NULL DEFAULT 1000,
    `info` TEXT NULL,
    `createdAt` DATETIME(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3),
    `updatedAt` DATETIME(3) NOT NULL,

    UNIQUE INDEX `Products_productName_key`(`productName`),
    PRIMARY KEY (`productId`)
) DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;

위와 같은 형식으로 되어있는걸 확인 할 수 있습니다.

 

Prisma DB, Table 생성하기

schema.prisma 파일에 있는 설정을 수정 한뒤 model로서 정의해 뒀던 테이블들을 업로드 합니다.

# schema.prisma 파일에 설정된 모델을 바탕으로 MySQL에 정보를 업로드합니다.
npx prisma db push

새로고침한뒤 확인해보면 생성이 확인 됩니다.

 

Prisma CLI 명령어

Prisma CLI 명령어 역할
npx prisma db push • schema.prisma 파일에 정의된 설정값을 실제 데이터베이스에 반영(push)합니다.
• 내부적으로 prisma generate가 실행됩니다.
• 데이터베이스 구조를 변경하거나 새로운 테이블을 생성할 수 있습니다.
npx prisma init •  Prisma를 사용하기 위한 초기 설정을 생성합니다.
•  명령어를 실행하면 schema.prisma 파일과 같은 필요한 설정 파일들이 생성됩니다.
npx prisma generate •  Prisma Client를 생성하거나 업데이트 합니다.
•  대표적으로, schema.prisma 파일에 변경 사항이 생겼거나,
   데이터베이스 구조가 변경되었을 때,
   이 명령어를 사용해 Prisma Client를 최신 상태로 유지할 수 있습니다.
npx prisma db pull •  현재 연결된 데이터베이스의 구조를 prisma.schema 파일로 가져옵니다.(pull)
•  데이터베이스에서 구조 변경이 발생했을 때,
    이 명령어를 사용하면 Prisma Schema를 최신 상태로 유지할 수 있습니다.

•  prisma generate 명령어를 사용해 변경 사항을 Prisma Client에 반영할 수 있습니다

 

 

Prisma Method

메소드 형식 설명
create
CREATE
const user = await prisma.user.create({
    data: {
         email: 'elsa@prisma.io',
         name: 'Elsa Prisma',
     },
})
새로운 레코드를 생성합니다.
createMany const createMany = await prisma.user.createMany({
     data: [
         { name: 'Bob', email: 'bob@prisma.io' },
         { name: 'Bobo', email: 'bob@prisma.io' },
         { name: 'Yewande', email: 'yewande@prisma.io' },
         { name: 'Angelique', email: 'angelique@prisma.io' },
    ],
skipDuplicates: true,
})
여러 사용자를 생성하고 중복 항목을 건너뜁니다
일반적으로 INSERT문보다 효율적입니다.
read
findUnique
// By unique identifier
const user = await prisma.user.findUnique({
       where: {
              email: 'elsa@prisma.io',
       },
}) 

// By ID
const user = await prisma.user.findUnique({
       where: {
              id: 99,
       },
})

주어진 고유 식별자별로 데이터베이스에서
단일 레코드를 검색합니다.

findMany const users = await prisma.user.findMany({
        where: {
               age : {
                   gte : 18
               }
        }
})
주어진 조건에 맞는 모든 레코드를 반환합니다.
findFirst const findUser = await prisma.user.findFirst({
        where: {
               posts: {
                    some: {
                          likes: {
                              gt: 100,
                          },
                    },
               },
        },
   orderBy: { id: 'desc', },
})
특정 기준에 일치하는 첫번째 레코드 가져오기

(좋아요가 100개가 넘는 게시물이
 하나이상 있는 가장 최근에 생성된
 사용자를 반환합니다 .)
update
update
const updateUser = await prisma.user.update({
       where: {
              email: 'viola@prisma.io',
       },
       data: {
           name: 'Viola the Magnificent',
       },
})
단일레코드를 찾고 데이터를 업데이트 합니다.
delete
delete
const deleteUser = await prisma.user.delete({
      where: {
            email: 'bert@prisma.io',
      },
})
조건에 맞는 레코드를 삭제합니다.

이정도가 대표적이고 더 많은 메서드 들은 공식사이트 에서 보시면 됩니다.

 

 

'프로그래밍 기초 > database' 카테고리의 다른 글

공간 데이터란?  (0) 2024.04.16
트랜잭션이란?  (0) 2024.02.19
SQL Injection이란?  (1) 2024.02.08
1:1관계, 1:N관계, N:M관계  (1) 2024.02.06
데이터 무결성 제약 조건  (0) 2024.02.05
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
«   2024/11   »
1 2
3 4 5 6 7 8 9
10 11 12 13 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28 29 30
글 보관함