ORM & Prisma

3953 단어 BackendBackend

클라이언트가 express서버한테 요청을 합니다.데이터를 가져오기 위해서는 express 서버랑 mySql 서버 연결이 필요한데, ORM을 사용하면 할 수 있습니다.

ORM (Object Relational Mapping)

데이터도 객체로 관리하면 얼마나 좋을까? 라는 아이디어에서 비롯되었습니다.

class Pet {
	constructor(name, owner, age){
    	this.name = name;
        this.owner = owner;
        this.age = age;
    }
}

라는 클래스를 만들어서 데이터를 만드는 것 어떨까!

직접 mySql에 접속할 필요가 없어졌습니다. 자바스크립트 문법으로 모델링이 가능합니다.

Migrations(이주/이식)

코드로 작성한 클래스를 실제 데이터베이스에 옮기는 과정을 말합니다.

자바스크립트로 만든 모델 => migrations  => 데이터베이스

ORM을 사용하면 쿼리문이 아닌 언어로 작성한 코드를 쿼리문으로 번역해서 명령을 내려줍니다.

한줄 정리

ORM을 사용하면 서버와 데이터베이스 연결이 가능해지고, 데이터베이스를 조작할 때 쿼리문이 아닌 다른 언어로 작성할 수 있습니다. 이 과정을 migrations이라고 합니다.


Prisma

nodeJs와 express 환경에서 사용하기 좋은 ORM은 Prisma입니다. Prisma의 기본적인 사용법을 배워봅시다!

프리즈마 설치

npm install prisma --save-dev
npm install @prisma/client --save-dev

프리즈마 연결

npx prisma init //초기 세팅

prisma 폴더.env설치해 있으면 정상입니다.
prisma 폴더 안에는 schema.prisma가 있는 지 확인합니다.

1️⃣ 데이터베이스와 연결

⎿ schema.prisma

provider를 mysql로 변경합니다.

datasource db {
	provider = "mysql"
  	url      = env("DATABASE_URL")
}

⎿.env

환경 변수를 사용할 수 있게 해줍니다.
자신의 데이터 베이스 url을 작성해줍니다.

DATABASE_URL = "mysql://유저이름:비밀번호@localhoset::3306/Database이름"

2️⃣ 모델링

Data model를 참고하면 문법을 더 자세히 알 수 있습니다.

⎿ schema.prisma

table을 추가하는 방법입니다.

model User {
  id    Int    @id @default(autoincrement())
  title String
  @@map("users")
}

class를 파스타 표기법으로 표현하는 Js의 문법을 위해서 User를 사용하였습니다. 그러나 database의 테이블 이름은 소문자+복수형인 컨벤션을 지키기 위해서 @@map을 사용했습니다.

migrations

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;

추가내용

Relations

1️⃣ 일대일 관계

쿼리문

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)
}
  1. 필드를 알려주는 user 추가하고, @relation을 써줍니다.
  1. pk가 있는 필드에 Fk가 있는 profile를 써줍니다.

일대다 관계일 때도 같은 방식으로 하면 됩니다!

2️⃣ 다대다 관계

table1 ==  table1_table2 === table2

중간 테이블에서 fk를 만들면 됩니다.

좋은 웹페이지 즐겨찾기