본문 바로가기
코딩공부/학습요약

Prisma 사용/공부 요약

by 개발지망생 2023. 4. 27.

👩‍💻 Prisma를 공부하게 된 계기

이번에 Next.js 13버전으로 Airbnb 클론 프로젝트를 시작하게 되었다. 개인적으로 에어비앤비는 전세계적으로 많은 사람들이 많이 사용하는 웹서비스라 한번쯤 그 기능들을 내 나름대로 구현해 보고 싶었다. 하지만 에어비앤비를 프론트엔드로만 적용하기엔 백엔드 부재가 심하다 생각해서 망상만 하다가 이번에 Next.js로 만들기로 결정한 김에 풀스택을 찍먹해보기로 했다. 결정 한 후에 ORM을 찾던 중  스키마를 통해 데이터베이스를 간단히 조작할 수 있다는 Prisma를 알게 되었고 이번 프로젝트에 적용해보기로 결정했다. 

 

📝 Prisma의 개념과 특징 소개

공식 문서를 확인하면 Prisma는 Node.js, TypeScript, Rust, Go 등 다양한 언어와 프레임워크에서 사용할 수 있는 ORM(Object-Relational Mapping) 도구라 설명되있다. ORM은 객체 지향 프로그래밍에서 사용되는 객체와 데이터베이스의 데이터를 매핑(mapping)해주는 도구로, 개발자가 SQL 쿼리를 직접 작성하지 않고도 데이터베이스를 쉽게 다룰 수 있도록 돕기 때문에 나같이 데이터베이스 초보자에게 더 쉽게 접근할 수 있게 도움을 주며 잘 하는 고수들에겐 생산성을 높여주는 좋은 친구다.

Prisma는 ORM 도구 중에서도 특히 현대적이고 선언적인 구문을 사용하여 개발자가 더 쉽게 데이터베이스를 조작할 수 있도록 돕는다. 이를 통해 개발자는 SQL 쿼리 작성의 복잡성을 줄이고, 안전한 쿼리 작성을 보장할 수 있다.

Prisma는 다음과 같은 특징을 가지고 있다.

  • 선언적인 구문: SQL 쿼리를 직접 작성하는 대신 Prisma에서 제공하는 선언적인 구문으로 데이터베이스 조작
  • 타입 안정성: TypeScript를 지원하며, 타입 안정성 보장
  • 안전한 쿼리 작성: SQL Injection 공격을 방지할 수 있도록 안전한 쿼리 작성 보장
  • 간편한 관계 설정: 다양한 관계 설정을 지원하며, 간편하게 관계 설정
  • 확장성: 다양한 데이터베이스를 지원하며, 데이터베이스 변화 대응

 

🤔 Prisma가 데이터베이스 조작을 어떻게 쉽게 할까?

Prisma는 선언적인 구문을 사용하여 개발자가 데이터베이스를 쉽게 조작할 수 있게 해준다. 예를 들어, 다음과 같은 Prisma 코드를 작성하면 데이터베이스에서 User를 생성할 수 있다.

 

const newUser = await prisma.user.create({
    data: {
        name: 'Alice',
        email: 'alice@example.com',
        posts: {
            create: {
                title: 'Hello, World!',
                content: 'This is my first post.'
            }
        }
    }
})

 

위 코드에서 prisma.user.create 메서드는 User를 생성하기 위한 SQL 쿼리를 자동으로 생성하여 실행한다. 이때, 개발자는 SQL 쿼리를 직접 작성하지 않아도 되며, 안전한 쿼리 작성을 보장할 수 있다고 한다. 또한, Prisma는 다양한 관계 설정을 지원하여, posts와 같은 다른 테이블과의 관계를 설정할 때도 간편한 구문을 제공한다. 예를 들어, 다음과 같은 Prisma 코드를 작성하면 User와 Post 간의 일대다 관계를 설정할 수 있다.

 

model User {
    // id Int @id @default(autoincrement()) sql용
    id String @id @default(auto()) @map("_id") @db.ObjectId // 해당 ObjectId설정은 mongodb에서만 가능하다.
    name String
    email String @unique
    posts Post[]
}

model Post {
    id String @id @default(auto()) @map("_id") @db.ObjectId
    title String
    content String
    author User @relation(fields: [authorId], references: [id])
    authorId Int
}

 

위 코드에서 @relation 속성을 사용하여 Post 모델과 User 모델 간의 관계를 설정할 수 있다. 이렇게 설정한 관계는 Prisma에서 자동으로 SQL 쿼리로 변환되어 실행된다.

 

🔧 Prisma를 사용하는 방법(feat.MongoDB)

✅ Prisma를 사용하기 위해 필요한 준비물과 설치 방법(+ MongoDB 연결 )

