본문 바로가기

코딩강의/인스타그램클론(expo-노마드코더)

backend 기본 셋업 (2)

🍔 핵심 내용

 

🥑 prisma 설치 및 postgresql 연동

DB ORM prisma를 설치해주고, DB인 postgresql 설치 및 prisma와 연결해보자.

 

다시 설명하자면, ORM은 간접적으로 DB에 접근하는 방식을 뜻한다. (CRUD)

직접 쿼리문을 작성하지 않고, 쉽게 할 수 있다. prisma(ORM 도구) <-> DB(postgresql)

 

 

 

 

위 그림은 파이썬 <-> ORM <-> DB 관계인데, 해당 프로젝트로 하게되면

apollo(graphql)<->ORM(prisma)<->postgresql 이것과 같은거라고 보면 된다.

 

일단, prisma설치를 위해서는, (www.prisma.io/)

공식 사이트의 절차 대로,  아래 2개 명령어를 통해 prisma설치 및 init를 실행한다.

 

 

그 후, postgresql을 공식사이트에서 다운 받은 후, pgadmin4를 실행한다. (GUI)

자세한 설치 방법 및 내용은 노마드코더 #3.4 강의 참조

 

 

 

🍔 코드 리뷰

 

🥑 prisma/schema.prisma

// This is your Prisma schema file,
// learn more about it in the docs: https://pris.ly/d/prisma-schema

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

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

 

위 npx prisma init를 실행하면 1)schema.prisma 파일과 2).env 파일이 생성 된다.

 

이제 prisma를 어떤 db에 연결해줄 것인지에 대해 정의를 해야 하는 것이다. 아래 .env 파일을 보면 그 db의 url을 주소를 알 수 있다.

 

 

🥑.env

# Environment variables declared in this file are automatically made available to Prisma.
# See the documentation for more detail: https://pris.ly/d/prisma-schema#using-environment-variables

# Prisma supports the native connection string format for PostgreSQL, MySQL and SQLite.
# See the documentation for all the connection string options: https://pris.ly/d/connection-strings

DATABASE_URL="postgresql://사용자명:randompassword@localhost:5432/DB명?schema=public"

 

.env 파일은 gitignore에서 이미 ignore처리된 파일이다.

이유는, db 관련해서 프라이빗한 데이터들이 들어가 있기 때문이다.

 


 

 

🍔 핵심 내용 (이번 파트는 error 주의)

 

🥑 prisma migrate

 

prisma에 postresql url을 연결해 주었다. 그리고, migrate을 해주어야 한다. migrate(이주 하다)는 A 에 있는 데이터를 B로 옮기는 것을 뜻한다. 현재 prisma에 model을 셋업해 주었고 그 model 값을 postgresql로 migrate 해주어야 한다. 그 과정에 대해 살펴보자.

 

먼저, model 값을 정의해 준 후 migrate를 해보자. (아래 코드리뷰 참고)

 

model값을 정의 한 후, npx prisma migrate dev --preview-feature를 입력한다. (나중에는 preview부분이 없어 진다고하네요). 

 

window에서는 .env에 있는 url 경로중에 유저이름과 비밀번호를 pgAdmin4에 있는 것과 같게 잘 셋팅해야 한다고 한다. (ㄳ요 drjoey님)

 

 

 

위 내용들이 모두 처리 되면, 아래와 같이 migration 된 폴더 및 파일이 생성 된다.(postgresql sql 구문)

매번 npx prisma migrate dev --preview-feature 명령어를 통해 동기화 해주기 어렵기 때문에, 간단히

package.json의 script에 해당 명령어를 넣어준다. (코드 리뷰 참고)

 

 

** 다른 에러 처리법

 

🍔 코드 리뷰

 

🥑 prisma/schema.prisma

 

// This is your Prisma schema file,
// learn more about it in the docs: https://pris.ly/d/prisma-schema

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

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

model Movie {
  id        Int      @id  @default(autoincrement())
  title     String
  year      Int
  genre     String?
  createdAt DateTime @default(now())
  updatedAt DateTime @updatedAt
}

 

🥑 package.json

  "scripts": {
    "dev": "nodemon --exec babel-node server",
    "migrate": "npx prisma migrate dev --preview-feature" // <-- 추가

  },

 

npm run migrate로 간략히 실행!

 

 


 

