Prisma와 Docker로 간단한 GraphQL 서버 만들기
해당 글은 prisma-postgres-docker-boilerplate를 기반으로 작성되었습니다.
글을 쓰기 까지
프론트 엔지니어가 토이 프로젝트를 진행할 때 가장 막히는 부분이 바로 백앤드 부분이다. 백앤드는 언어도 다양하고, 프론트앤드와 같은 언어를 쓴다고 Express를 쓴다고, 일이 쉽게 풀리지는 않는다. DB도 짜야하고 서버 설정도 해야하고... 토이 프로젝트 하나 하자고 배보다 배꼽이 커지는 격이 된다. 나도 이번 인턴 프로젝트를 하면서 같은 문제를 겪었다. 프론트로 짤 수 있는 건 다 짰고, 데이터의 저장과 읽기만 할 수 있으면 됐다. 물론 프론트만 이용해서 .json
파일을 데이터베이스처럼 사용할 수도 있지만 그래도 실제 데이터베이스는 써야하지 않을까라는 자그만한 오기가 있었다. 그러다 저번에 노마드 코더에서 강의에 사용한 Prisma
가 생각났다. 그리고 Prisma
와 Docker
를 이용한 간단한 백앤드는 장난감 같지만 필요한 기능은 다 들어있는 장난감이었다.
그래서 어떻게 사용하는가?
우선 Prisma
가 글로벌로 설치되어있어야한다. 설치 명령어는 다음과 같다.
$ npm install -g prisma
.env
파일 설정하기
우선 docker-compose.yml
에 쓰일 환경변수를 모아놓은 .env
를 채워 넣자.
PRISMA_MANAGEMENT_API_SECRET=my-secret
PRISMA_PORT=4466 # default prisma port
PRISMA_VERSION=1.34 # recommend version is 1.34
POSTGRES_VERSION=11.4 # recommend version is 11.4
POSTGRES_USER=prisma
POSTGRES_PASSWORD=prisma
POSTGRES_PORT=5432 # default postgres port
docker
에서 이미지를 컨테이너화하는데 사용하는 변수들이기때문에 그대로 쓰는 편이 좋다.
GraphQL 서버 시작하기
Docker 컨테이너 실행하기
docker-compose.yml
에 정의된 설정대로 prismagraphql
과 postgres
이미지를 컨테이너화하자.
$ docker-compose up -d
Creating network "prisma-docker_default" with the default driver
Creating volume "prisma-docker_postgres" with default driver
Creating prisma-docker_prisma_1 ... done
Creating prisma-docker_postgres_1 ... done
docker-compose
과정이 마무리되면 로컬에서 Prisma Server Playground
와 Prisma Server Admin
에 접속이 가능하다. 현재는 prisma
의 데이터 모델에서 deploy
된 것이 없기 때문에 Schema
는 비어있는 상태이다.
- Prisma Server Playground - http://localhost:4466/
- Prisma Server Admin - http://localhost:4466/_admin
Deploy prisma server
prisma.yml
에 정의된 설정대로 postgres
의 schema
를 생성함과 동시에 해당 schema
에 대한 CRUD
를 포함한 Query
, Mutation
그리고 Subscription
에 해당하는 resolver
를 자동으로 생성한다.
$ yarn deploy
⚠️ 서버가 시작하는 데까지 잠시 시간이 걸리기 때문에 그 사이에 prisma deploy
명령어가 작동하지 않을 수 있다.
Prisma
를 deploy
한 후에, 해당 URL에 들어갈 수 있다.
이제 Prisma Server Playground
에서 datamodel.graphql
에 정의된 데이터에 대한 Schema
를 확인할 수 있다.
- Prisma Server Playground - http://localhost:4466/
- Prisma Server Admin - http://localhost:4466/_admin
Prisma Server Playground
를 GraphQL Server
로 써도 되긴 하지만, 복잡한 Resolver
를 사용할 수 없기 때문에 graphql-yoga
를 이용하여 Prisma Client
에 해당하는 GraphQL Server
를 index.ts
에 작성한다. 그리고 prisma.yml
의 generate
와 nexus-prisma-generate
과정을 통해 Prisma Client
에 내가 원하는 Prisma Server
의 Schema
가 연결된다.
Run graphql dev server
Prisma Client
를 실행한다.
$ yarn start
- GraphQL Dev Server - http://localhost:4000/
파일 구성
각 파일의 구성은 다음과 같다.
prisma.yml
endpoint: http://localhost:4466
datamodel: datamodel.graphql
secret: my-secret
generate:
- generator: typescript-client
output: ./generated/prisma-client/
hooks:
post-deploy:
- npx nexus-prisma-generate --client ./generated/prisma-client --output ./generated/nexus-prisma
docker-compose.yml
더 자세한 설명을 원한다면 다음 글을 참고하자 "Set up and connect Prisma with a database"
version: '3'
services:
prisma:
image: prismagraphql/prisma:${PRISMA_VERSION}
restart: always
ports:
- '${PRISMA_PORT}:${PRISMA_PORT}'
environment:
PRISMA_CONFIG: |
managementApiSecret: ${PRISMA_MANAGEMENT_API_SECRET}
port: ${PRISMA_PORT}
databases:
default:
connector: postgres
host: postgres
port: ${POSTGRES_PORT}
user: ${POSTGRES_USER}
password: ${POSTGRES_PASSWORD}
postgres:
image: postgres:${POSTGRES_VERSION}
restart: always
environment:
POSTGRES_USER: ${POSTGRES_USER}
POSTGRES_PASSWORD: ${POSTGRES_PASSWORD}
volumes:
- postgres:/var/lib/postgresql/data
volumes:
postgres: ~
'Docker' 카테고리의 다른 글
[Docker] 🐋 Docker 훑어보기 (0) | 2019.08.10 |
---|