Prisma를 활용하여 GraphQL에 MySQL DB 연동하기

박성수·2023년 2월 5일
1
post-thumbnail

사용 API : GraphQL
사용 Database : MySQL
사용 ORM : Prisma

이 포스팅은 Prisma에 대해 깊게 다루지 않습니다....!!!!

ORM이 뭔지도 몰랐는데, 내가 사용하려는 GraphQL과 MySQL을 연결하려면 ORM이라는 것이 필요하다는 걸 알게되었다..

무작정 시도한다고 되는게 아니었다..

ORM이 그래서 무엇인가..알아봤다.

Object-Relational-Mapping으로 객체와 관계형 데이터를 자동으로 연결해주는 도구이다.
백엔드에서 TypeORM이라는 단어를 많이 듣기는 했는데 ,, 이런 역할을 해주는 도구인지는 처음 알게되었다..

ORM의 종류에는 TypeORM, Sequelize, Prisma 등 이 있는데,
그 중 Prisma가 사용하기 편리하고 접근성이 낮다고 해서 도입해보았다..

프로젝트 세팅

npm i apollo-server graphql
npm i -D nodemon
npm i prisma @prisma/client

npx prisma init

prisma를 다운받고 프로젝트에 init하면
.env파일과 prisma폴더가 생성된다.

.env파일로 가면 DB에 접근할 URL이 있는데 여기를 조금 수정해야한다.

DATABASE_URL = "postgresql://johndoe:randompassword@localhost:5432/mydb?schema=public"

처음에 위와 같이 설정 되어있다. 아래에 맞게 변경하면 된다.

DATABASE_URL="사용할DB종류://사용자이름:DB접근비밀번호@localhost:/사용할 DB명?schema=public"

prisma 스키마 작성

그 다음 prisma 폴더로 오면 schema.prisma파일이 있다.

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

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

provider부분이 postgressql로 되어있었는데 mysql을 사용하기 때문에 바꿔주었다.

그 밑에 내가 만드려는 모델의 스키마를 작성해준다.

일단은 다음과 같이 간단하게 작성해주었다.

model User {
  id Int @default(autoincrement()) @id
  user_name String
}

migration

다음 내가 모델링한대로 MySQL에 테이블을 추가하기 위해 migration을 해야한다.
다음 명령어를 입력한다.

npx prisma migrate dev

MySQL을 확인하면 정상적으로 테이블이 추가된 것을 확인할 수 있다.

GraphQL 스키마와 resolvers작성

import { ApolloServer, gql } from "apollo-server";
import { PrismaClient } from "@prisma/client";

const client = new PrismaClient();

const typeDefs = gql`
  type User {
    id: ID!
    user_name: String!
  }
  type Query {
    User: [User]
  }
`;

const resolvers = {
  Query : {
    User: (_parent, _args, _context ) => { return client.User.findMany()} 
  }
}

const server = new ApolloServer({ typeDefs , resolvers});

server.listen().then(({ url }) => {
  console.log(`Running on ${url}`);
});

typeDefs는 GraphQL에서 사용하는 스키마인데, prisma에서 작성해 준 것과 똑같이 작성해준다.(타입지정하는 방법은 서로 다르기 때문에 각자의 방법에 맞게)

다음과 같이 설정한다음 터미널에서 mysql에 db를 추가해봤다.
(apoll-server에서 정상적으로 불러올 수 있나 확인하기 위해)

드디어 성공...

profile
Front-end Developer

0개의 댓글