본문 바로가기
다국어 이상형 월드컵 프로젝트

Planet Scale + Prisma 도입과정

by 우주속공간 2023. 9. 5.

🌱 Planet Scale이란?


MYSQL과 호환되는 데이터베이스 플랫폼. 서버리스 DB 플랫폼이라서 우리가 서버를 관리하고 유지보수할 필요가 없다.

그 외에 non-blocking, autoscaling, git과 비슷한 브랜치 기능등을 지원하여 유용하다.

Planet Scale의 대표적인 기능

  • Non-blocking 스키마 변경
  • Branching workflow

Non-blocking 스키마 변경

이 기능은 데이터베이스나 테이블을 블록하거나, 잠그거나, 속도를 늦추는 스키마 변경을 방지한다.

스키마 변경과정

→ production(main) 브랜치가 development branch에서 적용하고

→ schema diff를 확인한 후, deploy request를 열어 변경사항을 적용하게 된다.

사용하는 방법은 main 브런치에 safe migrations을 활성화하면 사용할 수 있다.

<aside> 🚨 safe migrations 기능을 활성화해놓은 main브랜치에 바로 스키마를 변경할려고 할 경우 발생하는 오류

</aside>

main이 아닌 test branch에서 스키마를 변경해서 deploy request를 보내면 된다.

Branching workflow

PlanetScale은 두가지 타입의 데이터베이스 브랜치를 제공한다.

  • production branch : main 브랜치에 해당한다. 추가적인 복제본과 자동 백업을 지공하고 safe migrations을 선택적으로 사용할 수 있다.
  • development branch : production 데이터베이스의 스키마를 복사해서 독립된 개발 환경을 만들어준다.

스키마 변경사항을 프로덕션 데이터베이스에 직접 적용하는 대신 데이터베이스의 복사본인 브랜치에서 적용하면서 test할 수 있다.

개발 브런치에서 프로덕션으로 스키마 변경사항을 배포할 준비가 되면 deploy request를 오픈해서 배포 요청을 보낼 수 있다.

배포 요청이 오면 프로덕션에 변경 사항을 배포하기 전에 팀에서 스키마 변경 사항을 보고 의견을 제시하고 승인할 수 있다.

⇒ 깃허브 브랜치 나누는 것처럼 test, 기능 개발 브랜치를 나눠놓고 진행할 수 있다는 장점을 가지고 있다.

위의 기능들을 사용한다면?

  • 데이터베이스의 가용성을 높여준다 ⇒ 스키마 변경이 데이터베이스나 테이블을 블록하거나 잠그지 않기 때문에 production 데이터베이스에 다운타임없이 스키마 변경을 할 수 있다.

스키마 변경이 데이터베이스나 테이블을 블록하거나 잠그지 않는다는 것은, 스키마 변경을 할 때 데이터베이스나 테이블에 대한 접근이 제한되거나 성능이 저하되지 않는다는 것을 의미합니다

예를 들어, 테이블에 새로운 열을 추가하거나 삭제하는 경우, 일반적으로 테이블에 대한 잠금이 발생하고, 다른 작업이 대기 상태가 됩니다. 이러한 잠금은 데이터베이스의 가용성과 성능에 영향을 줄 수 있습니다

  • 스키마 변경의 안정성을 높여준다 ⇒ development branch에 미리 테스트하고 차이점을 확인해 deploy request을 통해 검토하고 승인할 수 있기때문에 실수나 충돌을 방지할 수 있다.
  • 스키마 변경의 편리성을 높여준다 ⇒ 브랜치로 관리할 수 있기때문에 협업과 버전 관리에 쉽다

그외의 기능

  • 스키마 변경 내용 되돌리기 : 배포 후 작성된 데이터를 손실하지 않고 최근 배포된 스키마 변경을 되돌릴 수 있는 기능
  • 샤딩 , 무제한 연결로 확장 : PlanetScale을 사용하면 단일 데이터베이스를 분할하고 여러 데이터베이스에 걸쳐 데이터를 분할할 수 있다 ⇒ 데이터베이스에 대한 부하를 줄일 수 있다.
  • insights 대시보드 제공 : 대화형 그래프를 통해 쿼리 지연 시간, 초당 쿼리 수, 읽은 행 수 및 시간에 따라 작성된 행 수를 한눈에 볼 수 있다.

설치 및 연결 과정


로컬 컴퓨터에 planetscale 설치

brew install planetscale/tap/pscale
brew install mysql-client

.env 파일에 데이터베이스 연결주소 적기

pscale에 로그인

pscale auth login 

💡 Prisma란?


