클라이언트가 express서버한테 요청을 합니다.데이터를 가져오기 위해서는 express 서버랑 mySql 서버 연결이 필요한데, ORM을 사용하면 할 수 있습니다.
데이터도 객체로 관리하면 얼마나 좋을까? 라는 아이디어에서 비롯되었습니다.
class Pet { constructor(name, owner, age){ this.name = name; this.owner = owner; this.age = age; } }
라는 클래스를 만들어서 데이터를 만드는 것 어떨까!
직접 mySql에 접속할 필요가 없어졌습니다. 자바스크립트 문법으로 모델링이 가능합니다.
코드로 작성한 클래스를 실제 데이터베이스에 옮기는 과정을 말합니다.
자바스크립트로 만든 모델 => migrations => 데이터베이스
ORM을 사용하면 쿼리문이 아닌 언어로 작성한 코드를 쿼리문으로 번역해서 명령을 내려줍니다.
ORM을 사용하면 서버와 데이터베이스 연결이 가능해지고, 데이터베이스를 조작할 때 쿼리문이 아닌 다른 언어로 작성할 수 있습니다. 이 과정을 migrations이라고 합니다.
nodeJs와 express 환경에서 사용하기 좋은 ORM은 Prisma입니다. Prisma의 기본적인 사용법을 배워봅시다!
프리즈마 설치
npm install prisma --save-dev npm install @prisma/client --save-dev
프리즈마 연결
npx prisma init //초기 세팅
prisma 폴더와 .env설치해 있으면 정상입니다.
prisma 폴더 안에는 schema.prisma가 있는 지 확인합니다.
provider를 mysql로 변경합니다.
datasource db { provider = "mysql" url = env("DATABASE_URL") }
환경 변수를 사용할 수 있게 해줍니다.
자신의 데이터 베이스 url을 작성해줍니다.DATABASE_URL = "mysql://유저이름:비밀번호@localhoset::3306/Database이름"
Data model를 참고하면 문법을 더 자세히 알 수 있습니다.
table을 추가하는 방법입니다.
model User { id Int @id @default(autoincrement()) title String @@map("users") }
class를 파스타 표기법으로 표현하는 Js의 문법을 위해서 User를 사용하였습니다. 그러나 database의 테이블 이름은 소문자+복수형인 컨벤션을 지키기 위해서
@@map
을 사용했습니다.
npx prisma migrate dev --name 파일이름
연결해둔 database에 잘 들어갔는지 확인하고, prisma 폴더 아래에 날짜_파일이름
으로 구성된 폴더가 있으면 성공입니다. 그 아래 migration.sql을 보면 쿼리문으로 잘 바뀐 모습을 볼 수 있습니다.
-- CreateTable CREATE TABLE `users` ( `id` INTEGER NOT NULL AUTO_INCREMENT, `title` VARCHAR(191) NOT NULL, PRIMARY KEY (`id`) ) DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
추가내용
쿼리문
CREATE TABLE "User" ( id SERIAL PRIMARY KEY ); CREATE TABLE "Profile" ( id SERIAL PRIMARY KEY, "userId" INTEGER NOT NULL UNIQUE, FOREIGN KEY ("userId") REFERENCES "User"(id) );
prisma
model User { id Int @id @default(autoincrement()) profile Profile? }
model Profile { id Int @id @default(autoincrement()) user User @relation(fields: [userId], references: [id]) userId Int // relation scalar field (used in the `@relation` attribute above) }
일대다 관계일 때도 같은 방식으로 하면 됩니다!
table1 == table1_table2 === table2
중간 테이블에서 fk를 만들면 됩니다.