API 종류(2) - GraphQL

JWH·2024년 8월 30일

API 알아보기

목록 보기
3/4
post-thumbnail

GraphQl 이란?

  • 서버측 런타임으로 클라이언트에게 요청한 만큼의 데이터를 제공하는데 우선 수위를 둔 API를 위한 쿼리 언어이다.
  • 개발자가 단일 API 호출로 다양한 데이터 소스에서 데이터를 끌어오는 요청을 구성 할 수 있도록 지원한다.

SQL과 다른 점

  • SQL은 데이터베이스 시스템에 저장된 데이터를 효율적으로 가져오는 것이 목적이고, GQL은 웹 클라이언트가 데이터를 서버로 부터 효율적으로 가져오는 것이 목적이다.
  • SQL은 주로 백앤드 시스템에서 작성하고 호출하는 반면 GQL의 문장은 주로 클라이언트 시스템에서 작성하고 호출한다.

GraphQL 특징

  • 하나의 EndPoint에 여러 API 요청이 가능하다.
  • 필요한 정보만 요청 할 수 있다.
  • 원하는 데이터 이상의 정보들을 받아 리소스를 낭비 하는 것을 방지한다.
  • 원하는 데이터를 받기 위해 여러번 요청을 보낼 필요가 없어진다.

GraphQl 구조

// 요청

{
	hero {
      name
    }
}

// 결과

{
	"data": {
    	"hero": {
          "name": "R2-D2"
        }
    }
}

1. 쿼리 / 뮤테이션 (query / mutation)

  • 쿼리는 데이터를 읽을 때 즉, 조회를 할 때 사용되고 뮤테이션의 경우 데이터를 변조(CRUD) 할 때 사용한다.

2. 스키마 / 타입 (schema / type)

  • 쿼리나 뮤테이션을 그냥 사용할 수는 없다. GraphQL에서는 스키마에 정의한다.
  • schema.graphql 이라는 파일 내에 작성하게 되며, 사용할 쿼리나 뮤테이션, type 등을 정의한다. 즉, 사용할 데이터들에 대한 설명을 스키마에 작성한다고 생각하면 된다.
  • 추후에 쿼리문을 작성할 때, 스키마에 정의된 대로 argument 등을 정확히 맞추어 요청해야 한다.
type Character {
	name : string!
    appersIn: [Episode!]!
}
  • 오브젝트 타입 : Character
  • 필드 : name, appearsIn
  • 스칼라 타입 : String, ID, Int 등
  • 느낌표(!) : 필수 값을 의미(non-nullable)
  • 대괄호([ , ]) : 배열을 의미(array)

3. 리졸버 (resolver)

  • 리졸버는 필드 요청이 들어온 경우 그 값을 제공하는 역할을 한다.
  • 각각의 리졸버 함수에는 내부적으로 데이터베이스 쿼리가 존재하며 쿼리에 맞게 필요한 만큼만 최적화하여 호출 할 수 있다.
  • Query 타입에 users 라는 필드를 정의한 경우 query { users } 라는 질의로 값을 요청할 수 있고, 그 경우 users 필드 정의의 resolve 함수가 호출된다.
users: {
  type: new GraphQLNonNull(new GraphQLList(new GraphQLNonNull(User))),
  resolve: () => [{ name: 'Johnny' }],
},

4. 인트로스펙션(introspection)

  • REST의 API 명세서 공유와 같은 문제를 해결하는 것이 GQL의 인트로스펙션 기능이다.
  • 인트로스펙션은 서버 자체에서 현재 서버에 정의된 스키마의 실시간 정보를 공유를 할 수 있게한다.
  • 스키마 정보만 알고 있으면 클라이언트 사이드에서는 따로 연동규격서를 요청 할 필요가 없게 된다. 클라이언트 사이드에서는 실시간으로 현재 서버에서 정의하고 있는 스키마를 의심 할 필요 없이 받아들이고, 그에 맞게 쿼리문을 작성하면 된다.

GrapQL의 장단점

장점

  • 한번의 요청으로 여러 API의 정보를 가져올 수 있다.
  • 필요한 데이터만 요청 할 수 있다.
  • 표준화 된 API 개발이 가능하다.
  • 특정 애플리 케이션 아키텍쳐를 지정하지 않으므로 REST API에 추가하여 기존 API 툴과 연동 할 수 있다.
  • Client에서 필요한 data만을 요청하기에 overfetching을 줄일 수 있다.
  • Schema를 정해 데이터의 일관성을 보장할 수 있다.

단점

  • GraphQL 스키마에서 필드를 정확하게 모두 명시해야하기 때문에 번거로울 수 있다.
  • Map, Object를 사용하지 못한다.
  • DTO는 상속을 통해 필드 생략이 가능하지만 스키마에서 필드 상속 또는 생략 할 수 없기 때문에 필드를 모두 적어야 한다.
  • GraphQL은 multipart/from-data 형식을 받을 수 없고 application/json 형식만 받을 수 있다.
  • 클라이언트에서도 모든 필드를 작성해야 한다.
  • 필드 타입이 한정적이다.
  • 캐싱이 REST 보다 복잡하다.

GraphQL vs REST

차이점

  • REST API는 URL, METHOD등을 조합하기 때문에 다양한 Endpoint가 존재 하지만 GQL은 단 하나의 Endpoint가 존재한다.
  • GQL API에서는 불러오는 데이터의 종류를 쿼리 조합을 통해서 결정한다.

GraphQL

  • 서로 다른 다양한 요청들에 대해 응답 해야 할 때 사용한다.
  • 대부분의 요청이 CRUD에 해당 할 때 사용한다.

REST

  • HTTP와 HTTPs에 의한 캐싱을 사용하고 싶을 때 사용한다.
  • 파일 전송 증 단순한 Text로 해결되지 않는 요청이 있을 때 사용한다.
  • 요청의 구조가 정해져 있을 때 사용한다.

참고자료(출처)
https://tech.kakao.com/posts/364
https://www.redhat.com/ko/topics/api/what-is-graphql
https://aws.amazon.com/ko/compare/the-difference-between-graphql-and-rest/

profile
발전하기 위해 노력하는 프론트엔드 개발자입니다.

0개의 댓글