작성일 댓글 남기기

GraphQL 서버에 접근하고 데이터를 요청하기

클라이언트가 서버에 접근하는 방법

클라이언트가 GraphQL 서버에 접근하는 방식은 크게 두 가지로 나눌 수 있습니다:

  1. GraphiQL을 사용한 웹 브라우저에서의 접근
  2. HTTP 요청을 통해 직접 접근하는 방식 (예: Fetch API, Axios, Apollo Client 등)

1. GraphiQL을 사용한 접근

GraphiQL은 GraphQL을 테스트할 수 있는 웹 기반 인터페이스입니다. 서버에 설정된 graphiql: true 옵션 덕분에, 클라이언트는 웹 브라우저에서 GraphQL 쿼리와 뮤테이션을 직접 작성하고 실행할 수 있습니다.

접근 방법:

  • 브라우저에서 http://localhost:4000/graphql에 접속하면, GraphiQL 인터페이스가 나타납니다.
  • 여기서 쿼리나 뮤테이션을 직접 작성해 실행할 수 있습니다.

예를 들어, 특정 사용자의 이름과 이메일을 가져오는 쿼리를 GraphiQL에서 실행하면:

query {
user(id: 1) {
name
email
}
}

서버는 다음과 같은 JSON 형식의 데이터를 반환합니다:

{
"data": {
"user": {
"name": "John",
"email": "[email protected]"
}
}
}

2. HTTP 요청을 사용한 접근

클라이언트는 Fetch API, Axios, 또는 Apollo Client 같은 HTTP 라이브러리를 사용하여 GraphQL 서버에 요청을 보낼 수 있습니다. 이 방식은 브라우저나 모바일 애플리케이션에서 GraphQL 서버와 통신할 때 일반적으로 사용됩니다.

Fetch API를 사용한 접근 예시:

fetch('http://localhost:4000/graphql', {
method: 'POST',
headers: {
'Content-Type': 'application/json',
},
body: JSON.stringify({
query: `
query {
user(id: 1) {
name
email
}
}
`
})
})
.then(response => response.json())
.then(data => console.log(data));

위의 코드는 클라이언트에서 fetch를 통해 GraphQL 쿼리를 서버에 보내고, 서버로부터 받은 데이터를 출력하는 예제입니다.

Axios를 사용한 접근 예시:

import axios from 'axios';

axios.post('http://localhost:4000/graphql', {
query: `
query {
user(id: 1) {
name
email
}
}
`
})
.then(response => {
console.log(response.data);
});

Axios는 Fetch API와 유사한 방식으로 동작하며, 더 다양한 기능을 제공합니다.

Apollo Client를 사용한 접근 예시:

Apollo Client는 GraphQL 서버와 통신하기 위한 더 고급화된 라이브러리로, 주로 리액트 같은 프론트엔드 프레임워크에서 많이 사용됩니다.

  1. 설치:bash코드 복사
    npm install @apollo/client graphql
  2. Apollo Client 설정:
import { ApolloClient, InMemoryCache, gql } from '@apollo/client';

const client = new ApolloClient({
  uri: 'http://localhost:4000/graphql',
  cache: new InMemoryCache()
});

client
  .query({
    query: gql`
      query {
        user(id: 1) {
          name
          email
        }
      }
    `
  })
  .then(result => console.log(result));

Apollo Client는 쿼리와 뮤테이션을 간단하게 관리할 수 있게 도와주며, 더 복잡한 클라이언트 측 데이터 관리 기능을 제공합니다.

3. 쿼리와 뮤테이션 요청의 구조

