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/
'성장이야기 > TIL' 카테고리의 다른 글
[개발일지] 230614 Amplify GraphQL (0) | 2023.06.14 |
---|---|
[개발일지] 230613 GraphQL Mutation (0) | 2023.06.13 |
[개발일지] 230608 실시간 급상승 검색어 알고리즘 (1) | 2023.06.08 |
[개발일지] 230607 Ranking Algorithm(순위 알고리즘) (0) | 2023.06.07 |
[개발일지] 230602 Java Varargs(가변인자)란? (0) | 2023.06.02 |