글 작성자: 택시 운전사
반응형

해당 글은 prisma-postgres-docker-boilerplate를 기반으로 작성되었습니다.

글을 쓰기 까지

프론트 엔지니어가 토이 프로젝트를 진행할 때 가장 막히는 부분이 바로 백앤드 부분이다. 백앤드는 언어도 다양하고, 프론트앤드와 같은 언어를 쓴다고 Express를 쓴다고, 일이 쉽게 풀리지는 않는다. DB도 짜야하고 서버 설정도 해야하고... 토이 프로젝트 하나 하자고 배보다 배꼽이 커지는 격이 된다. 나도 이번 인턴 프로젝트를 하면서 같은 문제를 겪었다. 프론트로 짤 수 있는 건 다 짰고, 데이터의 저장과 읽기만 할 수 있으면 됐다. 물론 프론트만 이용해서 .json 파일을 데이터베이스처럼 사용할 수도 있지만 그래도 실제 데이터베이스는 써야하지 않을까라는 자그만한 오기가 있었다. 그러다 저번에 노마드 코더에서 강의에 사용한 Prisma가 생각났다. 그리고 PrismaDocker를 이용한 간단한 백앤드는 장난감 같지만 필요한 기능은 다 들어있는 장난감이었다.

그래서 어떻게 사용하는가?

우선 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에 정의된 설정대로 prismagraphqlpostgres 이미지를 컨테이너화하자.

$ 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 PlaygroundPrisma Server Admin에 접속이 가능하다. 현재는 prisma의 데이터 모델에서 deploy된 것이 없기 때문에 Schema는 비어있는 상태이다.

Deploy prisma server

prisma.yml에 정의된 설정대로 postgresschema를 생성함과 동시에 해당 schema에 대한 CRUD를 포함한 Query, Mutation 그리고 Subscription에 해당하는 resolver를 자동으로 생성한다.

$ yarn deploy

⚠️ 서버가 시작하는 데까지 잠시 시간이 걸리기 때문에 그 사이에 prisma deploy 명령어가 작동하지 않을 수 있다.

Prismadeploy한 후에, 해당 URL에 들어갈 수 있다.
이제 Prisma Server Playground에서 datamodel.graphql에 정의된 데이터에 대한 Schema를 확인할 수 있다.

Prisma Server PlaygroundGraphQL Server로 써도 되긴 하지만, 복잡한 Resolver를 사용할 수 없기 때문에 graphql-yoga를 이용하여 Prisma Client에 해당하는 GraphQL Serverindex.ts에 작성한다. 그리고 prisma.ymlgeneratenexus-prisma-generate 과정을 통해 Prisma Client에 내가 원하는 Prisma ServerSchema가 연결된다.

Run graphql dev server

Prisma Client를 실행한다.

$ yarn start

파일 구성

각 파일의 구성은 다음과 같다.

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