[TIL] Prisma

dev_vming·2025년 5월 7일
0

TIL

목록 보기
6/6

📚 prisma


📕 prisma 란?

소개

  • Node.js 기반의 ORM(Object-Relational Mapping)도구이다.
  • 데이터베이스와의 상호작용을 단순화하고 개발 생산성을 높이는 데 도움을 주는 도구이다.
  • SQL 쿼리를 직접 작성하는 대신 자바스크립트 코드로 쿼리를 작성할 수 있게 해주며, 타입 세이프한 쿼리 작성을 통해 런타임 에러를 방지해준다.
  • 데이터베이스 스키마 변경을 감지하고 자동으로 마이그레이션을 처리해준다.
  • 복잡한 쿼리 및 데이터베이스 관계를 다루기 위한 강력한 문법을 제공한다.

구성요소

  • Prisma Client : 프리즈마의 Node.js & TypeScript 용 쿼리 작성 클라이언트
  • Prisma Migrate : 프리즈마의 마이그레이션 시스템
  • Prisma Studio : 프리즈마의 데이터를 보고 편집하는 GUI

📗 Prisma 기능

Prisma Client

  • 데이터베이스와 상호작용하기 위한 자바스크립트 코드를 자동으로 생성해준다.
  • 데이터베이스의 스키마를 정의하고 관리한다.
  • 데이터베이스 스키마 변경을 추적하고 적용할 수 있는 마이그레이션 기능을 제공한다.
  • 복잡한 데이터베이스 관계를 정의하고 쿼리 기능을 제공한다.

Prisma 스키마

  • Model : 데이터 베이스의 특정 테이블이나 컬렉션과 대응한다.
  • Field : 모델 내에서 필드는 해당 모델이 가지는 데이터 속성을 나타낸다. 데이터 타입과 제약조건을 지정할 수 있다.
  • Relation : 모델 간의 연결을 나타낸다. 외래 키를 관리하고 연관된 데이터를 쿼리할 수 있다.

📘 Prisma 사용법

초기 셋팅

  • Prisma Schema에 generator를 정의한다.
generator client {
	provider = "prisma-client-js"
}
  • prisma/client 패키지 설치 후 prisma를 생성한다.
yarn add @prisma/client
prisma generator
  • Prisma Client를 인스턴스화해서 사용할 수 있다.
import { PrismaClient } from "@prisma/client"

const prisma = new PrismaClient()

CRUD 문법 예시

  • 데이터를 생성하기 위해서 create API를 사용한다.
const user = await prisma.user.create({
	data: {
		email: "user@prisma.io",
		name : "user",
	},
})
  • prisma로 데이터를 조회하기 위해서는 findMany 또는 findUnique와 같은 메서드를 사용하면 된다.
  • where, orderBy, include, select 등의 옵션으로 쿼리를 조절 할 수 있다.
const users = await prisma.user.findMany({
	where: {
		age: {
			gte: 18
		}
	},
	orderBy: {
		name: "asc"
	},
	include: {
		posts: true
	},
	select: {
		id: true,
		name: true
	}
});
  • 데이터를 수정하기 위해 Update 메서드를 사용한다.
  • 하나만 수정하기 위해서는 Update 메서드를 사용하고, 여러 레코드를 한번에 업데이트 하려면 updateMany 메서드를 사용한다.
const updateUser = await prisma.user.update({
	where: {
		id: 1
	},
	data: {
		name: "Upadated Name"
	}
});
  • 데이터를 삭제하기 위해서는 delete 메서드를 사용한다.
  • 하나만 삭제하기 위해서는 delete 메서드, 여러 레코드 삭제를 위해서는 deleteMany 메서드를 사용한다.
const deleteUser = await prisma.user.delete({
	where: {
		id: 1
	}
});

const deleteUsers = await prisma.user.deleteMany({
	where: {
		email: {
			contains: "prisma.io",
		},
	},
});

마이그레이션

  • 스키마를 DB에 반영하기 위해서는 마이그레이션 명령어를 작성한다.
npx prisma migrate dev
npx prisma migrate dev --name init
  • 마이그레이션 된 파일들은 prisma/migration에 생성. 현재 날짜와 시간, 그리고 —name 문자열 조합의 이름을 가진다.
ㄴprisma
	ㄴschema/prisma
	ㄴmigrations
		ㄴ20250413052907_init
			ㄴmigration.sql
  • 마이그레이션 파일들은 직접 수정하면 안 된다.
  • 항상 prisma migrate 명령어를 통해서만 파일 생성 / 디비 수정을 해야한다.
  • 다음과 같은 파일이 만들어지면, 실제 테이블이 DB에도 만들어지며, 데이터 CRUD가 가능해진다.

📙 prisma 셋팅방법

셋팅 방법

yarn add --dev prisma
npx prisma init

// supabase db url .env 에 설정 이후

yarn add @prisma/client

// 연결 확인
npx prisma studio 

// 스키마 파일 작성 후 마이그레이션 진행

새 프로젝트 시작 (개발 환경)

// 초기 설정
npx prisma init

// schema.prisma 작성 (모델 정의)

// 마이그레이션 생성 및 DB 반영
npx prisma migrate dev --name init

// prisma 클라이언트 생성
npx prisma generate

기존 데이터베이스에서 시작할 때

// 초기 설정
npx prisma init

// 기존 DB에서 모델 불러오기
npx prisma db pull

// prisma 클라이언트 생성
npx prisma generate

📒 prisma data seed

data seed 란?

  • 초기 데이터나 테스트 데이터를 생성하고 채우는 과정이다.
  • 스키마 모델링 이후, 마이그레이션 명령어를 입력하면 된다.
  • package.json 파일에 seed 스크립트 추가한다.
    • yarn add —dev ts-node

      "prisma" : {
      	"seed" : "ts-node --compiler-options
      	{\"module\":\"CommonJS\"} prisma/seed.ts"
      },
  • Prisma 폴더 내에 seed.ts 파일 생성 후 seed 코드를 작성한다.
import { PrismaClient } from "@prisma/client";

const prisma = new PrismaClient();

async function seedData() {
	// seed 코드 작성
}

async function main() {
	await seedData();
}

main()
	.catch((e) => {
		console.log(e);
		process.exit(1);
	})
	.finally(() => {
		prisma.$disconnect();
	});
  • seed 함수 예시
async function seedData() {
	data?.["DATA"]?.map(async (store) => {
		const storeData = {
			phone: store?.tel_no,
			...
		};
		const result = await prisma.store.create({data: storeData});
		console.log(result);
	});
}
  • npx prisma로 데이터 시드를 실행한다.
npx prisma db seed

profile
밍기적 개발하기🐛

0개의 댓글