samchon / bbs-backend

Simple Bullet-in Board System Backend
https://nestia.io
MIT License
24 stars 3 forks source link

Prisma 선택의 이유가 궁금합니다. #4

Closed TaeyoonKwon closed 8 months ago

TaeyoonKwon commented 8 months ago

기존 블로그 글이나 개발하신 오픈소스, 선택하신 라이브러리들을 봤을 때

Performance를 매우 중시하며 Node.js에서 State of art 수준의 활용 능력을 보여주시는데요.

다른게 아니라 Prisma를 쓰시는 이유가 궁금하여 질문 드립니다.

ORM이 필요한 경우 Drizzle + Prepared statement나 Kysely 같은 일반적으로 알려진 라이브러리 들이나

raw query를 랩핑해서 쓰실 수도 있으셨을 것 같은데, 선택하신 이유가 있으실까요?

samchon commented 8 months ago

생산성 및 안정성에서 가장 뛰어나다 판단하여 사용합니다.

제가 class-validator 를 버리고 typia 를 자작하여 사용하는 이유에는, class-validator 특유의 느린 성능도 있지만, 그보다도 생산성 및 안정성이 엉망이기 때문입니다. NestJS 에서 class-validator 를 사용하는 경우, 대략 4 중의 중복 타입 정의를 해야하고 (TS Type + class-validator + class-transformer + @nestjs/swagger, 그 타입을 프론트와 공유할 수 없어 생산성 측면에서 최악입니다.

또한, 조금만 복잡한 타입이 와도 타입 검사기가 아주 엉터리로 작동합니다. 저는 틀린 것을 맞다고 하는게, 맞는 것을 틀리다고 하는거보다 훨씬 더 심각한 버그라 생각합니다. 후자야 버그를 발견하여 고치면 그만인데, 전자는 유저가 정상 동작하는 줄 알고 쓰다가 크게 다치기 때문입니다. 그리고 class-validator 가 실제로 전자의 경우로, 틀린 것을 맞다고 하는 비중이 과합니다.

위 문제를 해결하기 위해 typia 를 만들면서, 겸사 겸사 AoT (Ahead of Time) 컴파일 개념을 도입하여 속도가 큰 폭으로 개선하였긴 하나, 그것이 제가 생산성이나 안정성보다 성능을 우위에 두는 성향의 사람이어서 그런 것은 아닙니다. 저는 성향상 생산성과 안정성을 속도보다 우선시하고, 퍼포먼스 개선 또한 기대 효과가 큰 것에서부터 시작하는 편입니다.

프리즈마가 TypeORM 보다 대략 1.5배 느릴뿐, 그 어떤 라이브러리처럼 20,000 배씩 느린게 아니니까요

TaeyoonKwon commented 8 months ago

답변 감사합니다. 저 역시 매우 동의하는 바 입니다.

저도 프리즈마가 안정성이나 유지보수 측면에서 상당히 뛰어나고 느껴 퍼포먼스 감안하고 최근 도입하였습니다.

아 그리고 반박을 하려는 것은 아닙니다만 혹시나 인지를 하지 못하셨을 수 있어 말씀 드리면

Drizzle이 Prisma보다 벤치 마크상으로 100배 이상 차이가 나기도 합니다 https://orm.drizzle.team/benchmarks

북미 쪽 커뮤에서는 프리즈마 도입이 성능 이슈로 Controversial 하다보니 저도 고민을 많이 했던터라

삼촌님의 의견을 얻어보고 싶었습니다.

저는 그래도 스타트업 레벨에서는 안정성과 마이그레이션 편의성이 훨씬 중요하다 생각하여

프리즈마가 충분히 가치있다 생각합니다.