본문 바로가기

개발이야기

GraphQL In Action | GraphQL 소개

GraphQL 소개

발명은 필요에서부터 시작된다.

페이스북이 그래프QL을 만들기로 한 이유는 모바일 애플리케이션 개발 시 발생하는 여러 기술적인 문제를 해결하기 위해서였습니다. 하지만 현재 그래프QL이 인기를 얻고 있는 이유는 기술적 문제보다는 커뮤니케이션 문제를 해결하기 때문이다.

커뮤니케이션은 아주 어려운 기술이다.

커뮤니케이션 능력을 키우면 다양한 방면에서 삶이 윤택해진다. 마찬가지로 소프트웨어의 각기 다른 부품 간에 발생하는 커뮤니케이션의 품질을 향상시키면 해당 소프트웨어를 이해하기 쉬워질 뿐만 아니라, 개발, 유지관리, 확장도 쉬워진다.

그래프QL이 판도를 바꿀 수 있다고 생각하는 것도 이 때문이다. 서로 다른 소프트웨어 (프론트엔드와 백엔드)가 커뮤니케이션하는 방법을 바꿔버리는 게임 체인저이다. 프론트엔드와 백엔드에 동등한 힘을 실어주면서, 서로 독립할 수 있게 해준다. 또한, 둘 사이의 커뮤니케이션 프로세스를 기술적 전송 채널에서 분리해주며, 말로는 한정된 단어밖에 사용할 수 없는 일반 커뮤니케이션 언어를 대체하도록 표현력이 풍부한 언어를 제공한다.

GrapQL이란?

그래프QL의 그래프는 현실 세계의 데이터를 표현하는 가장 적합한 방법이 그래프라는 사실에 착안했다. 크든 작든 데이터 모델을 분석하게 되면 객체 간의 관계를 그래프로 표현한 것을 보게된다.

그래프로 생각하면 더 쉬운 것을 왜 굳이 URL에 포함된 리소스나 테이블로 생각하는 것일까? 그렇다고 그래프 QL을 그래프 데이터베이스에서만 사용할 수 있는 것은 아니다. 문서형 데이터베이스(MongoDB)나 관계형 데이터베이스는 물론이고 API 데이터를 그래프 형태로 표현할 때도 사용할 수 있다.

GraphQL의 QL은 Query Language를 의미해 오해를 불러일으킬 수 있다. API를 사용하는 프론트엔드 입장에서만 보면 그래프QL은 데이터 API용 쿼리 언어가 맞지만, 한편으로 백엔드에서 구현돼야 하는 런타임 계층의 역할도 한다. 프런트엔드는 이 런타임 계층이 제공하는 새로운 언어를 사용해서 데이터를 받는다.

그래프 QL언어는 선언적이며 유연하고 효율적으로 설계되었다. 데이터 API를 사용하는 클라이언트 (모바일이나 웹 애플리케이션)개발자는 서버에 저장된 데이터 구조나 데이터 관계를 이해할 필요가 없다. 머리 속에 떠오른 그대로 유사한 언어를 사용해서 원하는 데이터를 요청하면 된다.

백엔드에는 GraphQL 기반 런타임이 필요하다. 이 런타임은 API를 통해 제공될 데이터의 구조를 관리한다. 이 구조를 그래프QL에서는 스키마라고 부른다. API 사용자는 그래프 QL 언어를 사용해서 필요한 데이터를 정확하게 요구하기 위한 텍스트를 구성하고 클라이언트는 이 텍스트 요청을 전송 채널(예:HTTPS)를 통해 API 서비스에 전달한다. 그러면 그래프QL의 런타임 계층이 이 텍스트 요청을 받아서 백엔드에 있는 다른 서비스들과 커뮤니케이션하고 그 결과들을 모아서 적합한 데이터를 만든다. 그렇게 만들어진 데이터를 JSON과 같은 형식으로 API 사용자에게 반환하는 것이다.