Prisma를 사용하기 위해서는 다음과 같은 준비물이 필요하다. (사용하는 IDE : Visual Studio Code 이하 vscode)

  • Node.js: Prisma는 Node.js에서 동작합니다. 따라서 Node.js를 설치해야 한다.
  • 데이터베이스: Prisma는 다양한 데이터베이스를 지원한다. 데이터베이스를 미리 설치해야 한다.
    • PostgreSQL
    • MySQL
    • SQL Server
    • SQLite
    • MongoDB
    • CockroachDB
    • Planetscale
    •  
    • MariaDB

Prisma는 npm으로 설치할 수 있다. 다음과 같이 명령어를 실행하면 Prisma를 설치할 수 있다.

 
npm install -D prisma

 

 

📌 Prisma 초기화

npx prisma init

 

init 후 만들어진 prisma 폴더

init을 하고 vscode에 폴더가 생기는걸 확인 할 수 있다.

 

📌 Prisma MongoDB 연결

schema.prisma 파일 내부

아마 초기에는 provider가  postgresql로 되있을텐데 mongodb로 교체해주고 그 다음, MongoDB 홈페이지로 가서 데이터베이스 URL을 받아 넣어주면 된다.

 

👩‍💻 예시 코드

datasource db {
        provider = "mongodb"

        // 몽고DB에서 받은 URL 양식 예시 입니다. 실제 받으면 중요한 코드이므로 env에 있어야 함.
        url = "mongodb+srv://root:password@cluster1.test1.mongodb.net/testing?retryWrites=true&w=majority"
}

 

💡 Schema.prisma 색깔 넣기(vscode 익스텐션 : Prisma)

vscode 익스텐션

해당 익스텐션을 설치하면 무채색인 Schema.prisma 파일에 컬러를 불어넣어 줄 수 있다.

 

📌 Prisma model 정의

model 정의 이미지

 

model을 정의할 땐 client, db를 설정한 코드 밑에 바로 작성해 주면 된다.

 

📌 Prisma mongoDB에 Schema 푸시하기

npx prisma db push

위 명령어를 터미널에 입력하면, MongoDB Collection 안에 model 명과 같은 document가 생성된다.

 

📝 Prisma의 기본적인 사용법과 API 소개

Prisma는 다양한 API를 제공합니다. 대표적인 API 몇 가지를 살펴보면 다음과 같다.

 

  • prisma.user.findMany(): User 테이블에서 모든 데이터를 조회
  • prisma.user.findUnique(): User 테이블에서 하나의 데이터 조회 (예전에는 findOne 이었다.)
  • prisma.user.create(): User 테이블에 새로운 데이터를 생성
  • prisma.user.update(): User 테이블에서 데이터를 수정
  • prisma.user.delete(): User 테이블에서 데이터를 삭제

이외에도 다양한 API가 제공되며, 이를 활용하여 데이터베이스를 쉽게 다룰 수 있다.

 

🔧 Prisma를 사용하여 데이터를 CRUD하는 방법

✅ 데이터 생성

const newUser = await prisma.user.create({
    data: {
        name: 'Alice',
        email: 'alice@example.com',
        posts: {
            create: {
                title: 'Hello, World!',
                content: 'This is my first post.'
            }
        }
    }
})

 

위 코드에서 prisma.user.create() 메서드를 사용하여 데이터를 생성할 수 있다. 이때 data 속성에는 생성할 데이터를 객체 형태로 전달해준다. 위 예시에서는 name과 email 필드를 갖는 User 데이터를 생성하고 있으며, posts 필드를 통해 Post 데이터도 함께 생성하고 있다.

 

데이터 읽기

const users = await prisma.user.findMany()

 

위 코드에서 prisma.user.findMany() 메서드를 사용하여 User 테이블의 모든 데이터를 조회할 수 있다.

 

데이터 수정

const updatedUser = await prisma.user.update({
    where: {
        id: 1
    },
    data: {
        name: 'Bob'
    }
})

 

위 코드에서 prisma.user.update() 메서드를 사용하여 User 데이터를 수정할 수 있다. 이때 where 속성에는 수정할 데이터를 식별할 수 있는 조건을 전달해주면 된다. 위 예시에서는 id 필드가 1인 User 데이터를 수정한다는 말과 같다.

 

데이터 삭제

const deletedUser = await prisma.user.delete({
    where: {
        id: 1
    }
})

 

위 코드에서 prisma.user.delete() 메서드를 사용하여 User 데이터를 삭제할 수 있다. update처럼 where 속성에는 삭제할 데이터를 식별할 수 있는 조건을 전달한다.

 

👁‍🗨 Prisma의 장단점

😎 장점

  • 간단한 구문을 사용하여 데이터베이스를 다룰 수 있다.
  • 데이터베이스에 대한 추상화 계층을 제공하여 데이터베이스를 쉽게 전환할 수 있다.
  • TypeScript를 지원하여 타입 안정성을 보장한다.

😪 단점

  • 복잡한 쿼리를 작성하기 어려워 보인다.
  • 성능 이슈가 발생할 수 있다.
  • Prisma가 자동으로 생성하는 SQL 쿼리가 효율적이지 않을 때가 있다.

 

🔃 Prisma와 다른 ORM 도구 비교

✍ Prisma와 다른 ORM 도구의 차이점과 비교 분석

