Node.js에서 GraphQL 사용하기: API 개발의 새로운 패러다임
Node.js에서 GraphQL 사용하기: API 개발의 새로운 패러다임
현대의 웹 애플리케이션 개발에서 API
는 핵심적인 역할을 합니다. RESTful API가 오랜 기간 동안 주류를 이루었지만, 최근에는 GraphQL
이 점차 그 자리를 차지하고 있습니다. 이 글에서는 Node.js 환경에서 GraphQL을 사용하여 효율적인 API
를 개발하는 방법을 다루어 보겠습니다.
GraphQL의 기본 개념
GraphQL은 Facebook에서 개발한 쿼리 언어로, 클라이언트가 필요한 데이터만 요청하고 받을 수 있도록 설계되었습니다. 이는 과도한 데이터 전송을 피하고 클라이언트와 서버 사이의 통신을 최적화하는 데 큰 장점을 제공합니다. 주요 개념으로는 스키마
, 쿼리
, 뮤테이션
이 있습니다.
- 스키마: 데이터 구조를 정의합니다. 스키마는 어떤 타입이 있고, 각 타입이 어떤 필드를 가지는지 명시합니다.
- 쿼리: 클라이언트가 서버에서 데이터를 가져오는 요청을 말합니다. RESTful API의
GET
요청에 해당합니다. - 뮤테이션: 서버의 데이터를 변경하는 요청을 의미합니다. RESTful API의
POST
,PUT
,DELETE
요청에 해당합니다.
Node.js와 GraphQL 통합하기
Node.js를 통해 GraphQL을 사용하려면 몇 가지 필수 npm 패키지를 설치해야 합니다. 이를 통해 서버를 설정하고 스키마를 정의할 수 있습니다.
bashnpm install express express-graphql graphql
위 명령어로 express
, express-graphql
, graphql
패키지를 설치합니다. 그 다음, 간단한 Express 서버를 설정해 보겠습니다.
javascriptconst express = require('express'); const { graphqlHTTP } = require('express-graphql'); const { buildSchema } = require('graphql'); // 간단한 스키마 정의 const schema = buildSchema(` type Query { hello: String } `); // 루트 리졸버 정의 const root = { hello: () => { return 'Hello, world!'; }, }; const app = express(); app.use('/graphql', graphqlHTTP({ schema: schema, rootValue: root, graphiql: true, })); app.listen(4000, () => console.log('Now browse to localhost:4000/graphql'));
이제 브라우저에서 http://localhost:4000/graphql
에 접속하면 GraphiQL 인터페이스가 나타납니다. 여기서 hello
쿼리를 실행해보면 'Hello, world!'라는 응답을 받을 수 있습니다.
실습: 간단한 GraphQL API 구현
더 복잡한 예제로서 사용자 정보와 관련된 GraphQL API를 만들어 보겠습니다. 먼저 사용자 데이터를 관리하기 위한 기본 스키마를 정의합니다.
javascriptconst schema = buildSchema(` type User { id: ID! name: String! age: Int } type Query { user(id: ID!): User users: [User] } type Mutation { addUser(name: String!, age: Int): User } `);
이 스키마에서는 사용자 타입(User)과 사용자 정보를 가져오는 쿼리(user와 users), 그리고 사용자를 추가하는 뮤테이션(addUser)을 정의했습니다. 이제 해당 스키마의 리졸버를 구현해 보겠습니다.
javascriptlet users = []; const root = { user: ({ id }) => { return users.find(user => user.id === id); }, users: () => { return users; }, addUser: ({ name, age }) => { const user = { id: users.length + 1, name, age }; users.push(user); return user; }, };
이제 전체 코드를 결합한 완성된 서버 코드는 다음과 같습니다.
javascriptconst express = require('express'); const { graphqlHTTP } = require('express-graphql'); const { buildSchema } = require('graphql'); const schema = buildSchema(` type User { id: ID! name: String! age: Int } type Query { user(id: ID!): User users: [User] } type Mutation { addUser(name: String!, age: Int): User } `); let users = []; const root = { user: ({ id }) => { return users.find(user => user.id === id); }, users: () => { return users; }, addUser: ({ name, age }) => { const user = { id: users.length + 1, name, age }; users.push(user); return user; }, }; const app = express(); app.use('/graphql', graphqlHTTP({ schema: schema, rootValue: root, graphiql: true, })); app.listen(4000, () => console.log('Now browse to localhost:4000/graphql'));
이제 http://localhost:4000/graphql
에 접속한 후 GraphiQL 인터페이스에서 다음의 쿼리를 실행하여 사용자를 추가하고 가져올 수 있습니다.
graphqlmutation { addUser(name: "John Doe", age: 28) { id name age } } query { users { id name age } }
이 예제에서는 Node.js와 GraphQL을 사용하여 매우 간단한 사용자 관리 API를 구현했습니다. 이를 통해 GraphQL의 기본 개념과 Node.js와의 통합 방법을 이해할 수 있었습니다. 실제 프로젝트에서는 보다 복잡한 스키마와 리졸버, 데이터베이스 연계 등을 고려해야 합니다.
결론
GraphQL
은 API 개발에 혁신적인 접근 방식을 제공합니다. 데이터를 효율적으로 전송하고, 클라이언트와 서버 간의 통신을 최적화할 수 있습니다. Node.js
와 GraphQL
의 결합은 현대 웹 애플리케이션 개발에서 매우 강력한 도구가 될 수 있습니다. 이를 통해 개발자는 보다 유연하고 효율적인 API를 구축할 수 있습니다.