GraphQL, Apollo Server

김성윤·2022년 12월 27일
0

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의 구현 조건)

  • Query : 데이터 읽을 때 사용(Read)
  • Mutation : 데이터 변경(Create,Update,Delete)
  • Subscription : 실시간으로 변경되는 데이터 가져오기(websocket)

오퍼레이션 이름이 붙은 쿼리는 데이터베이스에서의 프로시져 개념과 유사
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가지 인수를 받음

  • parent : 부모 리졸버가 리턴한 객체
  • args : 쿼리에서 입력으로 넣은 인자
  • context : 모든 리졸버에게 전달됨(주로 미들웨어로부터 입력된 값)
  • info : 스키마 정보와 현재 쿼리의 특정 필드 정보. 잘안씀

인트로스펙션(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/

profile
Nest.js 백엔드 개발자

0개의 댓글