GraphQL을 알아보자

룸잉·2024년 4월 24일
0

📌 GraphQL

  • 기존 REST API 한계점을 극복하기 위해 Meta(전 facebok)가 고안한 쿼리 언어

☑️ REST API와 차이점

▶️ Overfetching

  • REST API
    • 일부 속성만 필요한 경우에도 전체 데이터를 불러온다.
    • 서비스 크기가 커질수록 다루는 양의 크기가 커질 경우 서버 부하, 데이터 전송 속도 및 크기 등 Overfetching으로 인한 이슈가 발생할 수 있다. (클라이언트 입장에서는 필요한 데이터만 골라서 사용하면 되긴 하지만)
  • Graph QL
    • 필요한 필드만을 명시적으로 요청하여 필요한 정보들만 선택하여 받아올 수 있다.
      query {
          teams {
              id
              manager
              mascot
          }
      }
    • 전체 데이터를 받아오지 않고 필요에 따라 원하는 데이터만 받아오기 때문에, 데이터 전송량이 감소한다. 이로써 REST API에서 언급했던 Overfetching 이슈를 해결할 수 있다.

▶️ Underfetching

  • REST API
    • 특정 데이터를 받아오기 위해 여러 개의 endpoint를 사용해야 한다. 하나의 데이터를 가져오기 위해 n개의 endpoint를 거치기도 한다. 이는 서버 부하, 네트워크 오버헤드 등을 유발할 수 있다.
  • Graph QL
    • 중첩된 필드를통해 여러 객체와 관련된 데이터를 한 번에 요청할 수 있다. 이를 통해 하나의 endpoint에서 여러 계층의 정보들을 한 번에 받아올 수 있다.
      query {
          team(id: 2) {
              id
              manager
              mascot
              members {
                  first_name
                  last_name
              }
          }
          
          rolse {
              id
              requirement
          }
      }
    • 하나의 endpoint에서 모든 요청을 해결할 수 있기 때문에, 요청 횟수가 감소한다. 즉, 여러 번 네트워크를 호출할 필요가 없기 때문에 REST API의 Underfetching 이슈를 해결할 수 있다.

📌GraphQL 구조

☑️ 쿼리/ 뮤테이션(Query/ Mutation)

▶️ Query

: 정보를 읽어오기 위해 사용하는 메소드 - CRUD의 R

  • 쿼리문 (요청): 원하는 정보를 쿼리로 요청
    query {
    	user {
    		name
    	}
    }
  • 응답: 쿼리문에 대한 응답이 데이터로 반환
    {
    	"data" : {
    		"user" : {
    			"name" : "abcde"
    		}
    	}
    }
    

▶️ Mutation

: 받아온 정보를 변형하기 위해 사용하는 메서드 - CRUD의 CUD

  • 요청 예시 - addMovie라는 뮤테이션에 새로운 영화 이름을 추가하는 예시
    mutation {
    	addMovie(name:"Rocks"){
    		name
    	}
    }

▶️ Subscription

: 실시간으로 변경된 데이터를 가져오기 위한 요청 방식

웹 소켓을 통해 소켓 통신을 열어두고, 데이터 업데이트 시 알리는 방식으로 이뤄진다.

▶️ 스키마와 타입시스템

: GraphQL 타입 시스템과 데이터를 표현하는 방법


📌 Query에 대해 더 자세히 알아보자

☑️ Aliases

  • 필드의 결과를 원하는 이름으로 변경할 수 있다. 중복된 필드를 다른 이름으로 받아올 때 사용할 수 있다.

☑️ Fragments

  • 반복되는 필드의 집합을 하나의 요소로 정의하여 이를 재사용할 수 있다.
  • 같은 필드를 순서대로 요청한다고 가정해보자. 필드를 최소 2번은 반복해야 하기 때문에, 중복되는 코드의 양이 늘어나고 쿼리가 복잡해진다. 이러한 경우 fragment를 사용하면 필드셋을 구성한 다음 필요한 쿼리에 포함시킬 수 있다.

  • fragment는 복잡한 응용 프로그램 내에서 데이터 요구사항을 작은 단위로 분할하는데 사용된다.
  • 특히, 청크가 다른 여러 UI 구성 요소를 하나의 초기 데이터 fetch로 통합해야 하는 경우 많이 사용한다.

☑️ Operation name

  • Operation type: Query(읽기), Mutation(데이터를 변경하고 가져옴), Subscription(실시간으로 변경된 데이터를 가져옴)
  • Operation name: 의미있고 명시적인 이름으로 하는 것이, 디버깅이나 서버측에서 로깅하는데 유용하다.
    # Operation type: query
    # Opertation name: HeroNameAndFriends
    query HeroNameAndFriends {
      hero {
        name
        friends {
          name
        }
      }
    }

📌  Instrospection

  • API 명세서 대신 사용할 수 있는 GraphQL 기능
  • 서버 자체에서 현재 서버에 정의된 스키마의 실시간 정보를 공유할 수 있다.
  • 인트로스펙션용 쿼리가 따로 존재하며, 일반 gql문을 작성하듯이 작성하면 된다. 다만, 대부분 서버용 gql 라이브러리에는 쿼리용 IDE를 제공하기 때문에, 실제로는 스키마 인트로스펙션을 위해 ql 쿼리 문을 작성할 필요는 없다.

0개의 댓글

관련 채용 정보