orm 중 하나로 특이한 점이 nodejs와 typescript orm이라는 것이다.

Prisma에서 Client와 Migrate, 이 두 가지는 핵심 기능이 있다.

  • Prisma Client는 여러 언어와 데이터베이스에서 원활하게 작동합니다. SQL을 적게 작성하여 더 빠르게 전달할 수 있습니다. 또한 type-safe API로 실수를 피할 수 있습니다.

이 기능을 타입을 직접적으로 다 명시하지 않아도 prisma client기능을 통해서 우리가 사용한 데이터베이스 스키마의 타입이나 구성요소를 파악해서 더 쉽게 명령문을 내리게 해준다.

⇒ Prisma Client를 설정하려면 데이터베이스 연결, Prisma Client Generator 및 하나 이상의 모델이 포함된 Prisma 스키마 파일이 필요

스키마 파일

generator client {
  provider = "prisma-client-js"
}

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

model User {
  id        Int      @id @default(autoincrement())
  createdAt DateTime @default(now())
  email     String   @unique
  name      String?
}

model Game {
  id        Int      @id @default(autoincrement())
  createdAt DateTime @default(now())
  gameTitle     String?
  content   String?
  left     String? @db.Text
  leftImage String? @db.Text
  right   String?   @db.Text
  rightImage    String? @db.Text 
}

미리 만들어놓은 스키마 파일을 통해 자동으로 db 스키마에 맞게 클라이언트가 생성되어서 쉽게 쿼리 기능을 사용할 수 있다. 또한 데이터베이스 스키마에 맞게 자동으로 생성되어 type safety도 높다.

npm install prisma --save-dev
npm install @prisma/client
npx prisma init //초기 설정파일

prisma generate
// node_modules/.prisma/client 디렉토리에 생성하게 됩니다. 이렇게 되면 PrismaClient를 인스턴스화한 후 코드에서 쿼리 전송을 시작할 수 있습니다

npx prisma db push
  • Prisma Migrate는 Prisma 스키마 변경사항을 사용하여 전체적으로 사용자 정의 가능한 데이터베이스 스키마 마이그레이션을 자동으로 생성합니다. 마이그레이션은 스키마 구조를 수정한 변경사항들을 모아둔 것이다.

⇒ PlanetScale로 작업할 때는 마이그레이션 대신 db push를 사용하는 것이 좋다. PlanetScale가 기본적으로 Deploy Request를 제공하고 있기 때문이다 db push는 마이그레이션에 상호작용하거나 의존하지 않는다.

  • prisma studio: 데이터베이스 데이터와 구조를 보여주는 어드민 페이지.

초기 데이터 배포, 다운 받기


✅ seed 기능 사용

: seeding 기능을 활용하면 편리하고 빠르게 데이터를 추가해 줄 수 있다,

스크립트를 작성해서 반복해서 추가해줄 수 있고 새로운 브런치가 생겼을때 쉽게 테스트 데이터를 추가할 수 있다.

package.json 수정

{
  // ... 생략
  "prisma": {
    "seed": "ts-node --compiler-options {\\"module\\":\\"CommonJS\\"} prisma/seed.ts"
  },
}

seed 기능 실행 명령어

# 아래 코드로 seed를 생성합니다.
npx prisma db seed

# 혹은 리셋시키면 자동으로 seed가 추가됩니다. ( 단, 이전에 넣었던 모든 데이터가 날아가고 seed만 남습니다. )
npx prisma migrate reset

seed 코드 작성 : 데이터베이스 정리 후 더미데이터를 db에 넣기

현재는 미리 만들어놓은 데이터를 넣지만 데이터를 생성하는 API를 사용해서 더미데이터를 만들 수 있을 것 같음.

const { PrismaClient } = require('@prisma/client');
import dataList from '../data.js';
const prisma = new PrismaClient();

const load = async () => {
  try {
    await prisma.game.deleteMany();
    console.log('Deleted records in game table');
    await prisma.game.createMany({
      data: dataList,
    });
    console.log('Added game data');
  } catch (e) {
    console.error(e);
    process.exit(1);
  } finally {
    await prisma.$disconnect();
  }
};

load();

팀원들과 데이터를 쉽게 공유하는 법


  • 초기 더미데이터의 경우 seed 기능을 활용해서 다운받기 - 새로운 데이터베이스를 만들거나했을때 자동으로 받아올려면 pro plan으로 사용해야함. 유료

npx prisma migrate dev

