GraphQL 서버에서의 자바스크립트 미들웨어 활용하기

GraphQL은 현대적이고 강력한 API 쿼리 언어입니다. GraphQL 서비스를 구축할 때 자바스크립트 미들웨어를 사용하면 기능을 확장하고 코드를 재사용할 수 있습니다. 이 글에서는 GraphQL 서버에서 자바스크립트 미들웨어를 활용하는 방법을 알아보겠습니다.

1. GraphQL 미들웨어란?

GraphQL 미들웨어는 GraphQL 서버의 요청과 응답이 전달되기 전/후에 실행되는 함수입니다. 이를 통해 요청 전/후에 사용자 정의 로직을 추가하거나 요청을 가공할 수 있습니다. 자바스크립트 미들웨어는 일반적으로 Express.js와 함께 사용되며, Apollo Server에도 내장된 미들웨어 기능을 제공합니다.

2. 자바스크립트 미들웨어 사용하기

2.1 Express.js와 함께 사용하기

먼저, Express.js를 사용하여 GraphQL 서버를 생성합니다. 아래는 예시 코드입니다.

const express = require('express');
const { ApolloServer } = require('apollo-server-express');

const app = express();

// GraphQL 스키마와 리졸버 설정
const typeDefs = `
  type Query {
    hello: String
  }
`;

const resolvers = {
  Query: {
    hello: () => 'Hello, World!',
  },
};

// Apollo Server 설정
const server = new ApolloServer({ typeDefs, resolvers });

// 미들웨어 추가
server.applyMiddleware({ app });

// 서버 시작
app.listen({ port: 4000 }, () => {
  console.log(`Server running at http://localhost:4000${server.graphqlPath}`);
});

위 코드에서 server.applyMiddleware({ app })를 통해 Apollo Server에 Express.js 애플리케이션을 미들웨어로 추가합니다. 이제 GraphQL 요청은 Express.js 애플리케이션에서 처리됩니다.

2.2 Apollo Server의 내장 미들웨어 사용하기

Apollo Server에는 내장 미들웨어 기능도 제공됩니다. 예를 들어, 요청 본문에 인증 토큰을 포함하는 경우, onPreParsing 미들웨어를 사용하여 요청 전에 해당 토큰을 검증할 수 있습니다. 아래는 예시 코드입니다.

const { ApolloServer, gql } = require('apollo-server');

const typeDefs = gql`
  type Query {
    hello: String
  }
`;

const resolvers = {
  Query: {
    hello: () => 'Hello, World!',
  },
};

// 미들웨어 함수
const authenticateToken = (request, response) => {
  const authorizationHeader = request.headers.authorization;
  
  // 토큰 검증 로직
  // ...

  // 요청을 수정할 경우, `response` 파라미터를 사용합니다.
  // response.http.headers.set('Cache-Control', 'no-store');

  // 만약 토큰이 유효하지 않으면 오류를 반환하고 요청을 중단합니다.
  // throw new Error('Unauthorized');
};

const server = new ApolloServer({
  typeDefs,
  resolvers,
  // 내장 미들웨어 등록
  plugins: [
    {
      requestDidStart: () => ({
        // 요청 전에 실행될 미들웨어
        async onPreParsing({ request, response }) {
          authenticateToken(request, response);
        },
        // 요청 후에 실행될 미들웨어
        async onDidResolveOperation({ request, response }) {
          // 미들웨어 로직 추가
          // ...
        },
      }),
    },
  ],
});

server.listen().then(({ url }) => {
  console.log(`Server running at ${url}`);
});

위 코드에서 plugins 옵션을 사용하여 onPreParsingonDidResolveOperation 미들웨어를 등록합니다. onPreParsing은 요청이 파싱되기 전에 실행되며, onDidResolveOperation은 요청이 처리된 후에 실행됩니다. 이를 통해 요청에 대한 검증, 변형, 로깅 등 다양한 작업을 수행할 수 있습니다.

3. 결론

GraphQL 서버에서 자바스크립트 미들웨어를 활용하면 기능을 확장하고 코드를 재사용할 수 있습니다. Express.js와 함께 사용하거나 Apollo Server의 내장 미들웨어를 활용하여 요청 전/후에 로직을 실행할 수 있습니다. 이를 통해 GraphQL 서비스의 유연성과 확장성을 향상시킬 수 있습니다.

더 자세한 내용은 Apollo Server 문서를 참고하시기 바랍니다.

#GraphQL #JavaScript