GraphQL

동균·2021년 3월 3일
0

Backend

목록 보기
2/2

GraphQL이란?

GraphQL은 페이스북에서 만든 Application Layer의 Query Language 이다.
흔히 API를 구현 할 때는 REST API를 많이 사용한다. 이러한 방식으로 API를 구현하게 되면 Client 에서 어떠한 기능이 필요 할 때마다 새로운 API를 만들어 주어야 한다.
이러한 문제를 개선하기 위해 Client에서 필요한 데이터를 효율적으로 가져오기 위한 목적으로 만들어진 Query Language가 GraphQL이다.

GraphQL 와 REST API 의 차이점

API의 EndPoint

REST API의 경우 Resource 마다 하나의 EndPoint를 가지고 그 EndPoint에서 해당 Resource에 대한 거의 모든 것을 담당한다.
하지만 GraphQL의 경우 전체 API를 위해서 단 하나의 EndPoint만을 사용한다.

API 응답구조

마찬가지로 REST API의 경우 하나의 EndPoint에서 돌려줄 수 있는 응답 구조는 정해져 있는 반면 GraphQL은 사용자가 응답 구조를 자신이 원하는 방식으로 바꿀 수 있다.

API 요청 방식

여러 Resource에 접근하고자 할 때, REST API의 경우에는 여러번의 요청이 필요하지만 GraphQL에서는 한번에 요청으로 여러 Resource에 접근이 가능하다.

API 처리방식

REST API에서 각 요청은 해당 EndPoint에 정의된 Handling 함수를 호출하여 작업을 처리하지만, GraphQL의 경우 요청 받은 각 필드에 대한 Resolver를 호출하여 작업을 처리한다.

GraphQL vs REST API

꼭 하나만 선택 하기보다 상황에 맞게 선택을 해야한다.
서로 다른 모양의 다양한 요청들에 대해서 응답을 해야 할 경우 GraphQL을 사용하는 것이 유리하며 File 전송과 같은 단순 Text로 처리되지 않는 요청이나 구조화된 응답이 필요 할 시 REST API 방식을 사용하는 것이 유리하다.

GraphQL 구조

Query / Mutation

Query는 데이터를 읽는 동작(R)에 사용되고 Mutation은 데이터를 변경하는 동작(CUD)에 사용된다.

Schema / Type

데이터베이스의 Schema에 해당하는 GraphQL에서의 구조이다.
선언 되지 않는 필드에 해당하는 데이터는 사용 할 수 없다.

type Model {
  name: String!
  subModels: [SubModel!]!
}
  • 오브젝트 타입 : Model
  • 필드 : name, subModels
  • 스칼라 타입 : String, ID, Int 등등
  • 느낌표(!) : 필수값 여부
  • 대괄호([,]) : 배열을 의미

Resolver

GraphQL의 쿼리문 파싱은 GraphQL의 Library에서 처리를 하지만 데이터베이스에서 데이터는 Resolver를 구현하여 처리한다.
GraphQL 쿼리에서는 각각의 필드마다 특정 타입을 반환하는 함수가 있는데 이를 Resolver라 한다. 필드가 스칼라가 아닌 별도의 객체라면 해당 타입의 Resolver를 호출하게 된다.

Introspection

기존 REST API구조에서는 Client 측에서 API 구성 요소를 알기 위해 API 명세서를 주고 받는 절차가 필요하다. 하지만 GraphQL 에서는 Server에 정의되어 스키마를 확인 할 수 있는 Introspection이라는 기능이 있다.
Introspection 기능을 사용면 별도 API 명세서를 요청 할 필요 없이 실시간으로 Server 측에서 스키마 정보를 공유 할 수 있다.

References

profile
내가 볼려고 끄적끄적 적는 개발 블로그

0개의 댓글