````npx prisma migrate reset`

  • 브랜치 기능 사용하기

main 말고 개발 브런치 생성 후 새로운 테이블을 만들거나 수정해서 deploy요청을 보내 팀원들과 쉽게 공유할 수 있음.

🌱 Planet Scale이란?


MYSQL과 호환되는 데이터베이스 플랫폼. 서버리스 DB 플랫폼이라서 우리가 서버를 관리하고 유지보수할 필요가 없다.

그 외에 non-blocking, autoscaling, git과 비슷한 브랜치 기능등을 지원하여 유용하다.

Planet Scale의 대표적인 기능

  • Non-blocking 스키마 변경
  • Branching workflow

Non-blocking 스키마 변경

이 기능은 데이터베이스나 테이블을 블록하거나, 잠그거나, 속도를 늦추는 스키마 변경을 방지한다.

스키마 변경과정

→ production(main) 브랜치가 development branch에서 적용하고

→ schema diff를 확인한 후, deploy request를 열어 변경사항을 적용하게 된다.

사용하는 방법은 main 브런치에 safe migrations을 활성화하면 사용할 수 있다.

<aside> 🚨 safe migrations 기능을 활성화해놓은 main브랜치에 바로 스키마를 변경할려고 할 경우 발생하는 오류

</aside>

main이 아닌 test branch에서 스키마를 변경해서 deploy request를 보내면 된다.

Branching workflow

PlanetScale은 두가지 타입의 데이터베이스 브랜치를 제공한다.

  • production branch : main 브랜치에 해당한다. 추가적인 복제본과 자동 백업을 지공하고 safe migrations을 선택적으로 사용할 수 있다.
  • development branch : production 데이터베이스의 스키마를 복사해서 독립된 개발 환경을 만들어준다.

스키마 변경사항을 프로덕션 데이터베이스에 직접 적용하는 대신 데이터베이스의 복사본인 브랜치에서 적용하면서 test할 수 있다.

개발 브런치에서 프로덕션으로 스키마 변경사항을 배포할 준비가 되면 deploy request를 오픈해서 배포 요청을 보낼 수 있다.

배포 요청이 오면 프로덕션에 변경 사항을 배포하기 전에 팀에서 스키마 변경 사항을 보고 의견을 제시하고 승인할 수 있다.

⇒ 깃허브 브랜치 나누는 것처럼 test, 기능 개발 브랜치를 나눠놓고 진행할 수 있다는 장점을 가지고 있다.

위의 기능들을 사용한다면?

  • 데이터베이스의 가용성을 높여준다 ⇒ 스키마 변경이 데이터베이스나 테이블을 블록하거나 잠그지 않기 때문에 production 데이터베이스에 다운타임없이 스키마 변경을 할 수 있다.

스키마 변경이 데이터베이스나 테이블을 블록하거나 잠그지 않는다는 것은, 스키마 변경을 할 때 데이터베이스나 테이블에 대한 접근이 제한되거나 성능이 저하되지 않는다는 것을 의미합니다

예를 들어, 테이블에 새로운 열을 추가하거나 삭제하는 경우, 일반적으로 테이블에 대한 잠금이 발생하고, 다른 작업이 대기 상태가 됩니다. 이러한 잠금은 데이터베이스의 가용성과 성능에 영향을 줄 수 있습니다

  • 스키마 변경의 안정성을 높여준다 ⇒ development branch에 미리 테스트하고 차이점을 확인해 deploy request을 통해 검토하고 승인할 수 있기때문에 실수나 충돌을 방지할 수 있다.
  • 스키마 변경의 편리성을 높여준다 ⇒ 브랜치로 관리할 수 있기때문에 협업과 버전 관리에 쉽다

그외의 기능

  • 스키마 변경 내용 되돌리기 : 배포 후 작성된 데이터를 손실하지 않고 최근 배포된 스키마 변경을 되돌릴 수 있는 기능
  • 샤딩 , 무제한 연결로 확장 : PlanetScale을 사용하면 단일 데이터베이스를 분할하고 여러 데이터베이스에 걸쳐 데이터를 분할할 수 있다 ⇒ 데이터베이스에 대한 부하를 줄일 수 있다.
  • insights 대시보드 제공 : 대화형 그래프를 통해 쿼리 지연 시간, 초당 쿼리 수, 읽은 행 수 및 시간에 따라 작성된 행 수를 한눈에 볼 수 있다.

설치 및 연결 과정


로컬 컴퓨터에 planetscale 설치

brew install planetscale/tap/pscale
brew install mysql-client

.env 파일에 데이터베이스 연결주소 적기

pscale에 로그인

pscale auth login 

💡 Prisma란?


orm 중 하나로 특이한 점이 nodejs와 typescript orm이라는 것이다.

Prisma에서 Client와 Migrate, 이 두 가지는 핵심 기능이 있다.

  • Prisma Client는 여러 언어와 데이터베이스에서 원활하게 작동합니다. SQL을 적게 작성하여 더 빠르게 전달할 수 있습니다. 또한 type-safe API로 실수를 피할 수 있습니다.

이 기능을 타입을 직접적으로 다 명시하지 않아도 prisma client기능을 통해서 우리가 사용한 데이터베이스 스키마의 타입이나 구성요소를 파악해서 더 쉽게 명령문을 내리게 해준다.

⇒ Prisma Client를 설정하려면 데이터베이스 연결, Prisma Client Generator 및 하나 이상의 모델이 포함된 Prisma 스키마 파일이 필요

스키마 파일

generator client {
  provider = "prisma-client-js"
}

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

model User {
  id        Int      @id @default(autoincrement())
  createdAt DateTime @default(now())
  email     String   @unique
  name      String?
}

model Game {
  id        Int      @id @default(autoincrement())
  createdAt DateTime @default(now())
  gameTitle     String?
  content   String?
  left     String? @db.Text
  leftImage String? @db.Text
  right   String?   @db.Text
  rightImage    String? @db.Text 
}

미리 만들어놓은 스키마 파일을 통해 자동으로 db 스키마에 맞게 클라이언트가 생성되어서 쉽게 쿼리 기능을 사용할 수 있다. 또한 데이터베이스 스키마에 맞게 자동으로 생성되어 type safety도 높다.

npm install prisma --save-dev
npm install @prisma/client
npx prisma init //초기 설정파일

prisma generate
// node_modules/.prisma/client 디렉토리에 생성하게 됩니다. 이렇게 되면 PrismaClient를 인스턴스화한 후 코드에서 쿼리 전송을 시작할 수 있습니다

npx prisma db push
  • Prisma Migrate는 Prisma 스키마 변경사항을 사용하여 전체적으로 사용자 정의 가능한 데이터베이스 스키마 마이그레이션을 자동으로 생성합니다. 마이그레이션은 스키마 구조를 수정한 변경사항들을 모아둔 것이다.

⇒ PlanetScale로 작업할 때는 마이그레이션 대신 db push를 사용하는 것이 좋다. PlanetScale가 기본적으로 Deploy Request를 제공하고 있기 때문이다 db push는 마이그레이션에 상호작용하거나 의존하지 않는다.

  • prisma studio: 데이터베이스 데이터와 구조를 보여주는 어드민 페이지.

초기 데이터 배포, 다운 받기


✅ seed 기능 사용

: seeding 기능을 활용하면 편리하고 빠르게 데이터를 추가해 줄 수 있다,

스크립트를 작성해서 반복해서 추가해줄 수 있고 새로운 브런치가 생겼을때 쉽게 테스트 데이터를 추가할 수 있다.

package.json 수정

{
  // ... 생략
  "prisma": {
    "seed": "ts-node --compiler-options {\\"module\\":\\"CommonJS\\"} prisma/seed.ts"
  },
}

seed 기능 실행 명령어

# 아래 코드로 seed를 생성합니다.
npx prisma db seed

# 혹은 리셋시키면 자동으로 seed가 추가됩니다. ( 단, 이전에 넣었던 모든 데이터가 날아가고 seed만 남습니다. )
npx prisma migrate reset

seed 코드 작성 : 데이터베이스 정리 후 더미데이터를 db에 넣기

현재는 미리 만들어놓은 데이터를 넣지만 데이터를 생성하는 API를 사용해서 더미데이터를 만들 수 있을 것 같음.

const { PrismaClient } = require('@prisma/client');
import dataList from '../data.js';
const prisma = new PrismaClient();

const load = async () => {
  try {
    await prisma.game.deleteMany();
    console.log('Deleted records in game table');
    await prisma.game.createMany({
      data: dataList,
    });
    console.log('Added game data');
  } catch (e) {
    console.error(e);
    process.exit(1);
  } finally {
    await prisma.$disconnect();
  }
};

load();

팀원들과 데이터를 쉽게 공유하는 법


  • 초기 더미데이터의 경우 seed 기능을 활용해서 다운받기 - 새로운 데이터베이스를 만들거나했을때 자동으로 받아올려면 pro plan으로 사용해야함. 유료

 

  • 브랜치 기능 사용하기

main 말고 개발 브런치 생성 후 새로운 테이블을 만들거나 수정해서 deploy요청을 보내 팀원들과 쉽게 공유할 수 있음.