[GraphQL] GraphQL이란 무엇인가?
(글쓴날 : 2020.04.22)
* 이 글은 GraphQL에 대한 단순 소개 글입니다.
GraphQL이란?
1) GraphQL 소개
GraphQL이란 페이스북이 모바일 앱을 재구성하기 위해 노력하던 2012년 개발되어 2015년 오픈소스로 공개된 데이터 쿼리 언어입니다.
자체적으로 서버와 클라이언트를 구축해 애플리케이션 서버 및 데이터베이스와 클라이언트 사이에서 Operation과 Resolve의 과정을 통해 서로 간의 데이터 상호작용을 도와줍니다.
특징으로는 어떤 종류의 Back-End(데이터베이스 및 다른 API 등)에도 연동이 가능하며, 강타입 및 단일 Endpoint를 지향합니다.
특히, REST API가 가진 구조적 문제인 Over-fetching과 Under-fetching을 해결할 수 있다는 큰 장점으로 인해 REST API의 대체자로 점점 떠오르고 있습니다.
* Over-fetching
예를 들어, 운영하는 서비스의 특정 회원 이름과 나이가 각기 다른 페이지에서 따로 필요하다고 가정했을 때, 기존 REST API 체계에서는 /user/name, /user/age처럼 요청할 Endpoint를 두 갈래로 분리하지 않는 이상 해당 페이지에서 필요하지 않은 정보들까지 받아와야만 합니다.
* Under-fetching
예를 들어, 채팅 서비스를 운영한다고 가정할 시 사용자가 서비스에 로그인했을 때, 상태를 표시할 회원 정보, 친구 목록, 프로필 사진, 대화 기록 등 여러 데이터를 요청하기 위해, 기존 REST API 체계에서는 /user/status, /user/friendslist/, /user/profilephoto, /user/talkrecord 등 여러 Endpoint를 통해 데이터를 받아와야만 합니다.
* GraphQL을 사용 중인 기업 (이외에도 Airbnb 등 수많은 곳에서 사용 중입니다.)
2) GraphQL의 핵심 요소
GraphQL은 서버에 Query, Mutation 등 사용자가 원하는 구조의 Schema를 직접 구축한 후, 클라이언트로부터 해당 요청을 받을 시, Resolver를 통해 요청된 데이터를 반환하는 구조입니다.
(1) Query
Query란 데이터베이스로부터 데이터를 얻어오기 위해 사용하는 것으로,
type Query {
(쿼리명): (반환 타입) (!)
}
의 형태로 선언합니다.
만약 반환 타입 뒤 !(느낌표)를 붙일 시, 해당 요청이 들어오면 명시한 타입의 데이터를 반드시 반환해야만 하며, 사용자 정의 반환 타입을 생성하여 Query의 반환 타입에 적용이 가능하므로 임의의 객체를 반환하고자 할 때 반환 타입을 새로 만들어 타입 지정을 합니다.
ex)
(2) Mutation
Mutation이란 서버, 데이터베이스 혹은 메모리에서 데이터를 변경할 때 사용하며,
CRUD(Create, Read, Update, Delete) 중 CUD 요청을 담당합니다.
만약, GraphQL을 데이터베이스와 연동하여 사용하지 않는다면, Mutation을 하더라도 메모리에 변경사항이 적용되어 서버 재실행 시 초기화가 되므로 주의해야 하며, 선언은 Query의 방식과 같습니다.
ex)
(3) Resolver
Resolver란 클라이언트로부터 요청된 Query 혹은 Mutation에 대해 반환할 결과를 생성하는 로직으로, GraphQL 서버가 Resolver를 찾아 Query와 Mutation에 해당하는 함수를 실행합니다.
또한, Resolver를 통해 데이터베이스, 메모리, 다른 API 등과 연결해 자유자재로 프로그래밍이 가능해지며, 실행 함수의 첫 번째 인자로는 현재 Object가 넘어오고, 두 번째부터 요청된 Query나 Mutation에서 넘어온 인자가 객체의 형태로 전달되기 때문에 ( _, { arg1, arg2, ... } )의 형태로 인자를 넘겨받아 사용합니다.
ex)
여기까지, 요새 화두인 GraphQL에 대해 알아보았습니다.
GraphQL이 REST API를 대체할 수 있을뿐더러 정말 좋은 것은 틀림없는 사실이지만, 특정 부분에서는 단점도 존재한다고 하니 상황에 맞추어 유연하게 사용할 수 있도록 숙달해야겠습니다.
만약, GraphQL에 대하여 더 궁금하신 분들이 계시다면...
* GraphQL 공식 홈페이지 : GraphQL 공식 홈페이지
위의 GraphQL 공식 홈페이지를 참조하시면 되겠습니다.
감사합니다!
'Deprecated' 카테고리의 다른 글
[Baekjoon Online Judge] 백준 1915번 가장 큰 정사각형(C++, Python) (0) | 2020.04.24 |
---|---|
[Baekjoon Online Judge] 백준 1937번 욕심쟁이 판다(C++, Python) (0) | 2020.04.23 |
[Baekjoon Online Judge] 백준 11051번 이항 계수 2(C++, Python) (0) | 2020.04.22 |
[Baekjoon Online Judge] 백준 9252번 LCS 2(C++, Python) (0) | 2020.04.22 |
[Baekjoon Online Judge] 백준 9251번 LCS(C++, Python) (0) | 2020.04.21 |