Skip to main content

Command Palette

Search for a command to run...

TypeORM vs Prisma

ORM 선택하기

Published
4 min readView as Markdown
TypeORM vs Prisma

나는 그동안 TypeORM만 사용해왔지만,
이번에 Amor Petmeeting 이라는 개인 프로젝트를 기획하면서 기술스택을 좀 더 깊이있게 알아보고 정하는것을 목표로 하고 있어서 첫번째로 ORM을 알아보려고 한다!!


🎈ORM이란 ?

ORM(Object-Relational Mapping)은 프로젝트와 데이터베이스 간의 연결을 돕는 중요한 도구입니다. 이를 통해 개발자는 데이터베이스 연결과 쿼리 수행을 손쉽게 할 수 있습니다. ORM의 주요 장점 중 하나는 클래스 속성을 직접 데이터베이스에 테이블로 만드는 대신 자동으로 테이블로 변환해준다는 것입니다. 또한, ORM에 내장된 다양한 쿼리를 활용하여 별도의 데이터베이스 코드 작성 없이 데이터베이스 작업을 진행할 수 있습니다.

ORM은 프로세스의 첫 단계에서 엔티티의 속성을 특정 형식(예: XML)으로 매핑하고 이를 기록합니다. 이후에는 구성 파일에 저장된 연결 정보를 이용하여 데이터베이스에 접속하고, 저장된 정보를 바탕으로 쿼리를 수행하여 필요한 테이블들을 생성합니다.

이러한 방식은 데이터베이스 관리를 보다 효율적이고 오류 가능성이 적은 방식으로 전환할 수 있게 해, 개발 과정을 단순화하고 효율을 극대화합니다.

ORM의 장점과 단점

장점:

  1. 데이터베이스 독립성: ORM은 사용 중인 데이터베이스에 종속되지 않습니다. 이로 인해 다른 데이터베이스로의 전환 작업이 간소화됩니다.

  2. 자동화와 오류 감소: ORM의 자동화 기능은 데이터베이스 작업 시 오류 발생 가능성을 줄여줍니다.

  3. 언어 다양성 지원: 다양한 프로그래밍 언어를 지원하여, 개발자가 선호하는 언어로 원하는 데이터베이스를 활용할 수 있습니다.

  4. 사용자 정의 쿼리 지원: ORM은 사용자 정의 쿼리를 지원하여 개발자가 필요에 따라 자체 쿼리를 사용할 수 있게 해줍니다.

단점:

  1. 데이터베이스-코드 불일치 문제: ORM을 사용하여 엔티티를 삭제하더라도 데이터베이스의 해당 테이블이 자동으로 삭제되지 않습니다. 이로 인해 코드와 데이터베이스 간 불일치 문제가 발생할 수 있습니다.

  2. 데이터 중복 및 일관성 문제: 기존 엔티티의 이름이 변경될 경우 새로운 테이블이 생성되며, 기존 테이블은 그대로 유지되어 데이터가 분산되어 저장됩니다.

  3. 유형 제한: ORM이 지원하는 데이터 유형이 제한적일 수 있어, 데이터를 보다 제한적인 방식으로 저장해야 할 수도 있습니다.

  4. 성능 저하: ORM의 아키텍처는 특정 상황에서 성능 저하를 일으킬 수 있습니다.


🎈TypeORM vs Prisma

TypeORM

TypeORM의 주요 개념은 code-first 패러다임을 사용한다는 것입니다.

code-first
코드를 먼저 작성한다는 것입니다. 구체적으로는 엔티티 클래스를 작성하고, 해당 클래스와 그 안의 필드에 데코레이터를 추가하여 ORM에 클래스 레이아웃을 설명합니다. 그러면 ORM은 이 데코레이터로부터 제공받은 데이터를 활용하여 클래스를 데이터베이스 데이터로 매핑합니다.

