GraphQL 찍먹

dev_314·2023년 5월 8일
0

참고
GraphQL 개념잡기

GraphQL

SQL은 관계형데이터베이스를 다루는 문법
GraphQL (이하 gql)은 gql을 지원하는 서버에서 데이터를 요청하는 '문법, 형식'

gql은 HTTP Protocol의 POST Method위에서 작동한다.
gql문법을 만족하는 데이터를 POST Method의 Body에 담아 서버로 전송하는 것이다.

주로 비교되는 REST API를 지원하는 서버는 여러 Endpoint를 가지고, 각 Endpoint는 한 가지 성격의 작업을 수행하는 반면,
gql은 1개의 Endpoint만을 가진다. gql 요청을 받은 서버측에서 요청을 분석한 뒤, 적합한 작업을 선택하여 수행하는 것이다.

REST API 서버는 1(EndPoint):1(Operation) 쌍이 여러개 존재
GraphQL 서버는 1(EndPoint):M(Operation)이 1개 존재

gql 구조

# 기본 형태 (일반 쿼리)
{
	hero {
    	name
    }
}

gql은 크게 QueryMutation으로 구분된다.

Query(질의)는 Read
Mutation(변조)은 Create, Update, Delete 

단순히 의미를 구체화하기 위해 개념적으로 구분한 것이다.

[query | mutation] {
	...
}

Query

# 일반쿼리
{
  human(id: "1000") {
    name
    height
  }
}

# 오퍼레이션 네임 쿼리
query HeroNameAndFriends($episode: Episode) {
  hero(episode: $episode) {
    name
    friends {
      name
    }
  }
}

쿼리는 일반 쿼리오퍼레이션 네임 쿼리로 구분할 수 있다.

일반 쿼리는 다짜고짜 중괄호로 시작하고, 오퍼레이션 네임 쿼리는 앞에 query가 붙어있다.

일반 쿼리는 Specific한 내용을 담고있는 반면, 오퍼레이션 네임 쿼리는 마치 함수처럼, 변수 개념을 통해 재사용할 수 있다. react apollo client같은 gql을 구현한 클라이언트를 통해 변수에 값을 할당하여 사용한다.

여기서 일반적인 REST API와 프로그래밍 페러다임(?)적으로 차이점이 있는데,
REST API는 데이터를 반환하는 쪽에서 어떤 데이터를 조회할지 SQL문을 통해 결정하는데,
GQL은 데이터를 요청하는 쪽에서 어떤 데이터를 조회할지 GQL을 통해 결정한다.

SQL은 백엔드 개발자가 작성, 관리
GQL은 프론트엔드 개발자가 작성, 관리

이러한 관계를 통해 프론트엔드가 백엔드 API의 Request, Response에 덜 의존적일 수 있다.

그러나 데이터 스키마에는 여전히 의존적임을 지적함 -> 애초에 극복할 수 있는 문제인가...?

schema/type

의미는 데이터베이스의 스키마와 비슷하나, 형태는 C언어의 헤더 파일과 비슷하다.

type Character {
  name: String!
  appearsIn: [Episode!]!
}
오브젝트 타입 : Character
필드 : name, appearsIn
스칼라 타입 : String, ID, Int 등
느낌표(!) : 필수 값을 의미(non-nullable)
대괄호([, ]) : 배열을 의미(array)

Resolver

SQL만 작성하면 DBMS가 알아서 데이터를 가져오는 것과 달리, GQL은 resolver(이하 리졸버)를 직접 구현함으로써 데이터를 가져오는 구체적인 과정을 명시해야 한다.

gql 쿼리문 파싱은 보통 gql 라이브러리를 사용해서 처리

리졸버를 직접 구현해야하는 부담은 있지만, 데이터 source에 상관 없이 구현 가능하다는 장점이 있다.

리졸버를 통해 데이터를 데이터베이스에서 가져 올 수 있고, 일반 파일에서 가져올 수 있다.
심지어 http, SOAP와 같은 네트워크 프로토콜을 활용해서 원격 데이터를 가져올 수 있다.

Graph의 의미

gql 쿼리에서는 각각의 필드마다 다음 타입을 반환하는 함수가 하나씩 존재 한다. 그리고 그 함수가 바로 리졸버인 것이다.

리졸버는 다음과 같은 특징을 갖는다.

  1. 필드가 스칼라 값(문자열이나 숫자와 같은 primitive 타입)인 경우에는 실행 종료
  2. 필드의 타입이 스칼라 타입이 아닌 우리가 정의한 타입이라면 해당 타입의 리졸버를 호출

이처럼 리졸버는 필드에 따라 연쇄적으로 호출될 수 있고, 그 과정이 마치 그래프 탐색과 유사하다.

GraphQL 서버 개발하기

gplgen으로-GraphQL-서버-만들기를 참고

profile
블로그 이전했습니다 https://dev314.tistory.com/

0개의 댓글