[개발일지] 230609 GraphQL을 알아보자 (GraphQL과 REST API)

 

GraphQL이란?


GraphQL은 간단하게 말하면 데이터 쿼리 언어이다. 페이스북(메타)에서 만든 쿼리 언어로 REST API와 다르게 클라이언트가 필요한 데이터의 구조를 명시할 수 있어 클라이언트가 필요한 데이터만 얻을 수 있다는 특징이 있다.

 

GraphQL을 이용하면 여러 번 데이터를 요청하거나 과도한 데이터 요청을 최소화할 수 있어 효율적인 네트워크 사용이 가능해진다. 다시말해 GraphQL은 클라이언트-서버 간 통신에서 사용되며, 이는 일반적으로 웹 또는 앱에서 데이터를 가져오는 데 사용된다.

 

GraphQL의 목적과 특징


GraphQL의 주요 목적은 클라이언트 사이드에서 효율적이고 유연하게 데이터를 가져오는 것이다. 이를 통해 네트워크 사용량을 줄이고 애플리케이션의 성능을 향상시킬 수 있다.

 

1. 한 번의 요청으로 여러 종류의 데이터를 가져올 수 있다.

  • REST API를 사용하는 경우, 서로 다른 종류의 데이터를 가져오기 위해서는 여러 번의 요청이 필요하다. (ex. 책의 정보와 영화 정보를 요청하는 경우 : Get /books, Get /movies 각각 요청이 필요), 반면에 GraphQL을 이용하면 한 번의 요청으로 여러 종류의 데이터를 한꺼번에 가져올 수 있다. 

2. 클라이언트가 필요한 데이터를 명시할 수 있다.

  • GraphQL은 클라이언트가 정확히 필요한 데이터를 요청할 수 있게 해 준다. 클라이언트는 필요한 데이터의 구조를 쿼리로 작성하고, 서버는 그 쿼리에 따라 정확히 그 구조의 데이터를 리턴한다. 이를 통해 불필요한 데이터 전송을 줄여 애플리케이션의 성능을 향상할 수 있다.

3. 실시간 데이터

  • GraphQL은 구독(subscription)이라는 기능을 통해 실시간 데이터 업데이트를 지원한다. 이를 통해 클라이언트는 서버로부터 데이터의 변화를 실시간으로 받아올 수 있다.

 

GraphQL Query


객체(book)에 대해 특정 필드(author)의 값을 얻는 요청 쿼리 예시

 

{
  book {
    author
  }
}

 

아래와 같은 JSON값을 얻을 수 있다.

{
  "data": {
    "book": {
      "author": "Joshua Bloch"
    }
  }
}

 

위 예시 쿼리를 봐서 알 수 있듯이 클라이언트가 정확히 필요한 데이터를 요청해서 데이터를 얻을 수 있다.

 

 

GraphQL vs REST API


GraphQL을 사용하는 것과 REST API를 사용하는것을 비교해 보자.

 

REST API

먼저 book에 대해 get 요청했을 때 rest api의 응답은 아래와 같이 나온다.

{
   "title": "Effective Java",
   "author": {
      "firstName": "Joshua",
      "lastName": "Bloch"
   }
}

위의 rest api book예시를 GraphQL로 옮기기 위해서는 Book과 Author라는 타입을 정의해야 한다.

 

GraphQL

type Book {
  id: ID
  title: String
  author: Author
}
type Author {
  id: ID
  firstName: String
  lastName: String
  books: [Book]
}

 

여기서 GraphQL과의 큰 차이점이 드러난다. GraphQL에서는 리소스의 유형과 리소스를 가져오는 방식이 완전하게 분리되어 있다.

 

위의 예시 코드에서 Book과 Author의 형태만을 정의했지, 클라이언트에서 데이터(book)를 어떻게 요청할 수 있는지에 대해서는 아무런 정보가 없다. 그래서 Book과 Author에 접근할 수 있도록, Query라는 타입이 필요하다.

 

Query

type Query {
  book(id: ID!): Book
  author(id: ID!): Author
}

 

Query를 정의했으면 클라이언트는 아래와 같은 엔드포인트로 서버에 데이터(book)를 요청할 수 있다.

 

/graphql?query={ book(id: "1") { title, author { firstName } } }

 

위의 gql을 통해, id = 1 인 book의 title과 author의 firstName만 가져올 수 있다.

 

 

GraphQL 응답값

{
  "title": "Effective Java",
  "author": {
    "firstName": "Joshua"
  }
}

 

위에서 볼 수 있듯이 GraphQL은 REST API와 다르게 /books등과 같이 각 Resource에 대한 엔드포인트가 따로 존재하지 않고, 하나의 엔드포인트만 존재한다. 또한 해당 엔드포인트로 요청 시, 원하는 리소스와 해당 리소스에서 원하는 필드를 특정하는 GraphQL query를 함께 보내 데이터를 요청한다.

 

 

 

GraphQL에 대해서 더 자세히 알고 싶으면 아래 공식문서에서 확인할 수 있다.

 

https://graphql-kr.github.io/learn/

 

GraphQL: API를 위한 쿼리 언어

GraphQL은 API에 있는 데이터에 대한 완벽하고 이해하기 쉬운 설명을 제공하고 클라이언트에게 필요한 것을 정확하게 요청할 수 있는 기능을 제공하며 시간이 지남에 따라 API를 쉽게 진화시키고

graphql-kr.github.io