728x90
728x90
프리즈마(Prisma)
들어가며
- ORM(Object-Relational Mapping) 도구 중 하나인 프리즈마(Prisma)에 대해 정리해본다.
프리즈마(Prisma)
개념
- ORM(Object-Relational Mapping) 도구
- 데이터베이스와 애플리케이션 간의 인터페이스를 간편하게 만들어주는 개발 도구
- 주로 Node.js와 TypeScript 환경에서 사용된다.
- SQL 쿼리를 직접 작성할 필요 없이 안전한 타입의 코드를 통해 데이터베이스와 상호작용할 수 있도록 도와준다.
ORM(Object-Relational Mapping)
- 객체 지향 프로그래밍 언어에서 사용하는 객체(Object)와 관계형 데이터베이스(Relational Database)의 테이블 간의 매핑을 자동화하는 기술
- 데이터베이스의 데이터를 SQL이 아닌, 프로그래밍 언어의 객체(Object)를 통해 조작할 수 있도록 해준다.
- 대표적으로 다음과 같은 도구들이 있다.
- JavaScript / TypeScript : Prisma, Sequelize, TypeORM
- Python : SQLAlchemy, Django ORM
- Java : Hibernate
- PHP : Eloquent (Laravel)
- 장점
- SQL을 직접 작성하지 않아도 되므로 개발 속도가 빨라진다.
- 객체 지향 언어의 코드와 데이터베이스의 스키마가 잘 연동되기 때문에 코드 변경 시 유지보수가 쉽다.
- 객체와 데이터베이스 간의 타입을 맞춰주므로, 데이터 타입 오류를 미리 방지할 수 있다.
- ORM을 사용하면 코드가 특정 데이터베이스에 종속되지 않고 데이터베이스를 교체하더라도 큰 코드 수정 없이 동작할 수 있다.
- 단점
- 복잡한 쿼리를 자동으로 생성하면서 성능이 저하될 수 있다.
- ORM 도구를 처음 사용하는 데 시간이 걸릴 수 있다.
- 매우 복잡한 쿼리에서는 SQL이 더 효율적일 수 있다.
ORM은 코드와 데이터베이스 간의 매핑을 효율화하여 개발 속도를 높이고 오류를 줄여주며, 유지보수를 쉽게 만들어준다. 특히 팀 개발 환경에서 데이터베이스 작업을 일관되게 처리할 수 있어 유용하다.
예제 코드
const { PrismaClient } = require('@prisma/client');
const prisma = new PrismaClient();
async function createUser() {
const user = await prisma.user.create({
data: {
name: 'Alice',
email: 'alice@example.com',
},
});
console.log(user);
}
createUser();
설치하기
패키지 설치하기
- 아래의 명령을 실행하여 프리즈마를 설치한다.
- @--save-dev@ 옵션은 해당 패키지를 개발 의존성(devDependency)으로 설치하게 해준다.
- 이 패키지는 개발 중에만 필요하고, 배포 시에는 사용되지 않는다.
- 실제 배포 환경에서는 Prisma 클라이언트만 필요하다.
$ npm install prisma --save-dev
$ npm install @prisma/client
- 아래 명령을 실행하여 프리즈마를 초기화해준다.
$ npx prisma init
⇒ 프로젝트에 @.env@ 파일과 @/migrations/schema.prisma@ 파일이 생성된다.
VS Code 확장 설치하기
- @Prisma@ 확장을 검색하여 설치한다.
데이터베이스 스키마 설정하기
/prisma/schema.prisma
- 데이터베이스 모델을 정의한다.
datasource db {
provider = "postgresql"
url = env("DATABASE_URL")
directUrl = env("DIRECT_URL")
}
generator client {
provider = "prisma-client-js"
}
model User {
id Int @id @default(uuid())
name String
}
/.env
- @DATABASE_URL@은 Transaction + Password + @"?pgbouncer=true@connection_limit=1"@로 지정해준다.
- @DIRECT_URL@은 Session + Password와 같이 지정해준다.
DATABASE_URL=""
DIRECT_URL=""
사용 예 : Supabase
- @Mode: Transaction@의 Connection 주소를 복사해서, @.env@ 파일의 @DATABASE_URL@의 값으로 넣어준다.
- @[YOUR-PASSWORD]@ 부분에는 Supbase에서 프로젝트를 생성할 때 지정했던 비밀번호를 넣어준다.
- @Mode: Session@의 Connect 주소를 복사해서 @,env@ 파일의 @DIRECT_URL@의 값으로 넣어준다.
마이그레이션 실행하기
- 아래 명령을 실행하여 마이그레이션을 실행한다.
$ npx prisma migrate dev --name init
- 아래 명령을 실행하여 @schema.prisma@ 파일의 스키마를 데이터베이스에 적용한다.
$ npx prisma db push
@schema.prisma@ 파일에 새로운 모델을 정의할 경우, @npx prisma db push@ 명령을 실행해야 업데이트된 내용이 반영된다.
Prisma Studio 실행하기
Prisma Studio
- 웹 인터페이스를 제공하며, 코드 없이 데이터베이스를 관리할 수 있게 해주는 도구이다.
- 데이터베이스에 있는 테이블의 데이터를 확인하고 CRUD 작업(생성, 읽기, 수정, 삭제)을 직관적으로 수행할 수 있다.
- 로컬 개발 환경에서 편리하게 데이터의 상태를 확인하거나, 직접 데이터 조작을 할 수 있다.
실행하기
- 아래 명령을 실행하여 Prisma Studio을 실행할 수 있다.
$ npx prisma studio
CRUD 연산해보기
레코드 1개 생성하기 (CREATE)
const task = await prisma.task.create({
data: {
content: 'some task',
},
});
모든 레코드 가져오기 (READ)
const tasks = await prisma.task.findMany();
특정 레코드 가져오기 (READ)
- 고유 식별자(Unique Identifier) 또는 ID를 이용하여 특정 레코드를 가져올 수 있다.
// By unique identifier
const user = await prisma.user.findUnique({
where: {
email: 'elsa@prisma.io',
},
});
// By ID
const task = await prisma.task.findUnique({
where: {
id: id,
},
});
레코드 업데이트하기 (UPDATE)
const updateTask = await prisma.task.update({
where: {
id: id,
},
data: {
content: 'updated task',
},
});
레코드 업데이트 또는 생성하기 (CREATE / UPDATE)
const upsertTask = await prisma.task.upsert({
where: {
id: id,
},
update: {
content: 'some value',
},
create: {
content: 'some value',
},
});
레코드 삭제하기 (DELETE)
const deleteTask = await prisma.task.delete({
where: {
id: id,
},
});
참고 사이트
728x90
728x90
'DevOps > Service' 카테고리의 다른 글
[Service] Contentful (1) | 2024.11.28 |
---|---|
[Service] Auth0 (2) | 2024.11.20 |
[Service] Render (0) | 2024.11.06 |
[Service] Mockaroo (2) | 2024.11.06 |
[Service] Supabase (1) | 2024.10.21 |