GraphQL은 쿼리 데이터베이스용으로 만들어진 개념을 가져다가 인터넷에 적용해 만들어진 것입니다. GraphQL 쿼리 하나로 여기저기 흩어져 있는 데이터를 한데 모아 받습니다. SQL처럼 GraphQL 쿼리도 데이터를 변경하거나 삭제할 때 사용합니다.
GraphQL과 SQL은 둘 다 쿼리 언어이기는 하나, 사용 환경이 완전히 다릅니다.
(출처: 웹 앱 API 개발을 위한 GraphQL | 이프 포셀로, 알렉스 뱅크스 저)
SQL 쿼리
- 데이터베이스로 보냄
- SQL데이터는 데이터 테이블 안에 저장돼 있음
- 데이터베이스용 쿼리언어
- 주로 벡엔드 시스템에서 작성하고 호출
GraphQL쿼리
- API로 보냄
- GraphQL데이터는 저장 환경을 가리지 않음 - 단일 데이터베이스, 여러 개의 데이터베이스, 파일 시스템, REST API, 웹소켓, 또다른 GraphQL API로 부터 데이터를 받아올 수 있음
- 인터넷용 쿼리언어
- 주로 클라이언트 시스템에서 작성하고 호출
- 명세에 따라 표준화 되어있음 - 프로그래밍 언어에 종속되지 않음
REST API VS GraphQL
REST API | GraphQL |
다양한 Endpoint가 존재 | 단 하나의 Endpoint - 한 번의 네트워크 호출로 처리 |
Endpoint마다 SQL 쿼리가 달라짐 | gql 스키마의 타입에 따라 SQL 쿼리가 달라짐 |
REST의 가장 일반적인 문제인 언더페치와 오버페치가 존재 | 클라이언트 측에서 응답 형식을 지정할 수 있으므로 언더페치와 오버페치 문제를 해결할 수 있음 |
언더페치(underfetch) - REST API를 사용할 때 필요한 데이터를 완성하기 위해 여러번의 API 요청을 해야 하는 경우
오버페치(overfetch) - 필요한 정보 이외에 불필요한 정보까지 함께 요청하거나 응답받는 경우
REST API를 사용할 경우 필요한 정보를 위해 몇 번의 요청을 해야하는 경우(언더페치)가 발생
GraphQL API를 사용할 경우 필요한 데이터들을 쿼리로 작성하고 해당 형식과 거의 동일한 JSON응답을 받을 수 있음
Query: 데이터 요청 (SQL에서의 SELECT) - R
GraphQL에서는 SELECT대신 Query를 사용해 데이터 요청을 보냄. 쿼리 안에 서버에서 받고싶은 데이터를 필드로 작성.
쿼리 한 번에 여러 종류의 데이터를 모두 받을 수 있음.
GraphQL API에서 쿼리에 사용할 수 있는 필드는 API 스키마에 정의.
응답받은 JSON은 쿼리가 요청한 데이터가 모두 들어있으며, 쿼리의 형태와 똑같음.
만약 응답 객체의 필드명을 다르게 설정하고 싶다면 각 필드에 별칭을 부여하면 됨.
원하는 쿼리 결과만 받고싶다면 쿼리 인자(query arguments)를 넣어 보낼 수 있음.
쿼리 필드와 관련 있는 키-값 쌍을 하나 이상 인자로 넣을 수 있음.
GraphQL쿼리에서 필드는 스칼라(scalar)타입과 객체(object)타입이 있으며 스칼라 타입은 Int, Float, String, Boolean, 그리고 ID(고유 식별자)가 해당되며 객체타입은 스키마에 정의한 필드를 그룹으로 묶어둔 것.
타입 여러 개를 한 번에 리스트에 담아 반환하고 싶다면 유니언 타입(union type)을 만들어 사용하면 됨.
Mutation: 데이터 조작 (INSERT, UPDATE, DELETE) - CUD
데이터를 수정하려면 뮤테이션을 사용. 애플리케이션의 전반적인 상태를 수정하고자 하는 의도로 사용.
데이터를 뮤테이션 하면 백엔트 데이터에 영향을 주게 됨.
Subscription: 소켓 연결로 전달되는 데이터 변경 사항을 감지
데이터 서브스크립션(구독)을 하게되면 GraphQL API를 사용해 실시간 데이터 변경 내용을 받을 수 있음.
페이스북의 좋아요 수를 새로고침 없이 실시간으로 보여주는 방법에 쓰임.
서브스크립션이 시작되면 웹소켓으로 변경 내용을 받아 볼 수 있음.
Introspection
인트로스펙션을 사용하면 현재 API 스키마의 세부 사항에 관한 쿼리를 작성할 수 있음.
현재 서버에 정의된 스키마의 실시간 정보 공유를 가능하게 함.
Resolver
특정 필드의 데이터를 반환하는 함수. 스키마에 정의된 타입과 형태에 따라 데이터를 반환.
비동기로 작성할 수 잇으며 REST API, 데이터베이스, 혹은 기타 서비스의 데이터를 가져오거나 업데이트 작업을 할 수 있음.
+ 참고
웹 앱 API 개발을 위한 GraphQL | 이프 포셀로, 알렉스 뱅크스 저
'STUDY > TIL' 카테고리의 다른 글
S3와 CloudFront (0) | 2020.12.15 |
---|---|
Public API로 GraphQL 경험해보기 (0) | 2020.09.28 |
Ionic | 아이오닉 + 리액트 프로젝트 시작하기 (0) | 2020.09.04 |
네이티브 앱, 웹 앱, 하이브리드 앱 (0) | 2020.08.29 |
ReactJS와 React Native의 차이점? (0) | 2020.08.24 |