client는 Database와 어떻게 말하는가 이다.
client 는 node_modules에 존재
node_modules/@prisma/client
typedefinition은 수동으로 schema에 작성한대로 적용해야한다.
required 표기법
- *.prisma - > (required) String , (not required) String?
- typedefs.js -> (required) String! , (not required) String
// server.js
import { PrismaClient } from "@prisma/client";
import { ApolloServer, gql } from "apollo-server";
const client = new PrismaClient();
const typeDefs = gql`
type Movie{
id: Int!
title: String!
year: Int!
genre: String
createdAt: String!
updatedAt: String!
}
type Query{
movies: [Movie]
movie(id: Int!): Movie
}
type Mutation{
createMovie(title: String! year: Int! genre: String): Movie!
deleteMovie(id: Int!): Movie
updateMovie(id: Int! year: Int): Movie
}
`;
const resolvers = {
Query: {
movies: () => client.movie.findMany(),
movie: (_, { id }) => client.movie.findUnique({ where: { id }, }),
},
Mutation: {
createMovie: (_, { title, year, genre }) =>
client.movie.create({
data: {
title,
year,
genre
},
}),
deleteMovie: (_, { id }) =>
client.movie.delete({ where: { id }, }),
updateMovie: (_, { id, year }) =>
client.movie.update({ where: { id }, data: { year }, }),
},
};
prisma studio는 visual editor이다.
npx prisma studio
prisma studio is a visual editor for the data. (default port : 5555)
filter : lt(미만), lte(이하), gt(초과), gte(이상) l = less, g = greater , e = equal
type, query, mutation 을 domain별로 독립된 파일로 관리한다.
client.js (prisma client를 초기화, 호스팅)
schema에서 typeDefs와 resolvers(query, mutation)을 import
(각 typedefs와 resolver파일들은 client를 기본적으로 import해야함)
폴더구조에서 모든 typedefs와 resolver파일들을 불러오기 위해 graphql-tools를 사용한다
npm i graphql-tools
loadFilesSync 를 통해 파일 경로 패턴 정의한다.
makeExecutableSchema 를 사용하여 typedef와 resolver를 하나의 스키마로 정의한다.
loadfilessync는 각 파일들의 export default들을 불러온다.
// schema.js
import { loadFilesSync, makeExecutableSchema, mergeResolvers, mergeTypeDefs, } from "graphql-tools";
const loadTypes = loadFilesSync(`${__dirname}/**/*.typeDefs.js`);
const loadReslovers = loadFilesSync(`${__dirname}/**/*.{queries,mutations}.js`);
//queries와 mutations사이에 절대 공백이 들어와서는 안된다.
const typeDefs = mergeTypeDefs(loadTypes);
const resolvers = mergeResolvers(loadReslovers);
const schema = makeExecutableSchema({ typeDefs, resolvers });
export default schema;
import client from "../client";
import { client } from "../client";
import할 때 중괄호의 차이가 있다. 위의 경우는 default export만 import한다. 하지만 아래처럼 중괄호해서 가져오면 이름이 client이고 default export하지 않은 해당 모듈의 특정한 member를 import하게 된다. 따라서 아래의 경우는 undefined가 된다.
npm install dotenv
.env를 읽기 위해서는 dotenv설치가 필요하다.
app에서 dotenv를 top에서 실행해야한다.
require('dotenv').config();
process.env.#### 로 환경변수 접근
.gitignore에서 업로드 제외 파일들은 explorer에서 회색 음영처리 된다.