prisma ORM

권태형·2023년 2월 28일
0

Velog 클론코딩

목록 보기
3/6
post-thumbnail

사용계기

이번에 TypeScript를 사용하게 되면서 새로운 ORM인 prisma를 경험하게 되었다. 사실 TypeScript를 사용하면서 같이사용할 ORM으로 TypeORM과 Prisma가 거론 되었는데, TypeScript를 사용할 때 쓰는 ORM의 양대산맥 이지만, 최근 트랜드가 prismaORM을 사용하는 추세가 늘고 있어 이번기회에 prisma ORM을 사용해 보게 되었다.

prisma을 사용해보자

주로 Sequelize ORM과 비교를 하면서 진행해보자!

일단 prisma는 Node.js 및 TypeScript전용 ORM이다. 우리가 평소 javascript에서 사용하는 sequelize의 TypeScript버전이라고 생각하면 간단하려나?(실제로는 많이 다르다 개념적인 부분만 생각하자!)

일단은 좋은 점은 공식문서가 예시와 결과까지 친절하게 설명되어 있고, 한국어 번역도 나쁘지 않은편이라 사용하는데 지장이 없었다.

prisma 공식페이지를 참고하면 많은 것을 얻을 수 있다.

무엇보다 내장하는 query함수가 보다 직관적이며 sequelize보다 활용하기 쉽고 직관적인 편이다.

다만 아쉬운점은 구글링을 통한 prisma사용 예시가 많지 않다. 공식문서에 많이 의지해야하며, sequelize에서 자주 사용하던 findOne메소드 처럼 하나의 데이터만 찾고싶을 때 적절한 메소드가 애매하다는 점이다. findFirst나 findUniqe 같은 함수로 찾고싶은 데이터에 제한이 생기는 경우가 존재한다.

DB의 구축을 위한 모델링(스키마)작업이 Sequelize에 비해 좀 더 편리한 편이다. Sequelize는 마이그레이션 파일을 테이블별로 따로따로 작성하고, 마이그레이션 한 후 다시 또 모델에 타입설정을 건들어야하는 경우가 존재하는데,

prisma는 스키마파일을 하나 만들어서 Sql문으로 직접 실행하는 것과 같이 하나의 파일에 모두 작성해서 한 번 적용하면 간단하게 DB관계를 설정할 수 있다.

아래는 이번 프로젝트에서 DB를 설정한 prisma 스키마파일의 일부이다.

datasource db {
  provider = "mysql"
  url      = env("DATABASE_URL")
}

generator client {
  provider = "prisma-client-js"
  binaryTargets = ["windows", "darwin"]
}

model Post {
  postId        Int       @id @default(autoincrement())
  title         String
  content       String    @db.VarChar(65000)
  postImage     String?
  privateOption Int
  createdAt     DateTime  @default(now())
  userId        Int
  user          User      @relation(fields:[userId], references:[userId], onDelete: Cascade)
  comments      Comment[]
}

관계설정도 일일히 따로 assosiate해서 belongTo hasMany 할 것 없이 설정이 가능하다. 설정방법이나 모델링은 위에 첨부한 공식문서를 참고하자.

또한 하나의 스키마 파일을 만들고 마이그레이션하게되면 sql파일이 하나 만들어져서 디렉토리 구조가 깔끔해진다. Sequelize의 경우 테이블이 8개 존재하면 마이그레이션파일까지 총 16개의 파일을 첨부해야하니 디렉토리가 매우 지저분해 진다.

아래는 게시글을 조회하는 함수이다.

getPostsOrderByTime = async () => {
    const posts = await this.prisma.post.findMany({
      orderBy: { createdAt: 'desc' },
      where: { privateOption: 1 },
      select: {
        postId: true,
        postImage: true,
        title: true,
        content: true,
        createdAt: true,
        userId: true,
        user: { select: { userName: true, profileImage: true } },
        _count: { select: { comments: true } },
      },
    });
    return posts;
  };

Sequelize의 attrivute와 크게 다를 것 없이 생겼지만, select처럼 좀 더 SQL문과 같이 직관적이며, count를 따로 내장하고있어서 Sequelize.fn , Sequelize.col 등 불편하게 코드를 길게 써나갈 필요없이 관계join이 간단하게 처리할 수 있다.

사용후기

아직 1주일 짜리 프로젝트를 위해 겨우겨우 일부분을 써왔을 뿐이지만, 분명하게 Sequelize보다 편하게 쓰고있다는 점을 느낀다. 공식문서도 깔끔하고 필자와 같이 처음 알아가는 단계에 있는 사람에게 굉장히 친절하고 사용감이 쉽게 와닿을 수 있다. 아직 내가 사용해 본 ORM이 두가지 밖에 없지만, 비교의 기준이 되기에는 정말 좋은 것 같다.

profile
22년 12월 개발을 시작한 신입 개발자 ‘권태형’입니다. 포스팅 하나하나 내가 다시보기 위해 쓰는 것이지만, 다른 분들에게도 도움이 되었으면 좋겠습니다. 💯컬러폰트가 잘 안보이실 경우 🌙다크모드를 이용해주세요.😀 지적과 참견은 언제나 환영합니다. 많은 댓글 부탁드립니다.

0개의 댓글