GraphQL은 페이스북에서 만든 쿼리 언어.
GraphQL은 웹 클라이언트가 데이터를 서버로부터 효율적으로 가져오는 것이 목적이다.
SELECT plot_id, species_id, sex, weight, ROUND(weight / 1000.0, 2) FROM surveys;
sql 쿼리 예시
{
hero {
name
friends {
name
}
}
}
gql 쿼리 예시
데이터베이스, 플랫폼, 네트워크 방식에 종속적이지 않음
GraphQl 인터페이스간 송수신은 네트워크 레이어 L7의 HTTP POST 메소드, 웹소켓 프로토콜 활용. 경우에 따라 L4 TCP/UDP L2 Ethernet 사용 가능
GraphQL은 여러번 호출 할 필요없이 한번의 호출로 처리가 가능하다
GraphQL 구조와 한계
서버와 클라이언트 사이에 Service Broker 레이어가 더 들어감.
-> 기존의 클라이언트에서 데이터를 조합하던 역할이 GraphQL로 옮겨지는 것
GraphQL을 쓰면 클라이언트에서는 편해지지만, 그만큼 서버의 일이 가중됨.
GraphQL 장점
유지보수+확장이 용이한 API 구현 가능,서버에서 할 수 있는 일을 스키마 단위로 파악할 수 있음, 서버 리소스 최적화, 클라이언트 요청 부담 감소
GraphQL 구조
Query/Mutation/Subscription3가지 요청 방식 제공(Operation)
쿼리가 실행되는 순서
Query 필드가 병렬로 실행되는 동안 Mutation 필드는 순차적으로 실행. 즉, 하나의 요청에서 두 개의 Mutation를 보내면 순차적으로 실행되어 경쟁 상태가 되지 않도록 합니다. (GraphQL의 구현 조건)
오퍼레이션 이름이 붙은 쿼리는 데이터베이스에서의 프로시져 개념과 유사
gql 오퍼레이션은 클라이언트 프로그래머가 작성,관리
과거 협업에서는 FE가 BE가 작성,전달하는 API 의 Req,Res에 의존 but gql에서는 이런 의존도가 많이 사라짐. 여전히 데이터 스키마에 대한 협업 의존성은 존재
GraphQL 스키마의 기본적인 구성 요소는 객체타입.
type Character {
name: String!
appearsIn: [Episode]!
}
리졸버(Resolver)
A resolver is a function that's responsible for populating the data for a single field in your schema.
리졸버는 스키마의 필드에 데이터를 제공하는 함수이다.
백엔드 디비나 서드파티에서부터 데이터를 받아올 수 있음
gql 쿼리에서는 각각의 필드마다 함수(리졸버)가 하나씩 존재한다고 생각하면 됨. 필드가 스칼라(primitive type)값이면 실행 종료
resolver chain은 DFS로 구현된 것으로 추측-> 그래서 'Graph'QL?
리졸버는 4가지 인수를 받음
인트로스펙션(Introspection)
서버 자체에서 현재 서버에 정의된 스키마의 실시간 정보를 공유를 할 수 있게 함
Swagger 같은건가 ?
간단하게 사용해봤는데, 나중에 많이 적용해볼 기회가 있으면 좋겠다.
출처
https://kotlinworld.com/330
https://tech.kakao.com/2019/08/01/graphql-basic/
https://smoh.tistory.com/296
https://www.apollographql.com/docs/apollo-server/data/resolvers/