Prisma로 처음 ORM을 써봤습니다
cleanUrl: /Prisma로-처음-ORM을-써봤습니다 floatFirstTOC: right
🌱 Prisma란?
“Prisma는 TypeScript와 Node.js를 위한 차세대 ORM입니다.”
- Prisma Client: 자동 생성되는 타입 안전한 쿼리 빌더
- Prisma Migrate: 마이그레이션 도구
- Prisma Studio: GUI 기반 데이터 편집 툴
👍🏻 Prisma의 강점
1. 타입 안정성과 자동완성
QueryBuilder는 타입 추론이 부족해, 오타나 잘못된 필드명을 컴파일 단계에서 잡아내지 못해 런타임에 에러가 발생하는 경우가 많았습니다.const user = await this.usersRepository .createQueryBuilder() .update(User) .set({ name: 'dongho' }) .where("id = :id", { id: 2 }) .execute()
.where() 절 안에 아래 처럼 오타를 낸다면, 컴파일러는 이를 인식하지 못하고 아무런 오류도 발생시키지 않습니다. 이 경우, 런타임에서만 SQL 에러가 발생하게 되어 심각한 경우 운영 환경에서 오류가 발생하고 이를 사전에 인지하지 못하는 문제가 생길 수 있습니다..where("idd = :id", { id: 2 }) // 'idd'는 실제 컬럼명이 아님
const user = await prisma.user.update({ data: { name: 'dongho', }, where: { idd: 2, // 'idd'는 실제 컬럼명이 아님 }, })
2. 간결하고 직관적인 모델 정의 및 사용
1) 모델 정의
@Entity() export class User { @PrimaryGeneratedColumn() id: number; @Column() name: string; }
model User { id Int @id @default(autoincrement()) name String }
2) DB 연결 설정
const AppDataSource = new DataSource({ type: 'postgres', host: 'localhost', username: 'user', ... entities: [User, Post, Comment], }); const userRepo = AppDataSource.getRepository(User); const postRepo = AppDataSource.getRepository(Post); const commentRepo = AppDataSource.getRepository(Comment);
import { PrismaClient } from '@prisma/client'; const prisma = new PrismaClient(); const user = await prisma.user.findMany(); const post = await prisma.post.findMany(); const comment = await prisma.comment.findMany();
3) CRUD 작업 처리
save(), remove() 외에도 insert(), update(), delete() 같은 메서드가 여러 개 존재합니다. 그런데 이 각각의 메서드가 동작 방식과 사용 용도가 조금씩 달라서 헷갈리기 쉽습니다.
save()와 remove() 메소드는 내부에서 여러 작업을 처리하기 때문에, 동작 방식을 제대로 모르면 의도치 않은 데이터 변경이나 삭제가 발생할 수 있어 주의가 필요했습니다. 예를 들어, save()는 새 엔티티 삽입과 기존 엔티티 업데이트를 모두 처리하는데, 이 과정에서 연관된 엔티티까지 함께 변경될 수 있어 복잡했습니다. remove() 메소드는 실제로 엔티티를 데이터베이스에서 삭제하는 역할을 하지만, 단순히 ID만 가지고 삭제할 수 없고 삭제할 엔티티 객체를 먼저 조회하거나 전달해야 해서 번거로웠습니다.create(), update(), delete()가 각각 역할에 딱 맞게 분리되어 있어 자연스럽게 어떤 기능인지 바로 이해할 수 있습니다.👎🏻 Prisma를 사용하면서 생소했던 부분
1. 데이터 유효성 검증 방식
class-validator 같은 라이브러리를 사용해 엔티티에 데코레이터를 붙여 손쉽게 데이터 유효성 검증을 처리할 수 있었지만, Prisma는 검증을 어떻게 해야 할지 감이 잘 오지 않았습니다.Zod.js 라이브러리를 사용하여 데이터 유효성 검사를 수행한다고 한다. 이 부분은 추후에 직접 경험하면서 더 자세히 알아보고 적용해볼 계획입니다.2. 변경 사항 반영 방식
prisma generate 명령어를 실행해 Prisma Client를 다시 생성해야 변경 사항이 코드에 반영됩니다. 이 과정이 자동화되어 있지 않다 보니 처음에는 약간 번거롭고 익숙하지 않게 느껴졌습니다.3. 관계 쿼리 방식
include나 select 옵션을 사용합니다. 예를 들어, 특정 사용자의 게시글 목록을 함께 가져오고 싶다면 다음과 같은 코드를 작성해야 합니다.const userWithPosts = await prisma.user.findUnique({ where: { id: 1 }, include: { posts: { select: { title: true, // 게시글 제목만 가져옴 }, }, }, });
const user = await userRepository.findOne({ where: { id: 1 }, relations: ['posts'], // 기본 relations 옵션만으로는 범위 제어가 어려워 QueryBuilder를 사용해야 함 });
relations 배열에 관계명을 넣기만 해도 자동으로 join이 이루어졌지만, Prisma는 include나 select 옵션을 사용해 가져올 데이터를 명시적으로 지정해야 합니다. 덕분에 조회 범위를 명확히 제어할 수 있다는 장점이 있지만, 관계가 많아질수록 include 옵션이 중첩되며 코드가 복잡해지고, 실수할 가능성도 높아질 수 있다는 점은 주의가 필요하다고 느꼈습니다.✍️ 마무리하며
참고 자료
[번역] TypeORM vs Prisma
들어가기 앞서 해당 글은 Prisma의 공식 문서인 해당 글을 번역하였습니다. https://www.prisma.io/docs/concepts/more/comparisons/prisma-and-typeorm Prisma vs TypeORM Learn how Prisma compares to TypeORM. www.prisma.io TypeORM vs Prisma Prisma와 TypeORM은 비슷한 문제를 해결하지만, 작동하는 방식은 꽤 다릅니다. TypeORM은 테이블을 모델 클래스에 매핑하는 전통적인 ORM입니다. 이러한 모델 클래스는 SQL 마이그레이션을 생성하는 데 사용할 수 있습니다. 그런 다음 모델 클래스의 인스턴스는 런타임에 애플리케이션에 CRUD 쿼리를 위한 인터페이스를 제공합니다. Pri..
[Node.js] Prisma란? (feat. 사용해야 되는 이유)
안녕하세요. Foma 입니다! 지난 Sequelize, TypeORM과 같은 ORM 라이브러리에 이어서 Prisma라는 ORM 라이브러리에 대해 정리해 보려고 합니다. 바로 시작할게요~ (혹시 ORM에 대해 모르시는 분들이 있다면 여기 를 참고해 주세요!) Prisma란? 프리즈마 공식 홈페이지에선 아래와 같이 소개하고 있습니다. "우린 차세대 Node.js와 TypeScript ORM야" 아래와 같이 3가지를 제공합니다. Prisma Client: Node.js와 Typescript를 위한 자동 생성과 안전한 타입 쿼리 빌더 Prisma Migrate: 마이그레이션 시스템 Prisma Studio: 데이터 베이스의 데이터를 보고 편집할 수 있는 GUI 편집기 Prisma Client는 REST API,..
[Node.js] TypeORM이란? (feat. ORM Library)
안녕하세요 Foma 입니다! 오늘은 저번 글 Sequelize에 이어서 Node.js ORM 라이브러리인 TypeORM에 대해서 다뤄보려고 합니다. 평소에 Typescript로 개발하는 것을 선호하기 때문에 "Sequelize를 Typescript로 개발할 수 있나?" 하고 찾아봤더니 Typescript 기반으론 TypeORM 라이브러리를 많이 사용하는 것 같더라구요. (물론 Sequlize도 Typescript를 지원합니다. 여기 에서 확인하실 수 있습니다.) 그래서 오늘은 TypeORM이 무엇인지에 대해 정리해 보려고 합니다. 바로 시작할게요~ ORM이란? 먼저 Sequelize를 알기 위해서 ORM의 개념을 알아야 하는데요. 그 이유는 바로 Sequelize가 Node.js의 ORM 라이브러리이기 ..
[번역] Prisma가 기존의 '전통적인' ORM보다 더 나을까요?
들어가기 전에 해당 글은 다음 글을 번역하였습니다. https://practica.dev/blog/is-prisma-better-than-your-traditional-orm/ Is Prisma better than your 'traditional' ORM? | Practica.js Intro - Why discuss yet another ORM (or the man who had a stain on his fancy suite)? practica.dev 소개: 왜 또 다른 ORM에 대해 이야기할까요? 베터리지의 헤드라인 법칙에 따르면 '물음표로 끝나는 헤드라인은 NO라는 단어로 대답할 수 있다'고 합니다. 이 기사도 이 법칙을 따르게 될까요? 한 우아한 사업가가 멋진 턱시도를 입고 손바닥에 명품 시계를..
