Sequelize와 Prisma
시작
현재 eBay에서 저는 내부 도구를 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 테스트 환경에 대한 저장소를 만들었습니다. 이 저장소들을 공유하고 싶지만, 기술적으로 eBay 소유이기 때문에 공유할 수 없습니다.
결과
2023년 5월 15일경, 저는 Sequelize가 우리 사용 사례에 더 적합한 ORM이며 MongoDB에서 Postgres로의 마이그레이션에 사용할 ORM이라고 결정했습니다. 최종적으로 Sequelize를 선택한 이유는 다음과 같습니다.
- 자금 지원을 받는 스타트업이 유지 관리하는 것이 아니라, “진정한 오픈 소스"였기 때문입니다.
- Postgres의 대부분 기능을 지원했습니다.
- 특히 Prisma와 비교했을 때 성능이 좋았습니다.
- 문서가 좋았지만, Prisma의 문서만큼 잘 정리되어 있지는 않았습니다.
저는 Sequelize로 결론을 내렸지만, 테스트한 각 ORM에 대한 장단점 목록도 작성했습니다. 이것이 사람들이 자신의 사용 사례에 Sequelize나 Prisma가 적합한지 더 잘 판단하는 데 도움이 되기를 바랍니다.
Sequelize 장단점
장점:
- sync() 함수가 있어 테이블을 자동으로 생성하고 관리합니다
- 복잡한 조인(중첩 데이터)을 처리할 수 있습니다
- 많은 필터링 옵션(예: 정규식)을 지원합니다
- 모델/스키마 표현이 클래스 형태의 순수 JavaScript로 이루어지며, 매우 커스터마이즈가 가능합니다.
- Sequelize는 선택한 데이터베이스에 대한 연결을 처리합니다.
- Sequelize는 여러 읽기 연결을 지원합니다
- 원시 SQL 쿼리를 지원합니다.
- 2023년 5월 15일 기준:
- NPM에서 Sequelize는 마지막 업데이트가 “14일 전"이었고 주간 다운로드 수는 1,505,835회입니다.
- GitHub에서 Sequelize는 마지막 업데이트가 “어제"였고, Fork는 4.2k개, Star는 27.9k개입니다.
- Sequelize는 MIT 라이선스를 가지고 있으며 10년 넘게 오픈 소스로 유지되어 왔습니다. 따라서 가까운 미래에도 오픈 소스로 유지될 가능성이 매우 높습니다.
단점:
- 모델/스키마 표현이 매우 복잡하고 비대해질 수 있습니다. 예를 들어, 우리 대형 데이터셋의 Mongoose 표현은 약 262줄(공백 포함)이었습니다. 같은 데이터셋을 Sequelize로 표현하면 564줄(공백 포함)이 됩니다.
- 특정 경우에는 Sequelize의 문법이 매우 혼란스럽고 복잡해집니다.
- 데이터베이스를 마이그레이션하는 것(편집하는 것)은 매우 번거롭습니다. sequelize-cli를 사용하여 JavaScript 마이그레이션 템플릿 스크립트를 생성할 수 있습니다. 하지만, 이 점은 거의 모든 ORM에서 비슷한 것으로 보입니다. 관계형 데이터베이스에서 마이그레이션하는 것은 대부분의 경우 쉽지 않습니다.
- 문서가 그다지 훌륭하지 않습니다. 나아지긴 했지만 여전히 개선이 필요합니다. 하지만 ChatGPT와 같은 도구가 있으면, Sequelize에 대해 매우 잘 이해하고 있기 때문에 더 이상 예전만큼 큰 문제는 아닙니다. 이는 아마도 Sequelize가 10년 동안 존재해 왔기 때문일 것입니다.
- Sequelize는 Prisma에 비해 타입 민감도가 높지 않아 문제가 생길 수 있습니다.
- TypeScript를 잘 지원하지 않습니다. 제 프로젝트에서는 문제가 아니지만, 많은 다른 프로젝트에서는 큰 문제가 될 수 있습니다.
Prisma 장단점
장점:
- 자체 스키마 언어가 있습니다. 즉, 스키마/모델을 더 쉽고 깔끔하게 만들 수 있습니다. 예를 들어, 우리 대형 데이터셋의 Mongoose 표현은 약 262줄(공백 포함)이었습니다. 하지만 같은 데이터셋을 Prisma로 표현하면 221줄(공백 포함)뿐이었습니다.
- Prisma에는 데이터베이스의 생성 및 마이그레이션(수정)을 더 쉽게 해 주는 CLI 도구가 있습니다. 매우 편리합니다. 만능 해결책은 아니지만, 지금까지 ORM에서 본 것 중 가장 좋은 도구입니다.
- 원시 SQL 쿼리를 지원합니다.
- Prisma의 코드는 깔끔하고 단순합니다. Prisma의 문법을 배우고 익혀야 하기는 하지만 Sequelize의 문법보다 훨씬 이해하기 쉽습니다.
- Prisma는 Node.js 및 TypeScript용 쿼리 빌더를 자동으로 생성하는 클라이언트를 제공합니다.
- 문서가 매우 매우 훌륭하고 깔끔합니다. ChatGPT가 여전히 도움이 될 수는 있지만, Prisma에 대해서는 Sequelize만큼 최신 정보는 아닙니다.
- 2023년 5월 15일 기준:
- NPM에서 Prisma는 마지막 업데이트가 “6일 전"이었고 주간 다운로드 수는 1,344,705회입니다.
- GitHub에서 Prisma는 마지막 업데이트가 “3시간 전"이었고, Fork는 1.1k개, Star는 31.3k개입니다.
단점:
- Postgres용 정규식 필터링을 지원하지 않지만, “contains”, “includes”, “startsWith” 필터 옵션은 제공합니다.
- 제 테스트에 따르면, Prisma는 Postgres에서 우리 대형 데이터셋의 항목을 생성하는 속도가 상당히 느립니다. Sequelize는 대형 항목을 항목당 약 2.26초(JSON 파일 기준)의 속도로 생성했습니다. 반면 Prisma는 항목당 약 11.21초(JSON 파일 기준)였습니다. 이 결과를 바탕으로 보면, Prisma는 이 작업에서 Sequelize보다 약 5배 느립니다.
- 또한 대형 데이터셋에서 항목 하나를 삭제하는 데 거의 4분의 대기 시간이 발생했는데, 이는 매우 매우 좋지 않습니다.
- 제 테스트에서 가장 크고 가장 복잡한 데이터셋의 항목을 삭제할 때는 Sequelize가 훨씬 더 빨랐습니다. 다만 데이터셋을 구성하는 데 있어서는 Sequelize가 Prisma보다 유리하지 않았습니다. 둘 다 이 대형 데이터셋에서 3단계 깊이의 관계를 처리해야 했기 때문에, 공정한 비교였다고 생각합니다.
- Prisma는 스타트업입니다. 즉, Prisma는 5,650만 달러의 자금을 조달받은 영리 기업입니다. 이를 고려하면, Prisma의 मुख्य ORM 코드/패키지는 Apache-2.0 라이선스로 오픈 소스이긴 합니다. 이는 좋지만, Prisma에는 투자자가 있기 때문에 라이선스와 관련해서 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