https://www.youtube.com/watch?v=jqhHXe746Ns&t=345s&ab_channel=ThePrimeTime
Node.js 프로젝트의 ORM을 뭘 쓸까 고민하던 중에, Primeagen이 리뷰한 재밌는 아티클이 있어서 번역해봤습니다.
원본 링크: https://codedamn.com/news/product/dont-use-prisma
원제: We migrated to SQL. Our biggest learning? Don’t use Prisma
지난 주에 우리는 기본 데이터베이스를 MongoDB에서 Postgres로 전환하는 마이그레이션을 완료했습니다. 이 과정에서 많은 도전 과제들이 있었으며, 그 중 가장 큰 도전은 코드베이스를 두 번이나 재작성한 것입니다.
프리즈마를 프로덕션에서 사용하려고 고민 중인 개발자들을 위해 이 글을 씁니다. 쓰지 마세요.
Prisma의 마케팅과 아름다운 홈페이지에 넘어가 맹목적으로 신뢰하고 말았습니다.
Prisma의 장점 중 하나는 관계, 기본값, 데이터 타입을 모두 포함하는 스키마를 생성하는 능력입니다. 문법도 매우 명확합니다.
그러나 그게 전부입니다. Mongoose ORM에서 Prisma로 전체 코드베이스를 전환했는데, 처음에는 좋아 보였습니다.
codedamn에서는 AWS 람다를 사용하여 GraphQL 기반 백엔드를 호스팅합니다. Prisma와 관련하여 처음 발견한 문제는, Prisma가 여러 개의 10-20MB 크기의 "엔진"을 배포한다는 것이었습니다.
프리즈마가 자기만의 독자적인 "db" 엔진 레이어를 필요로 한다는 사실이 매우 충격적이었습니다.
https://www.prisma.io/docs/concepts/components/prisma-engines
우리의 AWS 람다 배포는 50MB 크기 제한을 초과하여 실패했습니다. 백엔드 타입스크립트를 구축하기 위해 ESBuild를 사용했습니다. 우리는 불필요한 엔진과 Prisma 파일 및 node_modules를 제거하고 배포 크기를 50MB 미만으로 줄이기 위해 빌드 파이프라인에 여러 패치를 작성해야 했습니다.
그러나 결국, Prisma가 꼭 필요로 하는 12-13MB 크기의 쿼리 엔진을 배송해야 했습니다.
우리의 두 번째 실수는 Prisma에서 "흉내 낸 외래 키 관계" 모드를 켰다는 것입니다. 처음에는 우리의 데이터베이스로 PlanetScale을 사용하려고 했으나, 그것도 우리에게는 최선의 선택이 아니었습니다. (이 내용만으로 다른 블로그 포스트를 하나 더 쓸 수 있습니다.)
Prisma 내에서 외래 키 관계를 에뮬레이션하는 것은 성능적으로 악몽입니다. Prisma로 작성된 어댑터를 통해 스테이징 MongoDB에서 스테이징 PlanetScale로 데이터의 테스트 마이그레이션을 시도했을 때 관찰한 몇 가지 사항들은 다음과 같습니다:
고유 엔진 내부에서 일어나는 SQL 결과 "patching"은 협상 결렬의 요소였습니다. 뭐 나름대로 스스로 최적화를 할 수도 있지만, 비록 15MB짜리 러스트 엔진을 사용한다 하더라도 데이터베이스를 성능적으로 능가할 수는 없을 겁니다.
더 깊게 조사해 보니, 당신의 코드가 'actual DB call'을 절대 하지 않는다는 것을 발견했습니다. 프리즈마 코드는 GraphQL 네트워크 요청(?)을 프리즈마 Rust 쿼리 엔진에 수행하며, 그런 다음 여러분의 요청을 실제 DB 호출로 번역합니다.
PlanetScale 포기하기
우리의 PlanetScale 데이터베이스는 여러 레코드의 삽입/읽기에 대한 스트레스 테스트를 통과할 수 있었습니다. 그러나 Vitess 내부의 제한된 트랜잭션 풀 때문에 Prisma를 사용할 때 실패했는데, 이 풀이 매우 빠르게 고갈되었고 그 후에는 몇 분 동안 PlanetScale DB로의 모든 추가 호출이 실패하게 되었습니다.
그러나 PlanetScale을 포기하는 것은 두 가지 이유 때문이었습니다:
PlanetScale은 독립적으로 사용할 때는 괜찮습니다. 그러나 Prisma는 DX, Accelerate, tooling들로 당신을 낚으려고 할 수 있습니다.
무거운 프로덕션 시스템에서 성능을 조금이라도 고려한다면, Prisma 사용을 피하세요.
Prisma의 웹사이트에는 "Why Prisma"라는 페이지가 있습니다. 그곳에는 3가지 내용이 나와 있습니다:
Raw SQL: Full control, 낮은 생산성
SQL 쿼리 빌더: 높은 제어, 중간 생산성
ORMs: 적은 제어, 더 나은 생산성
하지만 팩트는 다음과 같습니다.
Raw SQL: Full control, 낮은 생산성, 미친 성능
SQL 쿼리 빌더: 높은 제어, 중간 생산성, 미친 성능
(Prisma) ORMs: 적은 제어, 약간 더 나은 생산성 및 문법, (안 좋은 의미로) 미친 성능
여러 옵션을 평가한 후, 우리가 최종적으로 선택한 것은 다음과 같습니다:
Kysely는 아직 기능이 완전하지는 않지만, raw SQL을 작성하더라도 코드를 타입 안전하게 유지할 수 있도록 돕습니다.
오 프리즈마... 다시 한번 생각하게 되네요. 인상 깊게 읽었습니다.
오 프리즈마... 2023년 12월 7일 5.7.0에서야 드디어 프리뷰로
JOIN
이 들어왔습니다. 그것도 PostgreSQL과 CockroachDB만...