PlanetScale

키브김·2023년 7월 3일
0

NextJS

목록 보기
4/6
post-thumbnail

PlanetScale 이란?
MySql과 호환되는 serverless database platform

  • database platform은 DB를 제공해준다는 의미
  • serverless는 서버가 없다는 의미가 아니라 우리가 서버를 유지할 필요가 없다는 뜻이다.
  • 유지보수, scaling(확장).. 등을 할 필요가 없다.
  • Vitess는 가장 scaling이 뛰어난 opensource database
    • youtube를 scaling하기 위해 구글이 만들어 냄
    • 대기업들이 규모에 맞게 MySql을 scale 할 때 쓰는 방법
    • High Availability → 데이터의 복바본을 저장해주는 기술

# use planetScale

우선 사이트에 접속 후 회원가입을 하자.


_Install

arch -arm64 brew install planetscale/tap/pscale

arch -arm64 brew install mysql-client

M1 사용 중이라면 arch -arm64 명령어를 붙여서 설치 해주어야 한다.


_Vscode pscale Login

pscale auth login

열리는 인터넷 창의 코드와 vscode에서 보여지는 코드가 동일한지 확인하면 자동 로그인 성공

pscale region list

서버 지역 확인


# Database 생성

pscale region list 명령어로 SLUG를 확인 후 아래 [REGION]에 입력.

pscale database create [DB_NAME] --region [REGION] : DB 생성

pscale database delete [DB_NAME] : DB 삭제


# Connect Pscale

보통의 데이터베이스 플랫폼에서 DB를 만들면 암호를 발급해주고 사용자가 암호를 관리해야하는 시스템이다.

이 방법은 위험성이 높다. 깃허브에 실수로 올리거나 누군가 내 장치를 열어 볼 수도 있다.

그래서 두 개의 데이터 베이스를 사용하며 작업할 때는 가짜 데이터베이스를 사용하는 방식을 많이 쓴다.

하지만 planetscale에서는 일종의 보안 터널을 이용할 수 있다.

pscale connect [DB_NAME] pscale 서버와 보안 연결. cli에 주소가 뜬다.

DATABASE_URL="mysql://[URL]/[DB_NAME]/" .env 파일에 위의 주소를 입력해서 설정을 해주면 된다.


# 3306 포트 사용 중

pscale에 연결이 되어있는 상태에서 종료하지 않고 터미널을 종료해버리면 해당 포트는 종료되지 않고 계속 사용중으로 나타나게된다.
그래서 다음 번 연결 시 3306 포트가 아닌 다른 포트 넘버가 지정이되어 URL 을 재설정 해줘야 하는 번거로움이 생기는데, 이 때 3306 포트를 죽이는 방법을 알아보자.

sudo lsof -i :3306
3306 포트를 사용중인 프로세스를 리스트로 나타내 준다.

sudo kill -9 [PID]
3306 포트를 사용중인 프로세스의 아이디를 입력하여 kill 한다.

끝!


# 참조 무결성

PlanetScale은 MySQL과 매우 유사한 Vitess를 사용한다.
Vitess는 MySQL과 Compatible한 DB 언어이며, 확장성에 용의하고 MySQL과는 완전히 다르다.
MySQL에서 진행하는 참조 무결성 검사 를 Vitess 에서는 하지 않는다.

예를 들면 DB에 ID 값이 1~4 인 네개의 유저가 있다.
하지만 ID 값이 5인 유저가 글을 작성했다고 DB에 알려주면 에러가 나지 않는다.
MySQL 외래키를 사용하여 무결성 검사를 진행한다.
글을 작성하는 ID 값이 5인 유저의 존재 유무를 검사하는 것이다.

이 검사를 Vitess가 하지 않지만 대신 prisma 에서 검사를 진행할 수 있다.

schema.prisma 파일에서 relationMode = "prisma"를 추가해주면 된다.


# Push To PlanetScale

npx prisma db push : db push

push 전 보안 연결이 되어있는지 확인하자. pscale connect [DB_NAME]
또한 .env 파일에 URL과 PORT를 정확하게 입력했는지도 확인해야 한다.

planetScale 사이트에 접속해보면 모델이 추가 된 것을 확인할 수 있다.
또한 db push를 하게 되면 client 를 genrate 해준다.


# Prisma Studio

npx prisma studio

prisma 관리자 패널로 db 값을 수정할 수 있다.


# Prisma Client

npm install @prisma/client 프리즈마 클라이언트 설치

npx prisma generate node_modules/prisma/client 생성


prisma clientschema.prisma 파일에서 정의한 DB 모델을 수정하거나 생성 할 수 있다.

prisma generate 명령어로 DB 언어를 타입스크립트로 전환해준다.
이는 npx prisma generate 를 실행하거나 db push 할 때 자동으로 실행된다.

import { PrismaClient } from "@prisma/client";

const client = new PrismaClient();

client.user.create({
  data: {
    email: "hi",
    name: "zz",
  },
});

위 코드처럼 client 를 이용한 DB 값 생성이 가능하므로 절대로 client 는 프론트엔드 단에서 실행시켜서는 안된다.
무조건 백엔드에서 실행시켜야 안전한데, NextJS 는 풀스택을 위한 것들을 갖춘 프레임워크로 백엔드의 기능을 할 수 있다.
바로 아래서 알아보자.


# Using API Server in NextJS

import { NextApiRequest, NextApiResponse } from "next";

export default function handler(req: NextApiRequest, res: NextApiResponse) {
  res.json({
    myname: "kimiiase",
  });
}
/* pages/api/haha.tsx */

pages 폴더에 api 폴더를 만들면 NextJS 에서 api를 만들 준비가 끝났다.

API route를 위한 규칙은 connection handler 함수를 export default 해주면 된다.

NextJS에서는 reqres 매개변수를 지원한다.
해당 변수들을 통해 API route 에서 client 로 정보를 보낼 수 있다.


# API로 유저 생성하기

/* pages/api/haha.tsx */
import { NextApiRequest, NextApiResponse } from "next";
import client from "../../libs/client";

export default async function handler(
  req: NextApiRequest,
  res: NextApiResponse
) {
  await client.user.create({
    data: {
      email: "hi",
      name: "zz",
    },
  });
  res.json({
    myname: "kimiiase",
  });
}
/* libs/client.ts */
import { PrismaClient } from "@prisma/client";

export default new PrismaClient();

new PrismaClient() 메서드로 client를 생성한 다음
api 로 해당 페이지를 로드할 시 유저를 생성하는 코드이다.
clientcreate 함수는 Promise 를 반환하니 async await 를 사용하자.

http://localhost:3000/api/haha 페이지를 로드 해보면 DB에 유저가 생성되고, 전에 실행한 prisma studio 에서 확인할 수 있다.

profile
배움과 익힘을 기록.

0개의 댓글