Skip to content

NestJS ORM으로 무엇을 사용해야 할까?

Seungheon Han edited this page Dec 1, 2024 · 1 revision

NestJS 프로젝트를 진행하면서, 데이터베이스와의 상호작용을 효율적으로 관리하기 위해 ORM(Object Relational Mapping) 도구를 선택해야 한다. 우리 팀의 현재 상황과 요구사항을 고려했을 때, TypeORMPrisma 중 하나를 선택해야 했다.

우리 팀의 상황

  • NestJS 프레임워크 사용
    • NestJS는 TypeScript 기반으로 동작하며 객체 지향 프로그래밍(OOP)을 강조하는 구조를 가지고 있다.
  • 짧은 개발 기간
    • 프로젝트 개발 기간은 6주로 제한적이기 때문에, 초기 설정과 학습 곡선이 높으면 안된다

TypeORM

장점

  1. 객체 지향적 코드 작성:
    • TypeORM은 엔티티 클래스를 정의하여 객체 지향적으로 데이터를 관리할 수 있습니다.
    • NestJS가 제공하는 객체 지향적 설계 철학과 잘 맞아떨어지며, Spring Framework와 유사한 경험을 제공합니다.
  2. NestJS에서 가장 많이 사용되는 ORM:
    • NestJS 공식 문서에서도 TypeORM과의 통합 예제를 제공하며, 많은 프로젝트에서 채택하고 있습니다.
  3. 풍부한 자료:
    • TypeORM은 오랜 기간 사용되었기 때문에, 커뮤니티 리소스와 문제 해결 자료가 풍부합니다.
  4. 유연한 쿼리 작성:
    • 복잡한 쿼리 및 트랜잭션 로직을 작성할 때 강력한 기능을 제공합니다.

단점

  1. 초기 설정 복잡성:
    • TypeORM은 엔티티와 설정 파일을 명시적으로 작성해야 하며, 초기 설정 과정이 복잡할 수 있습니다.
  2. 타입 안정성:
    • Prisma에 비해 타입 체크와 데이터 안전성에서 약간의 부족함이 있을 수 있습니다.

Prisma

장점

  1. 강력한 타입 체킹:
    • Prisma Client는 데이터베이스 스키마에서 자동으로 생성되며, 강력한 타입 안전성을 제공한ㄷ.
  2. 함수형 프로그래밍에 가까운 접근 방식:
    • Prisma는 데이터 접근을 함수 기반으로 처리하며, 간결하고 직관적인 코드를 작성할 수 있습니다.
  3. DB 엔진 활용:
    • Prisma는 자체 DB 엔진을 사용하여 쿼리를 효율적으로 처리하고 결과를 반환합니다.
  4. 빠른 초기 설정:
    • Prisma는 간단한 Schema 파일 작성과 자동화된 Client 생성으로 설정 과정을 크게 단축할 수 있습니다.

단점

  1. NestJS의 객체 지향 철학과의 괴리:
    • Prisma는 객체 지향 프로그래밍보다는 함수형 프로그래밍에 가깝기 때문에, NestJS의 장점을 활용하기 어렵습니다.
  2. Join 연산 부재:
    • Prisma는 데이터베이스에서 Join 문을 지원하지 않고, Select 문을 여러 번 실행한 뒤 엔진에서 데이터를 합칩니다. 이는 성능과 복잡성에 영향을 미칠 수 있습니다.
  3. 커뮤니티와 리소스:
    • TypeORM에 비해 상대적으로 짧은 역사로 인해, 자료나 레퍼런스가 부족할 수 있습니다.

결론

  • Prisma는 NestJS의 객체 지향적 철학을 온전히 살리지 못하며, 함수형 접근 방식으로 인해 NestJS의 구조적 이점을 잃을 수 있습니다. 또한, Join 연산 부재로 인해 복잡한 데이터 관계를 처리하기 어려울 가능성이 있습니다.
  • TypeORM은 NestJS와 완벽히 통합되며, 객체 지향적 코드 작성을 지원하여 Spring이나 NestJS 경험이 있는 개발자들에게 더 익숙합니다.
  • 커뮤니티 리소스와 자료가 풍부하여 문제 해결이 용이하며, NestJS와의 호환성을 극대화할 수 있습니다.

최종 선택: TypeORM

  • 프로젝트의 짧은 개발 기간과 NestJS의 객체 지향적 철학을 최대한 활용하기 위해 TypeORM이 더 적합합니다.
  • 팀원들이 Spring이나 NestJS에 익숙하다면, TypeORM은 배우기 쉬우며, 개발 생산성을 높일 수 있습니다.

👥 팀 강점

🧑‍💻 개발 일지

📌 ALL

📌 FE

📌 BE

💥 트러블 슈팅

📌 FE

📌 BE

🤔 고민

📚 학습 정리

📌 김광현

📌 백지연

📌 전희선

📌 한승헌

🤝 회의록

🗒️ 데일리 스크럼

💬 팀 회고


👨‍👩‍👧‍👦 소개

🌱 문화

🔨 기술 스택

⚙️ 서비스 아키텍쳐

🚧 CI/CD

🌊 Flow

💭 6주를 보내면서

Clone this wiki locally