본문 바로가기

Develop/Etc

[Prisma] Try prisma

Prisma는 기존의 ORM을 대체할 데이터베이트 툴이다. Graphql을 사용해보았다면 친숙할 SDL을 이용하여 서버 엔티티를 구성해줄수 있으며, 서버 설치를 비롯한 설정들이 어렵지가 않다.

기존에 ORM을 사용하였다면 단순히 Generate된 prisma 코드를 로드하여서 해당 부분을 바꿔주기만 하면 쉽게 동작한다.

npm install -g prisma

먼저 위 명령을 통해 prisma cli 패키지를 전역으로 설치해준다.

이 패키지가 prisma를 사용하는데 필요한 전부이다.

* Docker와 Docker Compose가 설치되지 않았다면 바로 설치해주기 바란다.

* Docker와 Docker Compose에 대한 설명은 생략하겠다.


Prisma는 현재 MySQL, PostgreSQL, MongoDB 세개의 DB를 공식적으로 지원하고 있다.

docker-compose.yml 파일을 다음과 같이 작성해준다.

version: '3'
services:
  prisma:
    image: prismagraphql/prisma:1.27
    restart: always
    ports:
    - "4466:4466"
    environment:
      PRISMA_CONFIG: |
        port: 4466
        managementApiSecret: __YOUR_MANAGEMENT_API_SECRET__
        databases:
          default:
            connector: postgres
            host: postgres
            port: 5432
            user: prisma
            password: prisma
            migrations: true
  postgres:
    image: postgres:10.3
    restart: always
    environment:
      POSTGRES_USER: prisma
      POSTGRES_PASSWORD: prisma
    volumes:
      - postgres:/var/lib/postgresql/data
volumes:
  postgres:

위 compose 설정 파일에서는 prisma 서버를 띄워주는 것과 동시에 postgres 서버도 띄워준다.

이는 튜토리얼로 쉽게 설정을 하기 위해서 이렇게 되어 있는데, 기존 데이터베이스가 있을 경우에는 PRISMA_CONFIG 값에 기존 데이터베이스 정보를 입력해주면 된다. (migrations 옵션이 true인 상태에서 기존 서비스 중인 데이터베이스에 연결할 경우 기존 데이터에 문제가 생길수 있음)

managementApiSecret 필드를 통해 보안 설정을 해줄 수 있다. 이 값이 없을 경우 외부에서 누구나 쉽게 prisma 서버에 접속할 수 있고 deploy 등을 통해 마음껏 분탕질을 칠수가 있다. 꼭 설정해줘야한다.

이후 아래 명령을 실행해주게 되면 prisma 서버가 올라가게 된다.

docker-compose up -d

이제부터는 클라이언트에서 설정을 해주면 된다.

prisma init --endpoint http://localhost:4466

endpoint의 경우 실제 동작하고있는 prisma 서버의 설정을 잡아줘야하며 만약 다른 서버에 잡아줬다면 해당 서버로 설정을 바꿔주면 된다.

위 명령을 작성해주게 되면 datamodel.prisma, prisma.yml 이 두 파일이 생성이 된다.읽어보면 대충 뭘하는 파일이다 하는걸 알 수 있다.

datamodel.prisma 파일의 경우 ORM에서 사용하는 entity를 설정해주는 파일이며, prisma.yml 파일의 경우 prisma 명령과 관련된 설정들을 저장하는 파일이다. 실제 prisma.yml 파일내에 secret이라던가 post-hook들을 지정해줘 추후 좀더 편한 개발을 진행할 수 있도록 되어있다.

만약 기존에 사용하고 있는 데이터베이스의 구조를 그대로 가져오고 싶다면 다음 명령을 실행해주게되면 순차적으로 해당 서버의 접속 정보를 받아오게 되며, 그 데이터베이스 구조에 맞는 dastamodel을 추출해준다.

prisma introspect

prisma.yml 파일내에서 datamodel 파일도 지정해줄 수 있다.

datamodel 파일이 모두 정의 된 후에는 실제 prisma 서버로 deploy를 해줘야한다. deploy를 해주게 되면 prisma 서버에서 연결된 데이터베이스로 알아서 마이그레이션을 진행해 주게 된다.

prisma deploy

# 서버 설정에서 managementApiSecret 값을 설정한 경우
PRISMA_MANAGEMENT_API_SECRET="__YOUR_MANAGEMENT_API_SECRET__" prisma deploy

이후 그리고 generate 속성을 통해 내가 필요한 클라이언트 파일을 생성해 줄 수 있다.

generate:
  - generator: typescript-client
    output: ./generated/prisma-client/

prisma.yml파일내에 해당 설정을 추가한 후, generate 명령을 통해 가능하다.

prisma generate

이제 마지막 단계는 실제 내 소스코드상에 생성된 클라이언트를 이용하여 데이터에 접근하면 된다. 이때 generate된 클라이언트는 prisma-client-lib 라이브러리를 필요로 하므로 해당 라이브러리를 설치해준다.

npm install --save prisma-client-lib

index.js

import { prisma } from './generated/prisma-client'

// A `main` function so that we can use async/await
async function main() {

  // Create a new user called `Alice`
  const newUser = await prisma.createUser({ name: 'Alice' })
  console.log(`Created new user: ${newUser.name} (ID: ${newUser.id})`)

  // Read all users from the database and print them to the console
  const allUsers = await prisma.users()
  console.log(allUsers)
}

main().catch(e => console.error(e))

이상 prisma 사이트상에 있는 기초 메뉴얼을 참고하여서 prisma를 사용해 보았다.

ORM이 나왔을 때부터 DBA를 제외한 개발자들이 데이터베이스 쿼리를 작성하는 일 없이 어플리케이션을 쉽게 만들수 있도록 개발 방법론이 변화하는 것을 느꼈으며 좀 더 편하게 어플리케이션을 개발할 수 있도록 진화하고 있다는 생각을 갖게 되었다. 거기에 더해서 prisma는 데이터의 타입을 지원해주며, 쉽게 데이터베이스 프록시 서버를 가질 수 있게 되었다. 이와 함께 데이터베이스 이벤트를 Subscribe 할 수 있는 실시간 이벤트 시스템도 사용할 수 있게 되었다.

'Develop > Etc' 카테고리의 다른 글

Google login with expo  (0) 2019.03.18
PubSub via postgres in Graphql Yoga  (0) 2019.03.06
[Postgres] Setup via docker  (0) 2019.03.05
[Docker] Remove <none>:<none> images  (0) 2019.01.22
[Postman] Example of Pre-request Script  (0) 2019.01.11