buildSchema()는 표준 graphql SDK를 사용하여 스키마와 타입을 생성하므로, 이를 지원하는 모든 라이브러리와 호환됩니다.
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');
});스키마 커스터마이징
스키마를 커스터마이징하려면 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('Server is running on http://localhost:4000/graphql');
})