인스타그램 클론코딩 2일차 - BE

박병준·2021년 7월 23일
0
post-thumbnail

#1.5 Prisma Client

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

Movie CRUD

// 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 }, }),
    },
};

#1.6 Prisma studio

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


#1.7 Architecture

Divide & conquer

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 를 통해 파일 경로 패턴 정의한다.

  • __filename 은 현재 실행 중인 파일 경로
  • __dirname 은 현재 실행 중인 폴더 경로
    /**/*.typeDefs.js : 모든 폴더의 모든 이름의 typeDefs.js
    **는 폴더, *는 파일을 의미한다.

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가 된다.


#1.8 Dotenv

npm install dotenv
.env를 읽기 위해서는 dotenv설치가 필요하다.

app에서 dotenv를 top에서 실행해야한다.
require('dotenv').config();
process.env.#### 로 환경변수 접근

.gitignore에서 업로드 제외 파일들은 explorer에서 회색 음영처리 된다.

profile
뿌셔뿌셔

0개의 댓글

관련 채용 정보