Sequelize 대 Prisma
시작
현재 이베이에서 저는 내부 도구를 MongoDB에서 Postgres로 마이그레이션하고 있습니다. 매우 어렵지만 제가 직접 해결하고자 하는 프로젝트입니다. 조사하는 동안, 코드베이스가 이미 Mongoose를 사용하도록 설계되어 있었기 때문에 ORM을 사용하는 것이 최선이라고 판단했습니다. 하지만 이제 문제는, 우리 코드베이스에 어떤 ORM이 가장 적합한가 하는 점입니다. 이 블로그에서는 그 질문을 깊이 파고들겠습니다. 제 고용주와의 관계상 이 블로그에 모든 내용을 공개할 수는 없다는 점을 참고해 주세요.
요구 사항
프로젝트의 요구를 면밀히 분석한 후, 어떤 ORM 솔루션이든 충족해야 할 다음과 같은 필수 기준을 설정했습니다:
- 대부분의 코드가 JavaScript로 작성되어 있으므로 JavaScript 패키지여야 함
- Postgres 및 그 대부분의 기능을 지원해야 함
- 성능은 적어도 Mongoose와 동등하거나 더 좋아야 함
- 오픈 소스이며 유지 관리되어야 함
ORM들
많은 조사를 한 결과, 요구 사항에 맞는 상위 세 가지 ORM은 다음과 같다고 판단했습니다: Sequelize, Prisma, 및 TypeORM. 마감 기한 때문에 세 가지 ORM을 모두 완전히 테스트할 시간이 없어서 결국 Sequelize와 Prisma에만 집중하기로 결정했습니다.
테스트 환경
테스트 환경에서는 Docker를 통해 Postgres를 실행했습니다. 가장 크고 복잡한 데이터셋을 가져와 문서 구조에서 테이블 구조로 변환한 후 로컬 Postgres 인스턴스에 추가했습니다. 이 데이터셋은 컬럼, 일대일 관계, 일대다 관계 및 일부 JSONB 컬럼을 사용하여 변환했습니다.
그 다음 특정 ORM을 사용한 JavaScript 코드를 작성하고 다음을 측정했습니다:
- 항목을 생성하는 데 걸리는 시간
- 항목을 업데이트하는 데 걸리는 시간
- 중첩된 항목(관계 및/또는 JSON의 키-값) 업데이트에 걸리는 시간
- 항목을 삭제하는 데 걸리는 시간
- 항목을 쿼리/가져오는 데 걸리는 시간
각 ORM 테스트 환경에 대한 리포지토리를 만들었습니다. 이 리포지토리들을 공유하고 싶지만 기술적으로 이베이 소유이므로 공유할 수 없습니다.
결과
2023년 5월 15일경, 저는 Sequelize가 우리 사용 사례에 더 적합하며 MongoDB에서 Postgres로의 마이그레이션에 사용할 ORM이라고 결정했습니다. 궁극적으로 Sequelize를 선택한 이유는 다음과 같습니다:
- 자금 지원을 받는 스타트업에 의해 유지관리되는 것이 아니라 “진정한 오픈소스"였다.
- Postgres의 대부분 기능을 지원했다.
- 특히 Prisma에 비해 성능이 좋았다.
- 문서가 괜찮았고, Prisma 문서만큼 잘 정리되지는 않았지만 충분했다.
저는 Sequelize로 결정했지만, 제가 테스트한 각 ORM에 대한 장단점 목록도 작성했습니다. 이를 통해 다른 사람들이 Sequelize나 Prisma가 자신들의 사용 사례에 적합한지 더 잘 판단하는 데 도움이 되길 바랍니다.
Sequelize 장점 & 단점
장점:
- 테이블을 자동으로 생성하고 처리해주는 sync() 함수가 있다
- 복잡한 조인(중첩 데이터)을 처리할 수 있다
- 정규식(Regex)과 같은 다양한 필터링 옵션을 지원한다
- 모델/스키마 표현이 클래스 기반의 순수 JavaScript로 이루어져 있어 높은 커스터마이징이 가능하다
- Sequelize는 선택한 데이터베이스의 연결을 관리해준다
- Sequelize는 다중 읽기 연결을 지원한다
- Raw SQL 쿼리를 지원한다
- 2023년 5월 15일 기준:
- NPM에서 Sequelize는 마지막 업데이트가 “14 days ago"였고 주간 다운로드 수는 1,505,835회이다.
- GitHub에서 Sequelize는 마지막 업데이트가 “yesterday"였고, 포크는 4.2k, 스타는 27.9k이다.
- Sequelize는 MIT 라이선스를 가지고 있으며 10년 이상 오픈 소스로 유지되어 왔다. 따라서 가까운 미래에도 오픈 소스로 남을 가능성이 높다.
단점:
- 모델/스키마 표현이 매우 복잡하고 부풀어질 수 있다. 예를 들어, 우리 큰 데이터셋의 Mongoose 표현은 약 262줄(공백 포함)이었지만, 같은 데이터셋을 Sequelize로 표현하면 564줄(공백 포함)이었다.
- 특정 경우에 Sequelize의 문법은 매우 혼란스럽고 복잡해진다.
- 데이터베이스 마이그레이션(편집)이 매우 번거롭다. sequelize-cli를 사용하여 JavaScript 마이그레이션 템플릿 스크립트를 생성할 수 있다. 그러나 이는 거의 모든 ORM에서 비슷한 문제로 보인다. 관계형 데이터베이스에서의 마이그레이션은 대부분의 경우 쉬운 일이 아니다.
- 문서화가 그리 훌륭하지 않다. 개선되어 왔지만 여전히 작업이 필요하다. 그러나 ChatGPT 같은 도구 덕분에 예전만큼 큰 문제가 되지 않는다. ChatGPT는 Sequelize를 꽤 잘 이해하고 있는 편이다(아마도 Sequelize가 10년 넘게 존재했기 때문에).
- Sequelize는 Prisma에 비해 타입 민감도가 낮아 문제를 일으킬 수 있다.
- TypeScript 지원이 잘 되어 있지 않다. 제 프로젝트에서는 문제가 되지 않았지만, 많은 다른 프로젝트에서는 큰 문제가 될 수 있다.
Prisma 장점 및 단점
장점:
- 자체 스키마 언어를 가지고 있다. 이는 스키마/모델을 더 쉽게 깔끔하게 만들 수 있음을 의미한다. 예를 들어, 우리 큰 데이터셋의 Mongoose 표현은 약 262줄(공백 포함)이었지만, Prisma로 표현하면 221줄(공백 포함)밖에 되지 않았다.
- 데이터베이스 생성 및 마이그레이션(수정)을 더 쉽게 해주는 CLI 도구가 있다. 매우 편리하다. 만능은 아니지만 지금까지 본 ORM 중 최고라고 생각한다.
- Raw SQL 쿼리를 지원한다.
- Prisma의 코드는 깔끔하고 단순하다. Prisma의 문법을 배우고 익혀야 하긴 하지만 Sequelize의 문법보다 훨씬 이해하기 쉽다.
- Prisma는 Node.js 및 TypeScript용 쿼리 빌더를 자동 생성해주는 클라이언트를 제공한다.
- 문서화가 매우 매우 좋고 깔끔하다. ChatGPT가 도움을 줄 수는 있지만 Prisma에 대해서는 ChatGPT가 Sequelize만큼 최신 정보에 정통하지는 않다.
- 2023년 5월 15일 기준:
- NPM에서 Prisma는 마지막 업데이트가 “6 days ago"였고 주간 다운로드 수는 1,344,705회이다.
- GitHub에서 Prisma는 마지막 업데이트가 “3 hours ago"였고, 포크는 1.1k, 스타는 31.3k이다.
단점:
- Postgres에서 정규식(Regex) 필터링을 지원하지 않지만 “contains”, “includes”, “startsWith"와 같은 필터 옵션은 있다.
- 제 테스트에서, Prisma는 Postgres에 우리 큰 데이터셋의 항목을 생성하는 데 현저히 느렸다. Sequelize는 해당 큰 항목들을 항목당 약 2.26초(JSON 파일 기준)의 속도로 생성한 반면, Prisma는 항목당 약 11.21초(JSON 파일 기준)의 속도를 보였다. 이러한 결과를 바탕으로 이 작업에서 Prisma는 Sequelize보다 약 5배 느리다.
- 또한 큰 데이터셋에서 하나의 항목을 삭제하는 데 거의 4분에 가까운 대기 시간이 발생했는데, 이는 매우 심각한 문제이다.
- 제 테스트에서 가장 크고 복잡한 데이터셋에서 항목 삭제는 Sequelize가 훨씬 빨랐다. 데이터셋 구성 측면에서는 Sequelize가 Prisma보다 유리하지는 않았고, 두 ORM 모두 이 큰 데이터셋에서 3단계 깊이의 관계를 처리해야 했기 때문에 공정한 비교였다고 생각한다.
- Prisma는 스타트업이다. 즉 Prisma는 5,650만 달러의 자금을 보유한 영리 회사다. 이 점을 고려하면 Prisma의 주요 ORM 코드/패키지는 Apache-2.0 라이선스로 오픈 소스이지만, 투자자가 있는 만큼 나중에 라이선스 정책을 변경하는 등 MongoDB와 유사한 상황이 발생할 가능성도 배제할 수 없다.
출처
- https://www.bitovi.com/blog/battle-of-the-node.js-orms-objection-prisma-sequelize
- https://www.prisma.io/docs/orm/more/comparisons/prisma-and-sequelize
- https://github.com/prisma/prisma
- https://github.com/sequelize/sequelize
- https://www.youtube.com/watch?v=rLRIB6AF2Dg
- https://www.youtube.com/watch?v=RebA5J-rlwg
- https://www.youtube.com/watch?v=a5Wh_LDXtLc
- https://www.youtube.com/watch?v=4QN1BzxF8wM