Object Relational Mapping
Javascript의 객체(Object)와 DB의 관계(Relation)를 Mapping 해주는 도구
Node.js 환경에서는 대표적으로 TypeORM, Prisma, Sequelize 등이 있다.
ODM : Object to Document (NoSQL DB -> Collection -> Document)
ORM : Object to Relation (RDB -> Table -> row)
Mongoose : available only for MongoDB
Prisma : available for many RDB and even for MongoDB (little bit)
ORM 의 장점 :
1. 사용하는 DB를 변경할 경우 (ex: MySQL -> ORACLE)
코드를 일일이 수정할 필요 없이, 연결할 DB가 어떤 종류 DB인지 설정을 바꿔주기만 하면 됨
단점:
1. JOIN, UNION 과 같은 연산자를 동시에 사용하는 복잡한 query를 작성할 경우, ORM을 깊게 이해해야 하는 상황이 발생하고, 이는 SQL을 좀 더 편하게 작성하기 위해서 ORM을 사용한다는 ORM의 사용 이유에 모순되는 상황이다.
쿼리 내부의 쿼리 (서브 쿼리) 를 포함하는 코드 또는 ORM 으로 작성할 수는 있지만, 단점1과 마찬가지로 좀 더 오래 걸리고 많은 이해가 필요하다.
SQL 성능 그 자체를 올려야 할 경우 (많은 데이터를 조회해야 하는 경우) : Raw SQL 쿼리를 사용해서 최적화를 하는 게 더 좋다.
yarn add prisma @prisma/client
prisma > schema.prisma
// prisma 를 사용하기 위한 client의 속성값
generator client {
provider = "prisma-client-js"
}
// 사용하는 RDB가 어떤 종류이고 해당 주소는 어떻게 되는지
datasource db {
provider = "postgresql"
url = env("DATABASE_URL")
}
// Products 라는 이름의 model을 생성
model Products {
productId Int @id @default(autoincrement()) @map("productId")
productName String @unique @map("productName")
price Int @default(1000) @map("price")
info String? @map("info") @db.Text
createdAt DateTime @default(now()) @map("createdAt")
updatedAt DateTime @updatedAt @map("updatedAt")
@@map("Products")
}
맨 왼쪽 : JS에서 Object model이 사용할 key 이름
@id : SQL에서 PRIMARY KEY 와 동일
@unique : SQL에서 UNIQUE 와 동일
@defualt() : () 안에 있는 값을 default 값으로 설정
@default(autoincrement()) : SQL에서 AUTO_INCREMENT 와 동일
@map("") : "" 안에 있는 이름으로 column을 생성
? : NULL을 허용
@db.Text : DB에서 String 타입이 아니라 Text 타입으로 기록
@updatedAt : 실제로 updated 되는 시점을 기록
@@map("") : "" 안에 있는 이름으로 Table 생성
// schema.prisma 파일에 설정된 모델을 바탕으로 MySQL에 정보를 업로드합니다.
npx prisma db push

Prisma는 model을 generate하면, 해당 모델에 대한 정보가 node_modules폴더 내에 있는 Prisma Client에 전달됩니다.
→ 저희가 이전에 사용한 prisma db push도 내부적으로 generate가 실행됩니다.
Prisma Client는 Prisma Schema에 정의한 데이터베이스 모델(model)을 TypeScript 코드로 변환하여, 개발자가 데이터베이스와 상호작용할 수 있게 해주는데요.
이러한 과정을 통해, 데이터베이스를 JavaScript에서 손쉽게 다룰 수 있게 되고, Prisma Schema와 동기화된 Prisma Client를 이용해 데이터베이스를 사용할 수 있게 되는 것입니다.
prisma.users.create({ (중략) })
이때, prisma.users는 Users 모델을 참조합니다. 이는 Prisma가 모델 이름을 소문자로 변환하는 규칙에 따르기 때문입니다. 이렇게 하는 이유는 다음과 같습니다:
일관성: JavaScript/TypeScript의 일반적인 변수 및 속성 네이밍 컨벤션을 따르기 위해서입니다. JavaScript/TypeScript에서는 변수와 속성 이름을 소문자로 시작하는 것이 일반적입니다.
자동 생성: Prisma Client가 생성하는 타입과 메서드는 모델 이름을 소문자로 변환하여 사용합니다. 이는 개발자가 Prisma Client와 상호작용할 때 더 직관적이고 일관된 경험을 제공하기 위함입니다.
따라서, prisma.users와 같은 소문자 이름을 사용하는 것은 Prisma Client의 자동화된 네이밍 규칙 때문입니다.