본문 바로가기

백엔드/Prisma + GraphQL

Prisma란?

데이터베이스 테이블과 쿼리를 만들어주는 도구입니다.

 

User 테이블에서 id가 1인 사용자를 찾아서 반환하는 SQL 쿼리입니다.

SELECT * FROM User WHERE id=1

 

Prisma를 사용하면 다음과 같이 표현할 수 있습니다. 하지만 더 직관적입니다.

prisma.user.findOne(
    where: {
        id: 1
    }
)

보시다시피 데이터베이스에 접근하는 방법은 ORM과 거의 비슷합니다.

ORM(Object Relation Mapping)과 다른점은 무엇인가요?

Prisma는 테이블에 대응하는 클래스를 직접 만들 필요가 없습니다.

데이터 모델링을 하고, Prisma 클라이언트를 생성하면, 위와 같이 prisma.user을 통해서 User 테이블에 접근할 수 있습니다.

단, Prisma는 항상 자바스크립트 객체를 반환하므로 개발자는 반환되는 객체의 형태를 알고 있어야 합니다.

 

참고

ORM의 경우 아래와 같은 User 테이블을 만들려고 할 때,

백앤드에서 다음과 같이 테이블에 대응하는 클래스를 직접 만들어 주어야 했습니다. (커스텀 쿼리 추가 가능)

Sequelize ORM

import { Model } from 'sequelize'

class User extends Model {
  // 커스텀 쿼리
  static async isEmailConfirmed(email) {
    const count = await this.count({ where: { email, emailConfirmed: true } })
    return count === 0
  }
  
  // 커스텀 쿼리
  getFullName() {
    return [this.firstname, this.lastname].join(' ')
  }
}

User.init(
  {
    id: {
      allowNull: false
      autoIncrement: true,
      primaryKey: true,
      type: Sequelize.INTEGER,
    }
    firstName: {
      type: Sequelize.STRING,
      field: 'first_name',
      allowNull: true
    },
    lastName: {
      type: Sequelize.STRING,
      field: 'last_name',
      allowNull: true
    },
    email: {
      type: Sequelize.STRING,
      allowNull: false,
      unique: true,
      validate: {
        isEmail: true
      }
    },
    emailConfirmed: {
      type: Sequelize.BOOLEAN,
      field: 'email_confirmed',
      allowNull: false,
      defaultValue: false
    },
    birthDate: {
      type: Sequelize.DATE,
      field: 'birth_date'
    }
  },
  { sequelize }
)

Prisma는 테이블을 직접 만들 필요가 없습니다.

데이터 모델링을 하고 Prisma CLI를 사용하면, 모델링과 의미가 동일한 테이블이 자동으로 생성됩니다.

테이블간의 Relation까지 자동으로 설정됩니다!

 

참고

ORM의 경우 위의 User 테이블을 만드는 코드를 다음과 같이 직접 만들어 주어야 합니다. 

Sequelize ORM

// migrations/20191217102908-create-user.js
module.exports = {
  up: (queryInterface, Sequelize) => {
    return queryInterface.createTable('Users', {
      id: {
        allowNull: false,
        autoIncrement: true,
        primaryKey: true,
        type: Sequelize.INTEGER,
      },
      firstName: {
        type: Sequelize.STRING,
        field: 'first_name',
      },
      lastName: {
        type: Sequelize.STRING,
        field: 'last_name',
      },
      email: {
        type: Sequelize.STRING,
      },
      emailConfirmed: {
        type: Sequelize.BOOLEAN,
        field: 'email_confirmed',
        allowNull: false,
        defaultValue: false,
      },
      birthDate: {
        type: Sequelize.DATE,
      },
    })
  },
  down: (queryInterface, Sequelize) => {
    return queryInterface.dropTable('Users')
  },
}

출처: https://www.prisma.io/docs/understand-prisma/prisma-in-your-stack/is-prisma-an-orm

 

전 ORM을 사용해 보지 않았고, 위의 출처에 설명된 Sequelize ORM 코드와 구글링에서 본 다른 ORM 스니펫 코드를 본 것이 전부라 더 이상 자세히 설명하지 못하겠습니다.

 

다음 포스트에서는 Prisma가 어떻게 데이터베이스를 관리하고 접근하는지 실제 예제를 통해서 알아보겠습니다.

 

Prisma에 대한 기본적인 내용은 공식 문서에 자세히 설명되어 있으니 제 포스트는 실제 프로젝트에서 어떻게 사용됐는지 참고하는 용도로 봐주세요.