그래프QL은 백엔드나 프런트엔드 프레임워크, 기술 스택, 데이터베이스 등 어떤 것에도 종속되지 않는다. 즉 아무 프론트엔드, 백엔드 환경에서든 어떤 데이터베이스를 사용해도 된다는 의미이다. 전송 채널이나 데이터 형식에도 제한이 없다.

그래프QL을 사용하기 위해 리액트나 아폴로, 릴레이가 필요한 것은 아니지만, 이런 라이브러리들과 함께 사용하면 복잡한 데이터 관리 작업을 알아서 해주므로 그래프QL의 활용도를 높여준다.

일반적으로 API란 애플리케이션 상에 있는 다수의 컴포넌트 간의 커뮤니케이션을 원활하게 만드는 인터페이스를 의미한다. 예를 들어, 어떤 API는 웹 클라이언트와 데이터베이스 서버 간 커뮤니케이션을 가능하게 해준다. 클라이언트는 필요한 데이터를 서버에 요청하고 서버는 클라이언트가 요구한 데이터를 객체로 반환한다.

API에는 여러 종류가 있으며 규모가 큰 애플리케이션은 모두 API를 가지고 있다. 그래프QL에서 말하는 API는 데이터를 읽고 수정하기 위한 API로 이것을 데이터 API라고 한다.
그래프QL은 프로그래밍 가능한 많은 인터페이스중 하나로 애플리케이션이 필요로 하는 데이터를 읽고 수정할 수 있게 해준다. 그래프QL 이외에도 REST, SOAP, XML등의 인터페이스가 있으며 SQL도 여기에 포함된다.

SQL(Structured Query Language)는 QL이라는 이름 때문에 그래프 QL과 비교 대상이 되기도 한다. SQL과 그래프QL모두 데이터 스키마를 요청할 수 있는 언어이며, 양쪽 모두 데이터를 읽고 수정할 수 있다.

SQL은 데이터 교환을 위해 모바일이나 웹 애플리케이션에서 사용하기에 적합하지 않다. SQL은 강력하면서도 유연성이 높으므로 오히려 문제를 초래할 수 있다. 예를 들면 데이터베이스 구조를 노출시켜서 심각한 보안 문제를 불러오기도 한다. 이런 문제를 보안하기 위해 SQL을 다른 서비스 계층에 둘 수 있지만, 사용자의 SQL 쿼리를 서버에 보내기 전에 처리할 수 있는 파서(parser)나 분석기(analyzer)를 만ㄷ르어야한다. 이 파서와 분석기의 역할을 대체하는 것이 그래프QL 서버이다.

특정 데이터베이스에서 그래프QL언어로 만들어진 쿼리를 실행하려면 런타임이 있어야한다. 즉 그래프QL을 지원하는 서비스 계층을 설정하거나 직접 해당 기능을 구현해야한다.

JSON은 데이터 교환을 위해 사용되는 언어이다. JSON은 API 서버에서 클라이언트로 데이터를 전송할 때 자주 사용되는 언어이다. 대부분의 최신 API 서버는 JSON을 사용해서 클라이언트 애플리케이션이 요구하는 데이터를 전달한다. 그래프QL 서버도 예외는 아니다.JSON은 GrahpQL의 데이터 요구사항을 만족시켜주는 일반적인 옵션중 하나이다.

그래프QL 쿼리를 한번 보자.

{
  employee(id: 42) {
    name
    email
    birthDate
    hireDate
  }
}

그래프QL 서버는 이 구문을 해석해서 데이터 저장 엔진이 이해하는 언어로 변환한다.

'개발이야기' 카테고리의 다른 글

GraphQL In Action | GraphQL 작업 수정 및 구성  (0) 2022.08.25
GraphQL In Action | GraphQL API  (0) 2022.08.15
CodeDeploy Ubuntu 22.04 오류  (0) 2022.07.22
Pre-rendering  (0) 2022.06.30
객체지향의 사실과 오해 | 7장  (0) 2022.06.26