카테고리 없음

GraphQL

Jueuunn7 2025. 1. 11. 17:56

1. 서론

내가 진행하게 된 개인 프로젝트에서 플린코 게임 서버를 구현하게 되었다.

플린코 게임을 어떻게 하면 안전하게 구현할지 생각하다가 stake 플랫폼에선 플린코가 어떻게 작동하는지 궁금해 플레이했다.

stake에서는 서버에서 공의 route를 정해주는 방식이다.

여기서 보면 stake는 GraphQL을 사용하는 걸 알 수 있다. 

 

2. GraphQL?

GraphQL은 페이스북에서 만든 쿼리 언어이다. gql이라고도 부른다. 인기는 매우 높지만 openapi에선 실제로 사용하는 곳이 많진 않다고 한다.

gql은 sql과 같은 쿼리 언어이다.

gql과 sql의 차이는 sql은 데이터베이스 시스템에 저장된 데이터를 쿼리하는것이 목적이고, gql은 클라이언트가 서버로부터 데이터를 효율적으로 쿼리 하기 위한 목적이다. 즉 sql은 주로 백엔드에서 작성하고 호출하며, gql은 클라이언트에서 작성하고 호출한다고 말할 수 있다.

sql 쿼리 예시

SELECT name, age, sex FROM user WHERE username='홍길동';

gql 쿼리 예시

{
  hero {
    name
      friends {
        name
      }
   }
}

 

서버에 있는 gql 애플리케이션은 gql로 입력된 쿼리를 처리하고, 그 결과를 다시 클라이언트로 반환합니다. HTTP API가 특정 db나 애플리케이션에 종속적이지 않은 것처럼 gql도 db나 애플리케이션에 종속적이지 않습니다. 일반적으로 HTTP POST나 웹소켓 프로토콜을 사용해 통신합니다. 

 

3. REST API vs GraphQL

REST API는 여러 매서드들과 엔드포인트들을 조합해서 서버로 요청을 보낸다. 하지만 gql은 sql로 db에 쿼리를 하는 것처럼 하나의 엔드포인트로 쿼리를 보내는 방식으로 작동한다.

 

3. GraphQL의 구조

3-1. Schema

스키마는  API 데이터 구조를 정의합니다.

type User {
  id: ID!,
  name: String!,
  age: Int
}

3-2. query, mutation

gql은 쿼리와 뮤테이션으로 분리하여 요청을 처리한다.

쿼리는 R 작업, 뮤테이션은 CUD 작업을 나타낸다.

id가 1인 유저의 이름과 나이를 쿼리하면 이렇게 가져올 수 있다.

query {
  user(id: 1) {
    name
    age
  }
}
{
  "data": {
    "user": {
      "name": "홍길동",
      "age": 25
    }
  }
}

 

유저를 생성하는 뮤테이션은 이렇게 생성할 수 있다.

mutation {
  createUser(name: "홍길동", age: 30) {
    id
    name
  }
}
{
  "data": {
    "createUser": {
      "id": "2",
      "name": "홍길동"
    }
  }
}

3-3. Subscription

말 그대로 서버를 구독하는것이다. 웹소켓 프로토콜을 기반으로 작동한다.

해당 구독은 서버에서 새로운 사용자가 생길 때마다 데이터를 받을 수 있다.

subscription {
  userCreated {
    id
    name
  }
}
{
  "data": {
    "userCreated": {
      "id": "3",
      "name": "홍길동"
    }
  }
}

 

4. 결론

GraphQL은 클라이언트에서 쿼리를 작성해야하긴 한다. 하지만 Apollo에서 Fetch, Json, Props 등을 모두 해결하고 리엑트에서 여러 엔드포인트로 요청을 보내기 위해서 여러 설정들도 필요가 없다고 한다.

REST API의 많은 엔트포인트 관리, 언더페칭 오버페칭등의 문제점을 해결해주기도 한다.

실시간 데이터를 사용할땐 기존 REST API에서는 웹소켓 프로토콜을 따로 구현해야 했는데 GraphQL의 Subscription을 사용해서 실시간 데이터가 중요한 서비스들에서 좋다. 채팅이나 주식 등의 서비스에서 적합하다.

API를 문서화하고, 프론트와 회의해서 협의하고,, 이런 일들이 필요가 없어지기 때문에 개발에 좀 더 집중할 수 있다.

GraphQL를 도입하려고 했을때 러닝커브만 고려한다면 좋은 선택인것 같다.