그래프QL이란 무엇인가?
그래프QL은 오픈 소스 쿼리 언어(QL)이자 서버 측 런타임으로, 클라이언트/서버 아키텍처에서 클라이언트가 하나의 엔드포인트를 통해 여러 유형의 관련 데이터를 한 번의 요청으로 가져올 수 있게 해준다. 즉, 그래프QL은 여러 데이터를 한 번에 요청할 수 있게 해주며, 이는 애플리케이션 프로그래밍 인터페이스(API)를 쿼리하는 데 가장 일반적으로 사용된다.
그래프QL의 사양은 리눅스 재단(Linux Foundation)이 주관하는 그래프QL 재단(GraphQL Foundation)에 의해 관리된다. 재단의 참여는 그래프QL이 공급 업체에 구애 받지 않는 환경에서 지속적으로 발전할 수 있도록 하고, 다양한 기업과 개인 기여자들의 의견이 반영되도록 돕는다.
테코피디아가 설명하는 그래프QL의 의미
그래프QL의 정의는 일반적으로 ‘그래프’와 ‘쿼리 언어’라는 용어가 컴퓨터 과학에서 어떻게 사용되는지를 설명하는 것에서 시작된다. 이 두 용어는 그래프QL이 무엇이며, 어떻게 작동하는지를 이해하는 데 도움을 준다.
- 그래프는 데이터 간의 관계를 시각화하는 데 사용된다.
- 쿼리 언어(QL)는 데이터를 요청하고 검색하는 데 사용된다.
그래프QL의 “그래프”라는 용어는 데이터가 서로 연결되어 있으며 이러한 연결을 통해 탐색할 수 있다는 개념을 나타낸다. 그래프QL의 “QL” 부분은 이 관련 데이터를 어떻게 탐색하고 검색하는지를 설명하는 메커니즘을 나타낸다. 즉 그래프QL은 데이터 간의 관계를 효율적으로 탐색하고, 필요한 정보를 보다 간편하게 얻을 수 있도록 설계된 강력한 도구라고 할 수 있다.
그래프QL의 역사
2012년, 페이스북의 소프트웨어 엔지니어들은 대표 상태 전송(REST) 아키텍처로 구축된 API가 모바일 기기에서 페이스북 뉴스 피드의 성능을 저하시키고 있다는 사실에 불만을 품게 되었다.
RESTful API가 때로는 너무 많은 데이터를 반환하는 경우도 있었고, 때로는 충분한 데이터를 반환하지 않아 추가적인 API 호출(데이터 요청)을 해야 하는 경우가 발생했다.
성능을 개선하기 위해 페이스북 개발자들은 불필요한 데이터 전송을 줄이고 더 나은 사용자 경험(UX)을 제공하는 새로운 아키텍처를 만들었다. 그리고 이 새로운 아키텍처의 사양을 그래프QL이라고 명명했다.
2015년, 페이스북은 그래프QL을 오픈 소스로 공개하기로 결정했다. 이를 통해 페이스북 외부의 개발자들도 그래프QL을 사용하고 발전시키는 데 기여할 수 있게 되었다. 또한, 이는 개발자 커뮤니티 전체가 API를 작성하고 사용하는 방법을 다시 생각하게 하는 계기가 되었다.
그래프QL의 작동 방식
- 출처: wallarm.com
그래프QL을 사용하기 위해 소프트웨어 개발자는 그래프QL 서버를 생성하고, 사용하려는 스키마를 정의하며, 요청된 데이터를 찾고 검색하여 클라이언트에 반환할 수 있는 리졸버(함수)를 작성해야 한다.
스키마는 서버와 클라이언트 간의 계약과 같은 역할을 한다. 이 스키마는 클라이언트가 수행할 수 있는 쿼리의 유형, 요청할 수 있는 데이터 구조의 유형, 그리고 서버가 지원하는 작업(상호작용)을 지정한다.
서버는 클라이언트가 그래프QL 쿼리를 전송하고 이에 해당하는 응답을 받을 수 있는 엔드포인트를 제공한다. 서버의 런타임은 쿼리를 처리하고, 리졸버를 호출하며, 응답을 집계한 다음, 이를 하나의 자바스크립트 객체 표기법(JSON, JavaScript Object Notation) 응답으로 클라이언트에게 다시 전송한다.
그래프QL의 특징
그래프QL의 특징은 개발자와 클라이언트가 다음과 같은 작업을 수행할 수 있도록 한다:
- 스키마 쿼리를 통해 지원되는 쿼리 유형을 확인할 수 있다.
- 동일한 쿼리에서 다양한 유형의 데이터를 검색할 수 있다.
- 정확히 요청한 데이터만 받을 수 있다.
- 웹소켓(WebSocket)과 같은 기술을 통해 뉴스 피드를 구독하고 실시간 업데이트를 받을 수 있다.
- 관련된 데이터의 맥락에서 서버 오류를 받을 수 있다.
- 동일한 애플리케이션 내에서 그래프QL과 REST API를 함께 사용할 수 있다.
- 특정 REST 엔드포인트를 점진적으로 그래프QL로 교체하여 도입할 수 있다.
이러한 특징들은 개발자들이 더욱 효율적으로 데이터를 관리하고 요청할 수 있게 해주며, 사용자에게도 더 나은 경험을 제공한다.
그래프QL API vs. Rest API
RESTful API와 그래프QL API는 유사한 목적을 가지고 있지만, 작동 방식은 상당히 다르다. 이 두 API의 차이를 간단히 살펴보겠다.
RESTful APIs
RESTful API 아키텍처는 서버 리소스에 중점을 둔다. 리소스는 /users, /posts, /orders와 같은 다양한 데이터 유형으로, 각 리소스는 고유한 URL(범용 자원 위치 지정자)에 할당된다.
또한 이 아키텍처는 클라이언트가 리소스와 매우 구체적인 방식으로 상호작용하도록 요구한다. 예를 들어, 두 개의 서로 다른 리소스에서 데이터를 가져오려면 API는 서버의 두 개의 다른 URL에 요청을 보내야 한다.
이러한 접근 방식은 업데이트를 위해 제한된 양의 데이터를 검색해야 하는 앱에는 적합하지만, 업데이트를 위해 수백 개의 리소스와 상호작용해야 하는 뉴스 피드와 같은 앱에는 적합하지 않다.
상황을 더 복잡하게 만드는 것은 때로는 리소스에 클라이언트가 필요한 데이터가 있지만, 때로는 모든 필요한 데이터를 포함하지 못해 다른 URL로 추가 요청을 보내야 하는 경우가 있다는 점이다.
이러한 모든 클라이언트/서버 간의 왕복 통신은 대역폭을 소모하며, 클라이언트의 성능을 크게 저하시킬 수 있다.
그래프QL APIs
반면, 그래프QL API는 관련 데이터 요청을 처리하기 위해 필요한 클라이언트와 서버 간의 상호작용 횟수를 크게 줄인다.
그래프QL API는 클라이언트가 필요한 데이터를 지정한 다음, 단일 엔드포인트(그래프QL 서버)로 단일 쿼리를 전송하도록 요구한다. 서버의 소프트웨어는 요청된 데이터를 찾아 하나의 응답으로 조합하여 클라이언트에 반환한다.
이 과정은 매우 간단하게 들리지만, 서버 측에서 작동하기 위해서는 더 많은 설정이 필요하다.
개발자는 기존 데이터 소스에 매핑되는 스키마를 설계하고, 해당 소스에서 데이터를 가져오는 방법을 아는 리졸버를 정의해야 한다. 또한, 잠재적인 오류를 처리하고 데이터 검색을 최적화하는 로직을 구현해야 하며, 리졸버 내에서 권한 규칙을 적용하는 정책을 만들어야 한다.
그래프QL 사용 사례
그래프QL은 다양한 분산 데이터 소스에서 효율적으로 데이터를 검색하는 데 유용하다. 다음과 같은 용도에 적합하다:
- API 쿼리: 다양한 API에서 데이터를 요청하는 데 효과적이다.
- 여러 데이터베이스, 마이크로서비스, API에서 데이터 검색: 여러 소스에서 데이터를 통합적으로 가져오는 작업을 쉽게 수행할 수 있다.
- 모바일 뉴스 피드 업데이트: 실시간 업데이트를 제공하는 모바일 뉴스 피드를 채우는 데 유용하다.
- 전자상거래 웹사이트의 필터링: 방문자가 검색 쿼리에 필터를 추가할 수 있도록 지원한다.
- 사물인터넷(IoT) 허브 지원: 연결된 장치 네트워크에서 특정 데이터 포인트를 가져와야 하는 IoT 허브에 적합하다.
- 프론트엔드 개발 간소화: API가 무엇을 반환할지 추측할 필요가 없어져 프론트엔드 개발이 간소화된다.
그래프QL 슈퍼그래프란 무엇인가?
슈퍼그래프는 여러 개의 그래프QL 스키마/서브그래프를 하나의 통합된 그래프QL API로 결합한 것이다.
그래프QL 슈퍼그래프는 여러 그래프QL API를 하나의 엔드포인트로 통합하여 복잡한 분산 데이터 구조를 단순화하고, 프론트엔드 개발자가 복잡한 데이터 구조를 쉽게 작업할 수 있도록 한다.
슈퍼그래프는 다음과 같은 경우에 유용하다:
- 여러 마이크로서비스 API 통합: 여러 마이크로서비스의 API를 통합하는 데 효과적이다.
- 구 시스템에 그래프QL 점진적 도입: 기존 시스템에 그래프QL을 점진적으로 도입할 수 있다.
- 합병 관련 API 통합: 서로 다른 회사 또는 시스템의 그래프QL API를 결합할 수 있다.
- 모놀리식 그래프QL 스키마 분해: 대규모 모놀리식 그래프QL 스키마를 더 작고 관리하기 쉬운 서브그래프로 나누고, 이를 단일 쿼리로 집계할 수 있다.
- 대규모 언어 모델(LLM) 기능 통합: 기존 GraphQL API에 대규모 언어 모델 기능을 추가할 수 있다.
슈퍼그래프 그래프QL 예시
그래프QL의 장점 및 단점
그래프QL은 다양한 데이터 요구를 가진 복잡한 애플리케이션을 다루는 개발자에게 유연성과 효율성 면에서 상당한 이점을 제공한다.
하지만 설정 과정이 복잡할 수 있으며, 모든 상황에 가장 적합한 선택은 아닐 수 있다. REST는 간단한 데이터 검색이 필요한 애플리케이션에서 더 효율적인 선택이 될 수 있다.
그래프QL을 사용할지 여부는 애플리케이션의 특정 요구 사항에 기반으로 결정돼야 하며, 데이터 관계의 복잡성, 클라이언트 측 데이터 검색 제어의 중요성, 여러 소스에서 데이터를 요구하는 쿼리의 빈도, 그리고 개발 팀의 그래프QL에 대한 숙련도를 고려해야 한다.
장점
- 대역폭 절약
- API 호출 간소화
- 자동 문서화 지원
- 구독 기능을 통해 실시간으로 데이터를 갱신하는 애플리케이션을 지원
- 프론트엔드 팀이 데이터 요청을 변경하더라도 백엔드 로직에 영향을 미치지 않도록 함
단점
- 서버 측 설정이 복잡함
- 백엔드 개발자에게 높은 학습 장벽이 있을 수 있음
- REST API에 비해 도구가 충분히 발전하지 않았기 때문에, 일부 영역에서 필요한 기능이나 지원이 부족할 수 있음
결론
그래프QL은 다양한 유형의 관련 데이터를 실시간으로 효율적으로 검색해야 하는 애플리케이션에 특히 적합한 쿼리 언어이자 런타임이다. 도입 여부는 애플리케이션의 특정 요구 사항, 관련 데이터의 복잡성, 그리고 개발 팀의 기술적 역량을 고려하여 신중하게 결정해야 한다.
자주 묻는 질문
그래프QL이란 무엇인가요?
그래프QL과 REST API의 차이점은 무엇인가요?
그래프QL은 백엔드인가요, 프론트엔드인가요?
그래프QL은 SQL인가요?
참고 자료
- What is the GraphQL Foundation? (Graphql)
- Linux Foundation – Decentralized innovation, built with trust (Linuxfoundation)
- A Brief History of GraphQL – DEV Community (Dev)
- The supergraph: a new way to think about GraphQL | Apollo GraphQL Blog (Apollographql)