검색
검색
공개 노트 검색
회원가입로그인
내 서비스 만들기 : 백엔드 서버 (node, express, typescript )

타입스크립트 서버에 prisma 설치 하기 (MySQL 버전)

prisma 설치

prisma (프리즈마) 는 쿼리와 마이그레이션을 쉽게 해주는 툴이다. 관계형 쿼리를 쉽게 해주기 때문에 ORM이라고 부른다. ORM이 너무 편하기 때문에 한 번 쓰면 안쓸 수 가 없다. 그리고 프리즈마는 ORM 중 엄청 인기 있는 툴이다.

자세한 설치 링크는 다음 링크를 참조해 주세요.
Start from scratch with relational databases (15 min) | typescript-mysql

다음 튜토리얼은 처음 DB를 세팅하는 기준으로 만들어졌습니다.

prisma 설치

npm install prisma --save-dev

npx prisma init

prisma/schema.prisma 파일이 생긴다.

이 파일에서 db provider를 mysql로 바꿔준다.

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

.env 파일에서 mysql user의 아이디와 패스워드 그리고 db명을 입력한다.

DATABASE_URL="mysql://johndoe:randompassword@localhost:3306/mydb"

mysql db와 user를 생성하지 않았다면 생성 후 위의 문자를 교체해 주자.

prisma/schema.prisma 파일에서 다음 스키마를 입력해 주자. 실제 데이터베이스에 들어갈 모델이다.

@prisma/schema.prisma

model Post {
  id        Int      @id @default(autoincrement())
  createdAt DateTime @default(now())
  updatedAt DateTime @updatedAt
  title     String   @db.VarChar(255)
  content   String?
  published Boolean  @default(false)
  author    User     @relation(fields: [authorId], references: [id])
  authorId  Int
}

model Profile {
  id     Int     @id @default(autoincrement())
  bio    String?
  user   User    @relation(fields: [userId], references: [id])
  userId Int     @unique
}

model User {
  id      Int      @id @default(autoincrement())
  email   String   @unique
  name    String?
  posts   Post[]
  profile Profile?
}

그 다음 migrate를 해주면 된다.

npx prisma migrate dev --name init

에러 핸들링

다음과 같은 에러가 나올 수 도 있다.

Datasource "db": MySQL database "typeserver" at "127.0.0.1:3306"

Error: P1010

User `typeserver` was denied access on the database `typeserver

이 경우는 mysql 에서 권한을 충분히 주지 않았기 때문에 발생하는 문제이다.

다음은 prisma migrate를 할 때 mysql에서 필요로 하는 권한이다.

  • PostgreSQL - The user must be a super user or have CREATEDB privilege.

  • MySQL - Database user must have CREATE, ALTER, DROP, REFERENCES ON . privileges.

  • SQL Server - The user must be a site admin or have the SERVER securable.

prisma에서 필요한 mysql 권한은 공식 문서에서 확인할 수 있다 : Reference

workbench -> Server -> Users and Privileges에서 필요한 권한을 줬다.

테스트 해보기

그러면 잘 되는지 한번 확인해 보자.

루트 폴더에 테스트로 index.ts 파일을 만든다.

이전 과정에서 ts-node를 설치하지 않았으면 설치해 주자.

npm install typescript ts-node @types/node --save-dev

다음과 같이 클라이언트를 만들고 시험 쿼리를 날려본다.

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

const prisma = new PrismaClient();

async function main() {
  await prisma.user.create({
    data: {
      name: "Alice",
      email: "alice@prisma.io",
      posts: {
        create: { title: "Hello World" },
      },
      profile: {
        create: { bio: "I like turtles" },
      },
    },
  });

  const allUsers = await prisma.user.findMany({
    include: {
      posts: true,
      profile: true,
    },
  });
  console.dir(allUsers, { depth: null });
}

main()
  .then(async () => {
    await prisma.$disconnect();
  })
  .catch(async (e) => {
    console.error(e);
    await prisma.$disconnect();
    process.exit(1);
  });

ts-node로 파일을 실행해 보자.

npx ts-node index.ts

다음과 같이 결과가 나오면 성공이다!

[
  {
    id: 1,
    email: 'alice@prisma.io',
    name: 'Alice',
    posts: [
      {
        id: 1,
        createdAt: 2022-12-07T09:48:17.419Z,
        updatedAt: 2022-12-07T09:48:17.419Z,
        title: 'Hello World',
        content: null,
        published: false,
        authorId: 1
      }
    ],
    profile: { id: 1, bio: 'I like turtles', userId: 1 }
  }
]

다음 시간에는 라우터에 prisma의 CRUD를 연결해 보자.


공유하기
카카오로 공유하기
페이스북 공유하기
트위터로 공유하기
url 복사하기