사용 API : GraphQL
사용 Database : MySQL
사용 ORM : 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 폴더로 오면 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
}
다음 내가 모델링한대로 MySQL에 테이블을 추가하기 위해 migration을 해야한다.
다음 명령어를 입력한다.
npx prisma migrate dev
MySQL을 확인하면 정상적으로 테이블이 추가된 것을 확인할 수 있다.
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에서 정상적으로 불러올 수 있나 확인하기 위해)
드디어 성공...