Front-end는 자바스크립트만 사용할 수 있지만, Back-end는 언어도 많고 프레임워크도 많다. 이에 따라 언어별로 ORM 종류도 다양하며(예를 들어 typeORM(for typescript)) 문법도 조금씩 다르다. 하지만 기본적인 개념은 바뀌지 않아 하나를 잘 익히면 다른 것을 배울 때 쉽게 할 수 있다! 그러니 지금은 기본 동작 원리를 파악하는데 초점을 맞춰 공부하자.
ORM을 사용하면 해당 언어에 적합한 객체의 형태로 데이터를 반환해준다는 것을 기억하고, ORM Class와 Database table 사이의 매칭 관계를 살펴보자.
class Dog {
constructor(name, owner, age){
this.name = name;
this.owner = owner;
this.age = age;
}
}
const darling = new Dog('달링이', '우니우니', 7)
이 class를 표로 그리고 그 관계를 파악해보자.
name | owner | age |
---|---|---|
달링이 | 우니우니 | 7 |
테이블을 클래스라고 생각하고, 테이블의 column을 클래스의 속성으로 생각하고, 속성 아래 부터 하나의 행을 하나의 인스턴스라고 생각해보자. 비슷하다! 이렇게 테이블과 column, 그리고 행(데이터)를 클래스(객체)의 특성과 연관지어 사고하는 패러다임이 바로 ORM이다.
Prisma는 Typescript와 Node.js 환경에서 데이터베이스에 대한 접근을 쉽게 할 수 있도록 도와준다. Prisma를 사용하는 이유 중 하나는 Typescript나 GraphQL을 사용할 수 있는 확장성이다. Prisma를 사용해서 raw query를 사용할 때보다 간편하게 데이터베이스의 테이블을 생성해보자.
먼저 알아둬야할 것은 데이터베이스는 결국 sql 문법만 알아 듣는다는 점이다. Prisma 문법으로 작성된 것은 변환 과정(migration)이 꼭 필요하다.
prisma를 사용하기 전에 협업을 위한 github 설정부터 했다.
팀에서 설정
npm install prisma --save-dev
npm install @prisma/client --save
npm install dotenv nodemon -D
[.gitignore 설정]
[Node.js에서 ES6 syntax 사용]
npm install @babel/core @babel/node @babel/preset-env --save-dev nodemon
{"presets":["@babel/preset-env"]}
작성{
...(생략)
"type": "module"
...(생략)
}
따로 설정
git clone 링크
git branch branch_name
git checkout branch_name
npm install
npx prisma init // prisma 초기 세팅
데이터베이스 연결
datasource db {
provider = "mysql"
url = env("DATABASE_URL")
}
.env(환경변수 파일, 숨겨주기 필수!!)
DATABASE_URL = "mysql://USERNAME:PASSWORD@localhost:3306/DATABASE_NAME"
npx prisma migrate dev --name init
//migration을 하면 파일 이름이 11291037891_init과 같이 생성된다.
//init을 상황에 따라 added_users와 같은 방식으로 작성하면 된다.
Migration 과정은 models => migrations => database다. 이 과정을 상황에 따라 models -> migrations, migrations -> database로 분리할 수도 있다. migration만 하고 database를 변경하고 싶지 않을 때는 --create-only를 추가하여 migrate하면 된다. 이후 migrate dev로 database에 반영한다.
빠르게 prisma 문법을 살펴보자.
datasource db {
provider = "mysql"
url = env("DATABASE_URL")
}
-- DATABASE_URL은 .env에 저장해뒀다.
generator client {
provider = "prisma-client-js"
}
model Category {
id Int @id @default(autoincrement())
name String
product Product[]
@@map("categories")
}
model Product {
id Int @id @default(autoincrement())
categoryId Int @map("category_id")
koreanName Int @map("korean_name")
englishName String @map("english_name")
category Category @relation(fields: [categoryId], references: [id])
image Image[]
nutrition Nutrition?
@@map("products")
}
...
//백업
mysqldump -u root -p databaseName > fileName.sql
//복원
mysql -u root -p databaseName < fileName.sql