Prisma는 다른 ORM 도구들과 비교할 때 다음과 같은 차이점을 갖습니다.

  • Prisma는 데이터베이스에 대한 스키마를 자동으로 생성한다.
  • Prisma는 TypeScript를 지원한다.
  • Prisma는 간단한 구문을 사용하여 데이터베이스를 다룰 수 있다.
  • Prisma는 SQL을 직접 사용하지 않는다.

반면 다른 ORM 도구들은 대부분 SQL을 직접 사용하고, 데이터베이스에 대한 스키마를 직접 작성해야 한다. 또한, TypeScript를 지원하지 않는 경우도 많다.

 

😎 어떤 경우에 Prisma를 선택하는 것이 좋을까?

Prisma는 데이터베이스와 통신하는 서버측 애플리케이션을 구축하는 경우, 그리고 데이터베이스 워크플로를 전체적으로 다루는 도구를 원하는 경우에 적합하다.

Prisma는 SQL 초보자이든 베테랑이든 모두에게 적합하며, 관계형, NoSQL 및 NewSQL 데이터베이스를 모두 지원한다. Prisma를 사용하지 않아도 다른 ORM 도구나 직접 SQL을 작성할 수 있지만, Prisma는 스키마 정의를 통한 개발자 친화적인 추상화를 제공하여 생산성과 유형 안전성을 향상시키는 장점을 가지고 있다. 따라서 간단하게 데이터베이스와 상호 작용하는 애플리케이션을 개발하는 경우 Prisma를 고려할 수 있다.

 

하지만, 추상화가 많이 된 대가로 생산성을 높였지만 Prisma가 제공하지 않는 데이터베이스 쿼리에 대한 요구 사항이 있고 해결 방법에 코스트가 많이 든다면 일반 SQL을 사용하여 데이터베이스 작업을 완전히 제어할 수 있는 도구를 사용하는 것이 더 나을 수 있다고 공식문서에서 안내하고 있다.

 

🏗 Prisma의 내부 작동 원리

📝 Prisma 동작 방식 설명

Prisma는 데이터베이스와 상호작용하기 위해 클라이언트와 서버 간의 커뮤니케이션을 처리하는 클라이언트 라이브러리와 데이터베이스 스키마를 정의하고 관리하는 마이그레이션 관리 도구로 구성되있다.

Prisma 클라이언트는 Prisma 스키마에서 정의된 데이터 모델과 일치하는 코드를 생성한다. 이 코드는 TypeScript로 작성되며, 데이터베이스와 상호작용할 때 타입 안정성을 보장한다.

Prisma 서버는 Prisma 클라이언트와 데이터베이스 사이에서 요청을 중개하고, Prisma 스키마를 기반으로 클라이언트가 데이터를 가져오거나 수정하는 방식을 결정한다.

 

🔩 Prisma가 데이터베이스를 조작할 때 어떻게 동작할까?

1. Prisma가 데이터베이스를 조작할 때는 먼저 Prisma 클라이언트에서 요청이 생성된다. 이 요청은 데이터베이스 스키마에 따라 생성된 TypeScript 코드로 작성된다.

2. Prisma 서버는 클라이언트 요청을 받은 후, 데이터베이스와 상호작용하는 쿼리를 생성한다. 이 쿼리는 데이터베이스에서 실행될 SQL 쿼리로 변환되며, Prisma 서버는 SQL 쿼리를 데이터베이스에 전송한다.

3. 데이터베이스에서 결과가 반환되면, Prisma 서버는 결과를 파싱하고 Prisma 클라이언트에게 반환한다. 이 결과 또한 TypeScript 코드로 작성되어 있다.

 

Prisma는 데이터베이스와 클라이언트 사이의 중개자 역할을 수행하며, 데이터베이스에 대한 모든 요청과 응답을 처리한다. 이 방식으로 Prisma는 데이터베이스 조작을 추상화하고, 개발자가 더욱 쉽게 데이터베이스와 상호작용할 수 있도록 도와준다.

 

✨ 요약

Prisma는 타입 안정성과 쉬운 API를 제공하여 데이터베이스 조작을 쉽게 해주는 ORM 도구다. Prisma는 TypeScript로 작성되며, 데이터베이스와 상호작용할 때 타입 안정성을 보장한다. Prisma를 사용하면 데이터베이스 스키마를 정의하고 관리하는 것이 매우 간단해지며, 데이터베이스 조작에 대한 추상화 수준이 높아져 개발자는 더욱 쉽게 데이터베이스와 상호작용할 수 있다. 그러나 Prisma는 모든 데이터베이스와 호환되지 않을 수 있으며, 다른 ORM 도구들과 비교하여 기능이 제한될 수 있다.

실력이 부족해 많은 부분을 끌어오진 못했다 생각하지만 장점이 많은 ORM이라 생각이 든다. 프로젝트 요구사항에 따라 적절한 ORM 도구를 선택할 때 괜찮은 선택지가 될 수 있다 생각한다.

댓글