Michael Shin

Software Engineer

Michael Shin

Software Engineer

1. GraphQL 소개3 min read

Jul 3, 2019

Index

  1. GraphQL 소개
  2. GraphQL과 REST API 비교
  3. NodeJS에서 Graphql과 playground 환경 설정
  4. Graphql 스키마와 타입
  5. Graphql API 쿼리 구조(query와 mutation)

 

GraphQL은 페이스북이 어떤 문제를 해결하고자 2012년에 개발한 쿼리 언어입니다. 이 문제는 앞으로 다루게 될 GraphQL을 설명하는 핵심이 됩니다. 이후 2015년 GraphQL은 공개되었고 2016년부터는 GraphQL Summit을 통해 GraphQL의 발전과 업적들을 꾸준히 발표해 오고 있습니다.

한 번 더 강조하면 GraphQL은 쿼리 언어입니다. 쿼리 언어는 서버에 데이터를 요청하고 가져오기 위해 사용합니다. 다음은 GraphQL 메인페이지의 배너에 나와 있는 그림입니다.

간단히 세문장으로 설명하고 있습니다.

  1. 데이터를 표현하세요(Describe your data)
  2. 원하는 것을 요청하세요(Ask for what you want)
  3. 예측가능한 결과를 얻으세요(Get predictable results)

쿼리 언어로써의 기능과 사용법을 설명한 것입니다. 그럼 위의 자료로 부터 GraphQL의 특징을 알아보겠습니다.

 

 

GraphQL의 특징

Data 정의

쿼리 응답

위 첫번째 캡쳐는 project에서 name 중 “GraphQL”을 가진 데이터를 찾아 tagline을 가져오라는 쿼리입니다. 그리고 두번째 캡쳐는 응답으로 tagline의 데이터를 가져온 결과입니다.

위의 자료를 관찰 했을 때 알아낼 수 있는 것중 한 가지는 쿼리(원하는것을 요청하세요)와 응답(예측가능한 결과를 얻으세요)의 형태가 닮았다는 것입니다. 이것은 정확히 요청을 반영하여 응답했다는 것을 의미합니다. GraphQL은 원하는 데이터만으로 정의된 쿼리를 만들 수 있습니다. 그 결과 자료와 같이 정확히 우리가 얻고자 하는 데이터만을 결과로 얻을 수 있습니다. 쿼리에 반환된 데이터의 모양을 예측할 수 있고 애플리케이션을 작성할 때 필요한 데이터를 가져오기 위한 쿼리를 작성하기가 쉬워지는 장점이 생기게 됩니다.

 

계층적 구조

위 캡쳐는 Project 구조를 정의한 것입니다. Project 밑으로 name, tagline, contributors가 있고 contributors 밑으로는 User가 정의되어 있습니다.

GraphQL은 자연스럽게 SQL의 복잡한 결합문을 필요로하는 객체 간의 관계를 정의할 수 있습니다.

 

타입 지정

GraphQL API는 타입과 필드로 구성됩니다. 쿼리의 각 레벨은 특정 타입에 일치하고 각 타입은 이용 가능한 필드의 집합으로 정의할 수 있습니다. 그렇기 때문에 GraphQL은 애플리케이션이 사용가능한 것만을 요청하고 오류 또한 명확히 잡아낼 수 있습니다.

 

지금까지 쿼리 언어로써 GraphQL의 기본적인 특징에 대하여 알아보았습니다. 하지만 이것만으로 GraphQL을 사용해야 하는것일까요? 다음으로는 페이스북이 GraphQL을 왜 만들게 되었는지 알아보겠습니다.

 

 

왜 GraphQL이 만들어졌을까요?

참고: https://code.fb.com/core-data/graphql-a-data-query-language/

2012년 페이스북은 페이스북의 기본 모바일 애플리케이션을 재구성하기 시작하였고 페이스북 전부를 다룰 수 있을 만큼 강력한 데이터 패치 API가 필요하다는 것을 느끼게 되었습니다. 당시 페이스북의 모바일 앱은 단지 모바일용 웹사이트의 껍데기에 불과했습니다. 더욱이 기능이 복잡해짐에 따라 성능은 떨어졌고 버그도 자주 일어났습니다. 이런 필요를 느끼게 된 건 모바일 애플리케이션이 모델과 뷰 형태로 전환되면서입니다. 이전까지 페이스북은 News Feed를 HTML로만 제공하였습니다. 그리고 News Feed의 API 데이터 버전이 필요하다고 느낀 것입니다. 페이스북은 RESTful 서버 리소스와 FQL 테이블(페이스북의 SQL과 유사한 API)을 후보에 두고 평가하였지만, 앱에서 사용하고자 하는 데이터와 서버 쿼리 간의 차이로 인해 고민에 빠지게 됩니다. 페이스북은 데이터를 리소스 URL, 보조키, 조인 테이블과 같은 방법으로 보지 않고 JSON 또는 NSObject 처럼 앱에서 궁극적으로 사용하는 모델과 객체의 그래프로 생각하고 싶어 했습니다. 이러한 바램으로 페이스북은 GraphQL을 디자인하였고 공개하였습니다. 페이스북에서 했던 고민과 GraphQL이 만들어진 이유에 대해 더 자세히 설명하기 위해서는 REST API와의 차이점을 알아야 합니다. 다음 포스트에서 REST API와 GraphQL을 비교해 보고 GraphQL의 특징에 대해 더 자세히 설명하겠습니다.