[nodejs] Prisma를 사용한 GraphQL 서버 구축

본 포스트에서는 Prisma를 사용하여 Node.js 기반의 GraphQL 서버를 구축하는 방법에 대해 다룹니다.

목차

  1. Prisma 소개
  2. 프로젝트 초기 설정
  3. Prisma 스키마 정의
  4. Prisma Migrate를 사용한 데이터베이스 마이그레이션
  5. GraphQL 서버 구축
  6. 결론

1. Prisma 소개

Prisma는 데이터베이스를 다루는 데 필요한 모든 것을 제공하는 현대적인 ORM(Object-Relational Mapping) 도구입니다. 프로덕션 환경에서 안정적으로 사용될 수 있도록 설계되었으며, TypeScript를 완벽하게 지원하여 타입 안정성을 보장합니다. 또한 Prisma는 데이터 모델링, 데이터베이스 마이그레이션, 쿼리 빌딩 및 데이터베이스 접근을 위한 강력한 도구를 제공합니다.

2. 프로젝트 초기 설정

먼저, Node.js 프로젝트를 생성하고 필수 패키지를 설치합니다.

mkdir graphql-server
cd graphql-server
npm init -y
npm install express apollo-server-express @prisma/client

3. Prisma 스키마 정의

프로젝트 루트 디렉토리에 schema.prisma 파일을 생성하고 데이터 모델을 정의합니다.

// schema.prisma

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

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

model User {
  id    Int     @id @default(autoincrement())
  name  String
  posts Post[]
}

model Post {
  id       Int     @id @default(autoincrement())
  title    String
  content  String
  userId   Int
  user     User    @relation(fields: [userId], references: [id])
}

4. Prisma Migrate를 사용한 데이터베이스 마이그레이션

Prisma Migrate를 사용하여 데이터베이스 스키마를 초기화하고 마이그레이션을 수행합니다.

npx prisma migrate dev --name init --preview-feature

5. GraphQL 서버 구축

index.js 파일을 생성하고 아래와 같이 GraphQL 서버를 구축합니다.

// index.js

const { ApolloServer, gql } = require('apollo-server-express');
const { PrismaClient } = require('@prisma/client');
const express = require('express');

const prisma = new PrismaClient();

const typeDefs = gql`
  type Query {
    users: [User]
    posts: [Post]
  }

  type User {
    id: Int
    name: String
    posts: [Post]
  }

  type Post {
    id: Int
    title: String
    content: String
    user: User
  }
`;

const resolvers = {
  Query: {
    users: async () => {
      return await prisma.user.findMany({ include: { posts: true } });
    },
    posts: async () => {
      return await prisma.post.findMany({ include: { user: true } });
    },
  },
};

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

const app = express();
server.applyMiddleware({ app });

const PORT = process.env.PORT || 4000;
app.listen({ port: PORT }, () =>
  console.log(`Server ready at http://localhost:${PORT}${server.graphqlPath}`)
);

6. 결론

이제 Prisma를 사용하여 데이터 모델을 정의하고 GraphQL 서버를 구축하는 방법에 대해 알아보았습니다. Prisma를 사용하면 타입 안정성을 가진 강력한 데이터베이스 도구를 활용하여 더욱 안정적이고 확장 가능한 애플리케이션을 개발할 수 있습니다.

참고 자료