🍔 핵심 내용 

 

🥑 graphql의 query과 mutation을 이제 db (postresql)에 연동시켜 보자

이를 위해서는 prisma의 client를 연동시켜주어야 한다. (하단 코드 리뷰 참고)

 

 

🥑 prisma의 필수값과, graphql의 typeDefs의 필수값 사용하는 방법이 다르다.

 

prisma는 디폴트값이 필수 값(required)이고, 선택사항에는(안해도 되는 거) ? 를 붙인다. (아래 String? 참고)

graphql은 디폴트값이 선택 사항이고, 필수 값(required)에는 ! 를 붙인다. (아래 ! 참고) 

 

 

 

 

 

🍔 코드 리뷰

 

🥑 server.js

 

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

const client = new PrismaClient() // client 객체 생성 

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!): Boolean
  }
`;

const resolvers = {
  Query: {
    movies: () => client.movie.findMany(), //여기서 movie는 prisma에서 정의한 schema (model) 테이블 값이다.
    movie: (_, {id}) => ({ title: "Hello", year: 2021 }),
  },
  Mutation: { //movie 테이블 값에 데이터를 추가해보자
    createMovie: (_, { title, year, genre }) => client.movie.create({data:{
      title,
      year,
      genre
    }}),
    deleteMovie: (_, { id }) => {
      return true;
    },
  },
};

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

server
  .listen()
  .then(() => console.log("Server is running http://localhost:4000/"));

 

prisma의 client 객체를 생성하였고, query문과 mutation문에 만들어진 client를 연결해주어. client의 db table값인 movie를 연동시켜 주었다. findMany()는 모든 값을 다 가지고 오는 것이고, create({data: {값}})은 테이블 값을 만들어 주는것이다.

table에서 정의되었던 title, year, genre 값을 입력된 인자값에 넣어준다. (같은 naming을 통해 title: title 할 필요없이 1개로 통일)

 

위 코드로, 실제 graphql 서버에서 movie를 create 해보자면 아래와 같이 할 수 있다.

 

이를 query로 호출해서 보자면, (내가 같은 값을 4번 입력해서, 값이 4개 생성됨.) 아래와 같다.

 

다음 주제는, id를 통해서 query로 movie를 찾아보고, mutation을 통해 해당 id에 맞는 movie를 삭제해보자.

 


🍔 핵심 내용 

 

🥑 CRUD (Create, Read, Update, Delete) 기능을 모두 할 수 있다.

 

Read는 query로 간단히 할 수 있고, Create와 Delete는 위에 다루었으며, 이제 Update를 해보자.

 

🥑 npx prisma studio

 

prisma studio는 db를 visual 하게 볼 수 있는 화면이다. pgadmin4 를 사용 안해도 된다. 진짜 깔끔하게 잘되어 있음 ! 

 

그리고, npx prisma studio를 설치 한 후 바로 서버가 실행 되는데, 이를 쉽게 하기 위해 script부분에 추가해주자.

 

 

 

🍔 코드 리뷰

 

🥑 server.js

 

  type Mutation {
    createMovie(title: String!, year: Int!, genre: String): Movie
    deleteMovie(id:Int!): Movie
    updateMovie(id: Int!, year: Int!): Movie
  }
  
  //==> updateMovie 타입 추가
  
  
const resolvers = {
  Query: {
    movies: () => client.movie.findMany(), //여기서 movie는 prisma에서 정의한 schema (model) 테이블 값이다.
    movie: (_, {id}) => client.movie.findUnique({where:{id}})

  },
  Mutation: { //movie 테이블 값에 데이터를 추가해보자
    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 }}),
  },
  
 //==> updateMovie resolver추가. 위 내용대로 update가 진행되면 Movie 데이터인
 updatedAt가 변경 된다.

 

🥑 package.json

  "scripts": {
    "dev": "nodemon --exec babel-node server",
    "migrate": "npx prisma migrate dev --preview-feature",
    "studio": "npx prisma studio" // <-- 추가
  },

 

'코딩강의 > 인스타그램클론(expo-노마드코더)' 카테고리의 다른 글

User module(3)  (0) 2021.03.27
User module(2)  (0) 2021.03.20
User module(1)  (0) 2021.02.19
backend 기본 셋업 (3)  (0) 2021.02.15
backend 기본 셋업 (1)  (0) 2021.02.09