이 방식은 PHP와 Symfony 세계의 Doctrine, Java와 Spring 세계의 Hibernate가 일반적으로 하는 작업과 유사합니다. 필요한 경우 TypeORM은 별도의 파일에서도 매핑을 수행할 수 있지만, 일반적으로는 문서에서 데코레이터 사용을 권장하고 있습니다.

장점

  • 복잡한 프로젝트 구조에 모듈화하여 통합하기에 적합합니다. 예를 들어, 특정 모듈이 일부 엔티티에만 접근하는 것을 허용할 수 있습니다.

  • NestJS와의 통합성이 매우 뛰어나며, 개인적인 견해로는 Prisma도 마찬가지로 잘 통합됩니다.

  • 때로는 더 최적화된 쿼리를 생성합니다.

  • 마이그레이션은 코드로 작성되며, 사용자 정의 로직을 적용할 수 있는 여지가 있습니다.

단점

  • 자주 발생하는 런타임 타입 오류에 직면할 수 있습니다.

  • CLI의 핵심 부분이라 할 수 있는 데이터 소스 파일에 대한 충분한 문서화가 이루어지지 않았습니다.

  • 이유는 명확하지 않지만, 스키마 불일치가 자주 발생하는 경향이 있습니다.

  • 마이그레이션은 코드로 구성되어 있어, 실제 엔티티를 사용하여 마이그레이션을 방해하는 일이 잦습니다. 마이그레이션 파일에 애플리케이션 코드의 가져오기를 금지하는 것이 좋습니다. 예를 들어, 신입 개발자가 Enum을 가져와 마이그레이션 파일에서 사용하는 일을 방지해야 합니다.

  • 마이그레이션 코드의 가독성이 떨어질 수 있으며, 특히 키 이름을 해석하기 어렵습니다.

  • 때때로 오류 처리가 도움이 되지 않습니다.

Prisma

Prisma는 매핑을 정의하는 방법이 매우 독특합니다. 모든 매핑은 단 하나의 파일, 즉 스키마 파일 안에서 정의됩니다. 이 파일은 보통 'schema.prisma'라고 불리며, 저장소 내 어디에든 위치할 수 있습니다.

이제 흥미로운 부분입니다: 'schema.prisma' 파일에 매핑을 작성하면, Prisma는 모든 엔티티와 리포지토리 클래스 및 함수를 모든 가능한 타입 변형과 함께 자동으로 생성해 줍니다.

이것은 Prisma가 스키마-퍼스트 접근 방식을 사용한다는 것을 의미합니다. 스키마를 작성하면 그에 따라 코드가 생성되고, 필요한 모든 타입 정보도 함께 제공됩니다.

장점

  • 신선한 접근 방식을 제공합니다.

  • 타입 안정성이 매우 뛰어납니다.

  • 오류 보고가 훨씬 더 나아졌습니다.

  • 문서화가 잘 되어 있습니다.

  • 커뮤니티가 더 도움이 되며 지원을 아끼지 않습니다.

  • 코드 생성 기능으로 많은 시간을 절약할 수 있습니다.

  • 마이그레이션에서 단일 API 호출로 여러 개의 중첩된 엔티티를 생성하고 업데이트할 수 있습니다

단점

  • 쿼리 빌더가 전혀 없어서, 고수준 관리 또는 저수준 쿼리 작업만 가능합니다.

  • 타입 오류가 가끔 장황할 수 있으나, 적어도 명확하게 표현됩니다.

  • 특히 처음 사용할 때 클라이언트를 재빌드하는 것을 잊어버리기 쉽습니다. 빌드와 개발 명령어에 포함시키는 것이 좋습니다.

🫵 결정 !!

prisma 란 무엇인가?

조사를 시작할때부터 이번엔 Prisma를 사용해보고 싶어서 Prisma의 장점들을 위주로 찾아봐서 그런지 Prisma의 매력이 확실히 있는 것 같아 보인다!! 그 동안 TypeORM을 계속 사용했지만 이번 프로젝트에서는 Prisma를 사용해 볼 예정이다!