티스토리 뷰
프리즈마 공식문서
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 |