drizzle-graphql

Drizzle 스키마를 기반으로 단 한 줄로 GraphQL 서버를 생성할 수 있습니다. 또한 커스텀 쿼리와 뮤테이션을 쉽게 추가하여 기능을 확장할 수 있습니다.

빠른 시작

drizzle-orm 버전이 최소 0.30.9 이상인지 확인하고, 필요한 경우 업데이트하세요:

npm
yarn
pnpm
bun
npm i drizzle-orm@latest

Apollo Server

npm
yarn
pnpm
bun
npm i drizzle-graphql @apollo/server graphql
server.ts
schema.ts
import { buildSchema } from 'drizzle-graphql';
import { drizzle } from 'drizzle-orm/...';
import client from './db';
import { ApolloServer } from '@apollo/server';
import { startStandaloneServer } from '@apollo/server/standalone';

import * as dbSchema from './schema';

const db = drizzle({ client, schema: dbSchema });

const { schema } = buildSchema(db);

const server = new ApolloServer({ schema });
const { url } = await startStandaloneServer(server);

console.log(`🚀 Server ready at ${url}`);

GraphQL Yoga

npm
yarn
pnpm
bun
npm i drizzle-graphql graphql-yoga graphql
server.ts
schema.ts
import { buildSchema } from 'drizzle-graphql';
import { drizzle } from 'drizzle-orm/...';
import { createYoga } from 'graphql-yoga';
import { createServer } from 'node:http';

import * as dbSchema from './schema';

const db = drizzle({ schema: dbSchema });

const { schema } = buildSchema(db);

const yoga = createYoga({ schema });
const server = createServer(yoga);

server.listen(4000, () => {
  console.info('Server is running on http://localhost:4000/graphql');
});

스키마 커스터마이징

buildSchema()는 표준 graphql SDK를 사용하여 스키마와 타입을 생성합니다. 따라서 이 출력은 이를 지원하는 모든 라이브러리와 호환됩니다.

스키마를 커스터마이징하려면 entities 객체를 사용하여 새로운 스키마를 직접 만들 수 있습니다:

server.ts
schema.ts
import { buildSchema } from 'drizzle-graphql';
import { drizzle } from 'drizzle-orm/...';
import { GraphQLList, GraphQLNonNull, GraphQLObjectType, GraphQLSchema } from 'graphql';
import { createYoga } from 'graphql-yoga';
import { createServer } from 'node:http';

import * as dbSchema from './schema';

const db = drizzle({ schema: dbSchema });

const { entities } = buildSchema(db);

// 쿼리나 뮤테이션 중 원하는 부분만 선택할 수 있습니다.
const schema = new GraphQLSchema({
  query: new GraphQLObjectType({
    name: 'Query',
    fields: {
      // 생성된 쿼리 중 원하는 것만 선택
      users: entities.queries.users,
      customer: entities.queries.customersSingle,

      // 커스텀 쿼리 생성
      customUsers: {
        // 원본 스키마의 타입을 재사용하고 커스터마이징
        type: new GraphQLList(new GraphQLNonNull(entities.types.UsersItem)),
        args: {
          // 입력도 재사용 가능
          where: {
            type: entities.inputs.UsersFilters
          },
        },
        resolve: async (source, args, context, info) => {
          // 커스텀 로직 작성
          const result = await db.select(schema.users).where()...

          return result;
        },
      },
    },
  }),
  // 뮤테이션에도 동일한 규칙 적용
  mutation: new GraphQLObjectType({
    name: 'Mutation',
    fields: entities.mutations,
  }),
  // 스키마 내부에서 타입이 필요한 경우
  types: [...Object.values(entities.types), ...Object.values(entities.inputs)],
});

const yoga = createYoga({
  schema,
});

const server = createServer(yoga);

server.listen(4000, () => {
  console.info('서버가 http://localhost:4000/graphql에서 실행 중입니다.');
})