GitHub

Prisma, 차세대 ORM을 시작해보자!

hojun lee · 08/22/2023
커버이미지

프리즈마는 서버사이드 라이브러리인데, 개발자가 데이터베이스에 접근해 데이터를 읽고 쓸때, 직관적이고 효율적이고 안전한 방법을 제공한다.

Prisma is a server-side library that helps developers read and write data to the database in an intuitive, efficient and safe way. - from prisma

🫡목표

  • ORM 알아보기
  • postgreSQL기반 storage와 prisma 연결하기
    1. vercel storage ( 새로 론칭함 )
    2. supbase sotrage ( 무료 제공함 )
  • svelteKIT에서 db에 직접 접속해본다.

😈 next-generation!

https://www.prisma.io/ Prisma를 아십니까? Next-generation ORM for Node.js & typescript 다음 세대의 Object Relational Mapping 물론, 이전 세대 ORM도 써보지 않았다.

why using prisma I really think that Prisma has a nice level of abstraction in regards to the queres and stuff you do related to my database

  1. simple
  2. easy
  3. type safety
  4. simple migration

그럼 다음 세대의 ORM Prisma를 직접 써보자!

svelteKIT + prisma 연결

prisma는 이전에 말했 듯 server-side library이다. 따라서 javascript에 이용하려면 node.js를 써야 한다. 하지만 svelteKit 또는 next.js를 이용하면 server를 이용할 수 있다. 위 두 개의 프레임워크는 full-stack 이기 때문에 서버 기능도 제공한다.

나는 svelteKIT을 사용하겠다!

svelteKIT 설치

https://kit.svelte.dev/docs/creating-a-project

npm create svelte@latest [프로젝트명]
cd [프로젝트명]
npm install
npm run dev

sveltekit 설치

이러면 뚝딱!

cli 에서 prisma 설치

npm install prisma --save-dev

프리즈마 디펜던시 설치

Finally, set up Prisma with the init command of the Prisma CLI:

for postgreSQL default 기본값! npx prisma init

This creates a new prisma directory with your Prisma schema file and configures SQLite as your database. You're now ready to model your data and create your database with some tables.

prisma init

prisma의 기본 세팅 init을 해줘야 하는데 postgreSQL기반 오픈소스를 사용할 것이라면 npx prisma init을 쓰면 된다. mysql이나 sqlite를 쓸거면 다른 옵션이 추가 되어야 함!

prisma db 연결

프리즈마 폴더 생성

이런 폴더가 생겼다. .env에 데이터베이스 정보만 넣어주면 쉽게 연결 된다. 다음과 같은 안내사항을 준다.

Next steps:
1. Set the DATABASE_URL in the .env file to point to your existing database. If your database has no tables yet, read https://pris.ly/d/getting-started
2. Set the provider of the datasource block in schema.prisma to match your database: postgresql, mysql, sqlite, sqlserver, mongodb or cockroachdb.
3. Run prisma db pull to turn your database schema into a Prisma schema.
4. Run prisma generate to generate the Prisma Client. You can then start querying your database.

More information in our documentation:
https://pris.ly/d/getting-started

🫶🏾 supabase가 제공하는 postgre database 연결

next step 1을 참고하면 .env에 DATABASE_URL 의 정보를 넣어주면 쉽게 연결할 수 있다.


//default 값

# Environment variables declared in this file are automatically made available to Prisma.
# See the documentation for more detail: https://pris.ly/d/prisma-schema#accessing-environment-variables-from-the-schema

# Prisma supports the native connection string format for PostgreSQL, MySQL, SQLite, SQL Server, MongoDB and CockroachDB.
# See the documentation for all the connection string options: https://pris.ly/d/connection-strings

DATABASE_URL="postgresql://johndoe:randompassword@localhost:5432/mydb?schema=public"

supabase에서 비슷한 것을 찾아보자.

supabase - project setting - database - Connection string - URI 값을 보면 비슷한게 있다.

uri value

[your password] 자리에 나의 db password를 넣으면 prisma가 말한대로 자동으로 파일을 만들어준다.

🫶🏾 vercel이 제공하는 postgre database 연결

vercel storage는 7월부터 베타를 시작했다. 따끈

세팅에 들어가면 다음과같이 .env를 제공한다. (로컬에서 쓸수 있는!)

그리고 /prisma/schema.prisma를 다음과 같이 수정한다.

datasource db {
  provider = "postgresql"
  url = env("POSTGRES_PRISMA_URL") // uses connection pooling
  directUrl = env("POSTGRES_URL_NON_POOLING") // uses a direct connection
  shadowDatabaseUrl = env("POSTGRES_URL_NON_POOLING") // used for migrations
}

그러면 그냥 연결된다. 쉽다.

테이블을 생성해보자.

/prisma/schema.prisma를 다음과 같이 추가한다.


...연결등등

model User {
  id    Int     @id @default(autoincrement())
  email String  @unique
  name  String?
  posts Post[]
}

cli 에서 명령어 실행 npx prisma migrate dev --name init

스키마에 정의한대로 User table이 작성되는 것을 database에서 확인할 수 있다.

다음이야기

svelteKIT에서 실제로 prisma를 활용해 db를 조작하고 불러오는 것을 해보겠다.

import { PrismaClient } from '@prisma/client';

const prisma = new PrismaClient();

export default prisma;

참고자료

https://qiita.com/oekazuma/items/c78b05e15d9bfa3fa00e

https://defineall.tistory.com/1052

https://www.prisma.io/docs/getting-started/quickstart

https://www.prisma.io/docs/concepts/database-connectors/postgresql