
Node.js에서 주로 사용되는 ORM은 Sequelize, TypeORM, Prisma가 있다.
Nest는 데이터베이스에 구애받지 않기 때문에 모든 SQL 또는 NoSQL 데이터베이스들과 쉽게 통합할 수 있다. 이 중 Typescrpt에 최적화된 TypeORM, Prisma에 대해 알아보겠다.
ORM
Object는 객체지향언어에서 말하는 객체(object)를 의미함
Relational은 관계형 데이터베이스를 의미함
⇒ 객체과 관계형 데이터베이스를 자동으로 맵핑 시켜주는 기술이 ORM이다.
매핑 역할 해주는 것이 ORM이고 객체를 통해 간접적으로 DB 데이터를 다룸.
만약 SQL을 직접 작성해서 사용하는 프로젝트였으면 코드가 변경 될 때마다 SQL문을 수정해주거나 추가해줘야하는 번거로운 일이 생김
⇒ 즉, ORM을 사용하면 객체 지향적인 코드로 DB조작이 가능해지고, DB 종류에 상관없이 동일한 코드로 MySQL, PostgreSQL 등 다양한 DBMS를 사용할 수 있다.
특징
**SQL 예시**
SELECT * FROM users WHERE age > 20;
**TypeORM 예시**
const users = await userRepository.find({
where: { age: MoreThan(20) },
});
TypeORM 작성 패턴은 두 가지가 존재한다.
Active Record Pattern
import { BaseEntity, Entity, PrimaryGeneratedColumn, Column } from "typeorm"
@Entity()
export class User extends BaseEntity {
@PrimaryGeneratedColumn()
id: number
@Column()
firstName: string
@Column()
lastName: string
@Column()
isActive: boolean
static findByName(firstName: string, lastName: string) {
return this.createQueryBuilder("user")
.where("user.firstName = :firstName", { firstName })
.andWhere("user.lastName = :lastName", { lastName })
.getMany()
}
}
→ User 모델을 이용해 user 객체를 이미 구현된 메서드로 간단하게 crud 작성 가능
Data Mapper Pattern
import { Entity, PrimaryGeneratedColumn, Column } from "typeorm"
@Entity()
export class User {
@PrimaryGeneratedColumn()
id: number
@Column()
firstName: string
@Column()
lastName: string
@Column()
isActive: boolean
}
그래서 TypeORM의 대표적인 별명중 하나는 anyORM이다.
타입체크를 제대로 해주지 않아, 컴파일 환경에서 에러를 검출하지 못하고, 런타임 환경에서 에러가 발생하게 되는 경우가 생기기 때문이다.
즉, 기존의 ORM과 달리 쿼리 없이 prisma-client의 내장 함수로 완전히 작동이 가능하다. 예를 들어 Java의 JPA의 경우 JPA Query Factory나 EntityManager를 통해 쿼리를 보내지만 복잡한 쿼리나 커스텀이 필요한 경우 JPQL, QueryDSL 등 직접 쿼리를 작성하여 쿼리를 생성하는데, Prisma는 이 과정을 없앰으로써 기존의 ORM보다 개발자의 생산성을 높이면서 동시에 쿼리에 대한 제어는 더 높다.
사용하는 이유
기존 ORM과 다른 작동방식 때문!!
특징
schema.prisma파일을 기반으로 타입 안전한 코드와 CRUD API를 자동 생성함.schema.prisma 파일의 변경 사항을 기반으로 데이터베이스 스키마를 자동으로 업데이트할 수 있어 개발 및 배포가 수월해짐model User {
id Int @id @default(autoincrement())
name String
email String @unique
}
//schema.prisma
Prisma 스키마 파일을 사용해 모델을 정의함
데이터베이스 구조를 명확하게 정의함
Prisma가 추구하는 것은 "개발자의 생산성" 이다.
⇒ 그래서 스타트업 환경에서는 빠른 개발과 시장 출시가 핵심이기에 많은 곳에서 Prisma를 활용해 데이터 모델을 빠르게 구축하고 복잡한 데이터베이스 관계를 쉽게 관리하고 있음. 특히 전자 상거래, 소셜 미디어에서 많이 쓰임
추가로 Prisma 자체가 창업자가 GraphQL 개발자와 협업하여 개발한 기술이기 때문에 GraphQL과의 궁합이 좋다
TypeORM과 Prisma는 같은 ORM이지만 작동 방식은 매우 다르다.
TypeORM은 SQL과 유사한 쿼리 작성 및 설정을 요구하여 데이터베이스 접근에 더 가깝게 설계된 반면, Prisma는 데이터베이스와 상호 작용할 때 직관적이고 간결하게 코드를 작성할 수 있도록 개발자의 편의성을 고려해 더 높은 추상화 수준을 제공한다.