GraphQL: HTTP에서 REST에 대한 대안

GraphQL: HTTP에서 REST에 대한 대안

애플리케이션 구축 및 배포를 위한 많은 오픈 소스 아키텍처 표준이 존재합니다. REST(Representational State Transfer), SOAP(Simple Object Access Protocol), RPC(Remote Procedural Call) 및 GraphQL API가 가장 많이 사용됩니다.





RESTful API는 가장 많이 사용되는 API 아키텍처 표준입니다. 엔드포인트가 많은 복잡한 RESTful API를 작성했다면 이것이 얼마나 복잡할 수 있는지 깨달았을 것입니다. 끝점 사이에 약간의 차이만 있는 경우 특히 그렇습니다.





MAKEUSEOF 오늘의 비디오

RESTful API는 특정 데이터를 선택할 만큼 유연하지 않기 때문에 데이터 가져오기에 문제가 발생할 수도 있습니다. GraphQL은 RESTful API의 이러한 문제를 해결합니다.





GraphQL이란 무엇입니까?

GraphQL(Graph Query Language)은 API 구축을 위한 쿼리 언어 및 런타임입니다. 데이터 소비를 위한 엔드포인트가 많은 REST API와 달리 GraphQL API에는 진입점이 하나 있습니다. 쿼리에서 설명하여 특정 데이터를 가져올 수 있습니다.

그만큼 GraphQL 사양 쿼리 언어와 GraphQL 서버가 작동하는 방식을 정의합니다. Python에서 다음과 같이 서버 측 언어로 GraphQL API를 빌드하고 사용할 수 있습니다. 자바스크립트 , 그리고 HTTP를 지원하는 모든 언어.



Meta는 2012년에 HTTP를 기반으로 구축하기 위한 REST의 대안으로 GraphQL을 구축했습니다. 그들은 2015년에 GraphQL을 오픈 소스 표준으로 발표했습니다. 오늘날 GraphQL 재단은 GraphQL 사양의 개발을 감독합니다.

GraphQL은 채택률이 낮고 사용하는 데 숨겨진 비용이 있는 상당히 새롭습니다. GraphQL API 구축은 특히 엔드포인트가 적은 소규모 프로젝트의 경우 불필요하게 복잡할 수 있습니다.





또한 모든 GraphQL 요청은 요청 상태에 관계없이 결국 상태 코드 200을 반환합니다.

GraphQL은 어떻게 작동합니까?

  그래프QL's functions and syntax

같지 않은 리소스 지향적인 REST , GraphQL에서는 데이터를 데이터와 상호 작용하는 그래프로 생각해야 합니다. 데이터 구조를 지정할 수 있으며 사양은 HTTP를 통해 API와 상호 작용하기 위한 강력한 쿼리 인터페이스를 제공합니다. 에 따라 다양한 기능을 사용할 수 있습니다. GraphQL 패키지 또는 라이브러리 사용을 선택합니다.





GraphQL 스키마에는 요청 가능한 개체와 사용 가능한 필드를 정의하는 개체 유형이 포함됩니다. API 쿼리 및 변형에서 GraphQL 패키지는 쿼리의 유효성을 검사하고 지정된 핸들러 함수(리졸버)를 기반으로 쿼리를 실행합니다.

왜 GraphQL을 사용해야 합니까?

REST는 사용하기 쉬운 표준이며 대부분의 프로그래밍 언어에는 RESTful API를 빠르게 구축하기 위한 도구가 있습니다. 그러나 RESTful API를 구축하고 사용하는 데에는 많은 문제가 있습니다.

다음은 개발자가 일부 사용 사례에서 GraphQL을 선호하게 만드는 REST 관련 몇 가지 문제입니다.

비효율적인 데이터 가져오기

RESTful API는 엔드포인트 사양에 따라 데이터를 중계합니다. 엔드포인트의 핸들러 함수에 하드 코딩된 것 이상의 데이터를 검색할 만큼 유연하지 않습니다.

끝점이 호출 시 데이터 목록을 반환하고 필드에 대한 값이나 기준을 지정해야 한다고 가정합니다. 이 경우 개발자는 끝점을 만들고 데이터를 반환하는 비즈니스 논리를 정의해야 합니다. 귀중한 리소스를 수동으로 구문 분석할 수 있으며 결국 시간이 더 걸립니다.

GraphQL은 API를 쿼리하여 기준과 사양에 따라 데이터를 유연하게 반환할 수 있으므로 비효율적인 데이터 가져오기 문제를 해결합니다.

