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

2023. 6. 9. 22:16·성장이야기/TIL

 

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

 

'성장이야기 > 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
'성장이야기/TIL' 카테고리의 다른 글
  • [개발일지] 230614 Amplify GraphQL
  • [개발일지] 230613 GraphQL Mutation
  • [개발일지] 230608 실시간 급상승 검색어 알고리즘
  • [개발일지] 230607 Ranking Algorithm(순위 알고리즘)
seungjjun
seungjjun
  • seungjjun
    개발이야기
    seungjjun
  • 전체
    오늘
    어제
    • 분류 전체보기
      • 성장이야기
        • TIL
        • 주간회고
      • Java
        • Spring
        • Spring Security
      • 트러블슈팅
      • Kafka
      • OS
      • Network
      • 메가테라
      • Database
      • Algorithm
      • Git
      • HTML
      • CSS
      • 독서
      • 컴퓨터 이해하기
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
  • 링크

  • 공지사항

  • 인기 글

  • 태그

    메가테라
    항해99
    이커머스 프로젝트
    graphQL
    redis
    항해플러스
    메가테라 주간회고
    개발일지
    주간회고
    Til
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.3
seungjjun
[개발일지] 230609 GraphQL을 알아보자 (GraphQL과 REST API)
상단으로

티스토리툴바