mj@home:~$

GraphQL

※ 과거에 사내에서 진행한 교육 때 사용한 PPT 자료를 캡처하여 만든 posting이라 실제 소스가 아닌, 캡처하여 작성하였음
(물론 작성자 본인이 교육한 자료)

GraphQL ??

Graph Query Language

  • Facebook에서 개발한 Rest API를 대체하기 위한 호출 방법

graphql의 필요성

  • 같은 정보(화면상의 한 유저에 대한 데이터)를 동일한 API를 가지고 다른 데이터를 받을 수 있도록할 수 있는 방법

호출 예제 (request body)

graphql의 예제

GraphQL 사용 예제

예제 소스 Github

dependency

		<dependency>
		    <groupId>com.graphql-java</groupId>
		    <artifactId>graphql-java</artifactId>
		    <version>11.0</version>
		</dependency>
		<dependency>
		    <groupId>com.graphql-java</groupId>
		    <artifactId>graphql-java-tools</artifactId>
		    <version>5.2.4</version>
		</dependency>

Repository/Domain 설정

  • Spring JPA를 사용하여 예제 작성

Domain

domain 설정

Repository

repository 설정

GraphQL 설정

Fetcher

*.graphqls 설정 파일과 매칭되는 파일
Spring MVC 구조에서 service와 비슷한 역할을 한다고 생각하면 된다. (DB 데이터를 불러와 가공하는 비지니스 로직이 포함되어 있다.)

  • 소스상의 MutationResolver, QueryResolver의 차이는, 기능적인 차이는 없고 단순히 기능을 분리한기 위함이다.
  • Mutation은 생성, 삭제, 수정 등의 CRUD에서 CUD의 기능을 정의하고, Query는 CRUD중 R의 기능을 정의한다.

fetcher 설정 1

fetcher 설정 2

Provider

여러 개의 fetcher*.graphqls 설정을 매칭해주는 class
controller에서는 fetcher가 아니라 provider를 호출한다.

provider 설정 1

provider 설정 2

Controller

  • RestAPI와는 다르게 하나의 controller를 가지고 모두 호출할 수 있다.
  • controller에서도 단순히 query(request body)provider에게 전달하는 역할만을 수행한다.

controller 설정

*.graphqls 파일 (설정 파일)

실제 사용자가 사용할 수 있도록 interface를 설정한 파일
fetcher에 선언된 method name과 동일한 이름으로 선언해야 맵핑이 된다.

graphqls 설정 파일 설정

GraphQL 호출 예제

(캡처 상의 좌측은 Request Body, 우측은 Response 이다…. 오타…..)

목록 조회

목록 조회

목록 조회

단일 조회

단일 조회

업데이트

업데이트

GraphQL을 고려한 MVC 구조

REST API vs GraphQL

그래서…

장단점

  • RESTAPI나 GraphQL, 둘중 뭐가 좋다 나쁘다는 케바케일 듯하다.
  • GraphQL은 하나의 정보에 대해서 요청하는 데이터가 다를 경우에 유용하게 쓰일 듯하다. (ex> 유저의 ID만 필요한 API, 유저의 주소, 성별이 필요한 API)
  • 현재까지 개발하면서 특별히 필요한 경우는 보지 못했지만, 알고 있으면 언젠가 유용하게 쓸수 있을 듯하다.