GraphQL API는 대화형입니다. 검색에 필요한 데이터를 쉽고 읽기 쉬운 구문으로 지정할 수 있습니다.

{ 
user(where: {age: {_eq: "89"}}) {
name
school(where: {alive: {_eq: true}}) {
bio
nationality
}
}
}

위의 GraphQL 쿼리는 사용자 항목에 대한 스키마 나이 필드는 89입니다. 쿼리에는 살아 있는 필드 평가 진실 . 스키마에서 이름, 약력 및 국적 필드를 반환합니다.

신속한 개발

GraphQL API를 구축하고 사용하는 것은 REST를 사용하는 것보다 쉽습니다. 특히 프로젝트 크기가 커질수록 더욱 그렇습니다. 개발 단계에서 RESTful API를 개발할 때만큼 많은 경로와 핸들러 기능을 개발할 필요가 없습니다. GraphQL API를 사용하는 것은 RESTful API만큼 지루하지 않습니다.

REST에서는 단일 엔드포인트가 있는 GraphQL과 달리 여러 엔드포인트가 다른 리소스에 대한 액세스를 제공합니다. 이는 유연성과 성능을 제공하며 쿼리는 다른 확인자 기능을 호출할 수 있습니다.

GraphQL 스키마 정의 언어

GraphQL SDL(스키마 정의 언어)은 GraphQL 서비스의 스키마를 지정합니다.

GraphQL SDL 구문은 읽고 이해하기 쉽습니다. 다음을 사용하여 파일에 스키마의 구조를 지정합니다. .graphql 또는 .graphqls 확대.

type Human { 
name: String!
age: Int!
}

input AddHuman {
name: String!
age: Int!
}

type Mutation {
CreateHuman(input: AddHuman!): Human!
DeleteHuman(id: Int!): String!
UpdateHuman(id: Int!): String!
}

type Query {
GetHuman(id: Int!): Human!
GetHumans: [Human!]!
}

위의 GraphQL 코드는 요청에 대한 API의 구조를 정의하는 GraphQL API에 대한 스키마입니다. 스키마는 API에 대한 CRUD 기능을 정의합니다.

클라이언트 측에서는 스키마의 구조와 클라이언트의 데이터 또는 작업을 기반으로 클라이언트가 실행할 수 있습니다. 질문 (REST에서 GET 또는 DELETE) 또는 돌연변이 (PUT 또는 POST).

다음은 쿼리의 예입니다. 인간 개요.

아마존에서 누군가의 위시리스트를 찾는 방법
query Human { 
name
age
}

위의 쿼리는 인간 스키마의 이름 그리고 나이 필드 데이터.

GraphQL 돌연변이는 쿼리와 달리 구문이 상당히 다릅니다. 다음은 인간 개요.

mutation { 
CreateHuman(input:{ name:"man", age:1000000000000000,}) {
name
age
}
}

돌연변이 코드 입력 이름 그리고 나이 필드를 클라이언트에 보내고 필드에서 데이터를 반환합니다.

GraphQL API를 구축할 때 지속성을 위한 데이터 저장소가 필요합니다. REST 및 대부분의 HTTP 기반 웹 아키텍처와 마찬가지로 GraphQL은 상태 비저장이며 앱에 모든 데이터 저장소 또는 데이터베이스를 사용할 수 있습니다.

GraphQL API 빌드

  GraphQL 지원 언어

GraphQL은 사양이며 가장 널리 사용되는 서버 측 언어로 GraphQL을 빌드할 수 있습니다. 프로젝트에 필요한 기능이 있는 라이브러리를 찾아야 합니다.

GraphQL 라이브러리를 선택할 때 모든 GraphQL 유형 및 작업을 지원하는 기능이 풍부한 라이브러리를 사용하려고 합니다. 대부분의 라이브러리는 스키마 우선 또는 코드 우선 접근 방식을 취합니다. 전자에서는 GraphQL 스키마를 정의하고 라이브러리는 해석기와 상용구 코드를 생성합니다. 후자의 경우 스키마를 정의하지 않고 해석기를 하드 코딩합니다.

GraphQL이 채택되고 있습니다.

GraphQL이 시작된 이후로 개발자와 회사는 사용을 단순화하는 도구를 출시했습니다. 이는 중소 규모 프로젝트의 개발 시간을 단축할 수 있습니다.

자세한 내용은 오픈 소스 GraphQL 클라이언트, GraphQL 설명서 및 사양을 확인하십시오.