클라이언트가 서버에 보낼 때 요청의 구조는 기본적으로 다음과 같습니다:

  • URL: GraphQL 서버의 엔드포인트 (예: http://localhost:4000/graphql)
  • HTTP 메서드: POST (GraphQL 요청은 주로 POST 메서드를 사용)
  • 요청 본문: GraphQL 쿼리 또는 뮤테이션을 JSON 형식으로 포함
{
"query": "query { user(id: 1) { name email } }"
}

서버는 이 요청을 받아서 필요한 데이터를 처리한 후, JSON 형식으로 응답을 반환합니다.

4. 응답 구조

서버로부터 반환되는 응답은 JSON 형식으로 제공됩니다. 일반적인 응답 구조는 다음과 같습니다:

  • data: 요청한 데이터가 담긴 필드
  • errors: 만약 쿼리나 뮤테이션에 오류가 발생했을 때 오류 메시지가 담기는 필드

응답 예시:

{
"data": {
"user": {
"name": "John",
"email": "[email protected]"
}
}
}

오류가 있을 경우:

{
"errors": [
{
"message": "User not found",
"locations": [{ "line": 2, "column": 3 }],
"path": ["user"]
}
]
}

결론

클라이언트가 GraphQL 서버에 접근하는 방식은 크게 두 가지로 나뉩니다:

  1. GraphiQL 같은 웹 기반 툴을 사용해 직접 쿼리를 작성하고 테스트하는 방법.
  2. Fetch API, Axios, Apollo Client 등을 사용해 HTTP 요청을 통해 서버에 쿼리나 뮤테이션을 보내는 방식.

실제 프로젝트에서는 보통 두 번째 방법을 사용하여 클라이언트 애플리케이션과 GraphQL 서버 간에 데이터를 주고받습니다.

작성일 댓글 남기기

GraphQL 서버와 스키

1. GraphQL 서버 이해하기

GraphQL 서버는 클라이언트로부터 쿼리뮤테이션 요청을 받아 처리하는 역할을 합니다. 클라이언트는 GraphQL 서버에 필요한 데이터를 요청하고, 서버는 그 요청을 처리해서 데이터를 반환합니다.

GraphQL 서버의 역할

  • 클라이언트의 요청을 처리하고, 필요한 데이터를 반환합니다.
  • **스키마(Schema)**를 정의하고, 데이터가 어떤 형태로 전달될지를 결정합니다.
  • 서버에서는 데이터를 처리하는 **리졸버(Resolver)**를 통해 실제 데이터베이스와 연결하거나 외부 API에서 데이터를 받아올 수 있습니다.

2. GraphQL 스키마 작성하기

스키마는 GraphQL 서버에서 데이터를 어떻게 구성하고 제공할지를 정의하는 설계도입니다. 스키마는 어떤 데이터 타입이 있고, 어떤 요청(쿼리 또는 뮤테이션)을 받을 수 있는지를 설명합니다.

기본 스키마 예제

아래는 간단한 스키마 예제입니다. 사용자의 정보를 다루는 API를 만든다고 가정해 보죠.

type User {
id: ID!
name: String!
email: String!
}

type Query {
user(id: ID!): User
users: [User]
}

type Mutation {
addUser(name: String!, email: String!): User
}
  • type User: 사용자 정보를 정의합니다. id, name, email 필드를 가지고 있으며, 각 필드는 특정 타입을 가집니다. 예를 들어, idID! 타입이며, 이 느낌표는 필수가 있음을 나타냅니다.
  • type Query: 데이터를 요청하는 방법을 정의합니다. 여기서는 user 쿼리로 특정 사용자(id에 따라)를 요청하거나, users 쿼리로 모든 사용자를 요청할 수 있습니다.
  • type Mutation: 데이터를 변경하는 방법을 정의합니다. 여기서는 addUser 뮤테이션으로 새로운 사용자를 추가하는 작업을 정의했습니다.

3. 리졸버(Resolver) 작성하기

리졸버는 클라이언트가 요청한 데이터를 실제로 가져오는 함수를 의미합니다. 클라이언트가 쿼리를 보내면, 리졸버가 데이터베이스에서 해당 데이터를 가져오거나, 다른 API에서 데이터를 받아서 반환합니다.

리졸버 예시

아래는 위의 스키마에서 정의한 useraddUser에 대한 리졸버 예시입니다. 예를 들어, Node.js 환경에서 작성한 코드라고 생각하시면 됩니다.

const users = [
{ id: 1, name: 'John', email: '[email protected]' },
{ id: 2, name: 'Alice', email: '[email protected]' },
];

const resolvers = {
Query: {
user: (parent, args, context, info) => {
return users.find(user => user.id === Number(args.id));
},
users: () => users,
},
Mutation: {
addUser: (parent, args, context, info) => {
const newUser = {
id: users.length + 1,
name: args.name,
email: args.email
};
users.push(newUser);
return newUser;
}
}
};
  • Query.user: 클라이언트가 user(id: 1) 쿼리를 보냈을 때 해당 id를 가진 사용자를 찾아 반환합니다.
  • Query.users: 모든 사용자의 목록을 반환합니다.
  • Mutation.addUser: 새로운 사용자를 추가하고, 추가된 사용자 데이터를 반환합니다.

4. GraphQL 서버 직접 실행해보기

Node.js 환경에서 GraphQL 서버 실행

GraphQL 서버를 직접 만들기 위해 Node.js 환경을 사용할 수 있습니다. 아래는 간단한 서버 설정 예시입니다.

설치: 먼저, 프로젝트 폴더를 만들고 nmp init으로 프로젝트를 초기화한 후, 필요한 패키지들을 설치합니다.

    npm install express express-graphql graphql

    서버 코드 작성: index.js파일을 생성하고, 다음과 같이 간단한 GraphQL 서버를 설정합니다.

    const express = require('express');
    const { graphqlHTTP } = require('express-graphql');
    const { buildSchema } = require('graphql');
    
    // 스키마 정의
    const schema = buildSchema(`
      type User {
        id: ID!
        name: String!
        email: String!
      }
    
      type Query {
        user(id: ID!): User
        users: [User]
      }
    
      type Mutation {
        addUser(name: String!, email: String!): User
      }
    `);
    
    // 리졸버 정의
    const users = [
      { id: 1, name: 'John', email: '[email protected]' },
      { id: 2, name: 'Alice', email: '[email protected]' }
    ];
    
    const root = {
      user: ({ id }) => users.find(user => user.id == id),
      users: () => users,
      addUser: ({ name, email }) => {
        const newUser = { id: users.length + 1, name, email };
        users.push(newUser);
        return newUser;
      }
    };
    
    // 서버 설정
    const app = express();
    app.use('/graphql', graphqlHTTP({
      schema: schema,
      rootValue: root,
      graphiql: true, // GraphiQL을 활성화하여 웹에서 쿼리 작성 가능
    }));
    
    app.listen(4000, () => console.log('Running a GraphQL API server at http://localhost:4000/graphql'));
    

    서버 실행: 다음 명령어로 서버를 실행합니다.

    node index.js

    GraphiQL 인터페이스 사용: 브라우저에서 http://localhost:4000/graphql로 접속하면 GraphiQL이라는 인터페이스를 통해 쿼리와 뮤테이션을 직접 작성하고 테스트할 수 있습니다.

    5. 마무리

    이제 GraphQL 서버가 어떻게 작동하는지, 스키마와 리졸버가 무엇인지, 그리고 기본적인 서버를 설정하는 방법을 알게 되셨습니다! 이 서버를 통해 클라이언트가 데이터를 요청하고 변경할 수 있으며, 다양한 응용을 할 수 있습니다.