1. GraphQL이란?
GraphQL은 페이스북에서 개발된 오픈소스 기술로 데이터 질의 언어이다. 그러나 GrapQL은 SQL과 언어적 구조 차이와 활용 측면에서 큰 차이를 가지고 있다. SQL은 데이터베이스 시스템에 저장된 데이터를 효율적으로 가져오는 것이 목적이고, GQL은 웹 클라이언트가 데이터를 서버로부터 효율적으로 가져오는 것을 목적으로 한다. SQL 문장은 주로 백앤드 시스템에서 작성하고 호출하는 반면, GQL의 문장은 주로 클라이언트 시스템에서 작성하고 호출한다.
# GQL 쿼리 예시
{
hero {
name
friends {
name
}
}
}
서버사이드 gql 어플리케이션은 gql로 작성된 쿼리를 입력으로 받아 쿼리를 처리한 결과를 다시 클라이언트로 돌려준다. HTTP API 자체가 특정 데이터베이스나 플렛폼에 종속적이지 않은것 처럼 마찬가지로 gql 역시 어떠한 특정 데이터베이스나 플렛폼에 종속적이지 않으며, 심지어 네트워크 방식에도 종속적이지 않다. 일반적으로 gql의 인터페이스간 송수신은 네트워크 레이어 L7의 HTTP POST 메서드와 웹소켓 프로토콜을 활용하며, 필요에 따라서는 얼마든지 L4의 TCP/UDP를 활용하거나 심지어 L2 형식의 이더넷 프레임을 활용 할 수 있다.
2. REST API와 비교
REST API는 URL, Method 등을 조합하기 때문에 다양한 엔드포인트가 존재한다. 반면, GQL은 단 하나의 엔드포인트가 존재한다. 또한 GQL API에서는 불러오는 데이터의 종류를 쿼리 조합을 통해 결정한다. 예를 들어, REST API에서는 각 엔드포인트마다 데이터베이스 SQL 퀘리가 달라지는 반면, GQL API는 GQL 스키마의 타입마다 데이터베이스 SQL 쿼리가 달라진다.
3. GraphQL의 구조
1) 쿼리와 뮤테이션(Query and Mutation)
REST API의 경우 사용 용도에 따라 GET, POST 등과 같은 Method를 사용한다. GQL 또한 Query와 Mutation으로 이를 구분하며, Query는 데이터를 읽는데(R) 사용하고 Mutation은 데이터를 변조(CUD) 하는데 사용된다.
2) 스키마(Schema)
GraphQL은 모든 데이터 유형이 GraphQL 스키마 정의 언어(SDL)로 기록되며 API의 기능과 클라이언트가 상호 작용할 수 있는 데이터의 형태를 정의한다.
type Character {
name: String!
appearsIn: [Episode]!
}
- Character는 GraphQL 객체 타입이다. 즉, 필드를 가지고 있는 타입이다. 스키마의 대부분의 타입은 객체 타입이다.
- name과 appearIn은 Character 타입의 필드이다. 즉, name과 appearIn은 GraphQL 쿼리의 Character 타입 어디서든 사용할 수 있는 필드이다.
- String은 내장된 스칼라 타입 중 하나이다. 이는 스칼라 객체로 해석되는 타입이며 쿼리에서 하위 선택을 할 수 없다.
- String!은 필드가 non-nullable임을 의미한다. 즉, 이 필드를 쿼리할 때 GraphQL 서비스가 항상 값을 반환한다는 것을 의미한다. 타입 언어에서는 이것을 느낌표로 나타낸다.
- [Episode]!는 Episode 객체의 배열(array)을 나타낸다. 또한 non-nullable이기 때문에 appearIn 필드를 쿼리할 때 항상(0개 이상의 아이템을 가진) 배열을 기대할 수 있다.
💡 GraphQL의 스칼라 타입
- Int : 부호가 있는 32비트 정수
- Float : 부호가 있는 부동소수점 값
- String : UTF-8 문자열
- Boolean : true 또는 false
- ID : 객체를 다시 요청하거나 캐시의 키로써 자주 사용되는 고유 식별자
3) 리졸버(Resolver)
GraphQL에서 리졸버는 쿼리의 각 필드에 대한 데이터를 제공하는 함수이다. 리졸버는 GraphQL 서버에서 데이터를 가져오는 데 사용되며, 클라이언트가 요청한 필드의 값을 반환한다. 리졸버는 GraphQL 스키마의 필드와 연결되며, 각 필드에는 해당 필드의 값을 검색하고 반환하는 리졸버 함수가 있어야 한다. 리졸버 함수는 데이터베이스, 외부 API 호출, 메모리 캐시, 또는 다른 소스로부터 데이터를 가져올 수 있다. GraphQL 스키마는 타입과 필드의 구조를 정의하는데, 이를 기반으로 리졸버는 어떤 데이터를 반환해야 하는지 결정한다. 리졸버는 필드의 값을 동적으로 계산하거나 적절한 데이터 소스로부터 데이터를 검색하여 반환할 수 있다.
4. GraphQL의 장점
1) 유연한 데이터 요청
GraphQL은 클라이언트가 필요로 하는 정확한 데이터를 요청할 수 있다. 필요한 정보들만 선택하여 받을 수 있으므로 Over-fetching 문제를 해결할 수 있으며 데이터 전송량 또한 감소된다. 또 여러 계층의 정보들을 한 번에 받을 수 있으므로 Under-fetching을 방지하고 네트워크 트래픽을 줄일 수 있다.
2) 단일 엔드포인트
GraphQL은 하나의 URI에서 POST로 모든 요청이 가능하다. 때문에 RESTful API와 달리 GraphQL은 단일 엔드포인트를 사용하며, 이는 클라이언트가 여러 엔드포인트를 호출할 필요 없이 모든 데이터를 단일 요청으로 가져올 수 있다는 것을 의미한다.
3) 실시간 데이터 요청
REST에는 실시간 업데이트에 대한 기본 지원 기능이 없다. 웹 또는 모바일 애플리케이션에 REST API를 사용한 실시간 기능이 필요한 경우 개발자가 일반적으로 롱폴링(클라이언트가 서버에 새 데이터를 반복적으로 폴링하는 방식), 서버 전송 이벤트 및 웹소켓과 같은 기술을 구현해야 하므로 애플리케이션이 더 복잡해질 수 있다.
그러나 GraphQL은 구독을 사용하여 실시간 업데이트를 기본적으로 지원한다. 구독은 서버에 대한 지속적인 연결을 유지하기 때문에 특정 이벤트가 발생할 때마다 서버가 클라이언트에 업데이트를 푸시하고 클라이언트가 관련 API 데이터를 최신 상태로 유지할 수 있다.
- 참고자료
https://www.ibm.com/kr-ko/topics/graphql
'좋은 개발자 프로젝트' 카테고리의 다른 글
[GraphQL] GraphQL의 유형(TYPE) (0) | 2024.01.18 |
---|---|
REST API 정의 및 특징 (0) | 2024.01.16 |