GraphQL
※ 과거에 사내에서 진행한 교육 때 사용한 PPT 자료를 캡처하여 만든 posting이라 실제 소스가 아닌, 캡처하여 작성하였음
(물론 작성자 본인이 교육한 자료)
GraphQL ??
Graph Query Language
- Facebook에서 개발한 Rest API를 대체하기 위한 호출 방법
- 같은 정보(화면상의 한 유저에 대한 데이터)를 동일한 API를 가지고 다른 데이터를 받을 수 있도록할 수 있는 방법
호출 예제 (request body
)
GraphQL 사용 예제
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
Repository
GraphQL 설정
Fetcher
*.graphqls
설정 파일과 매칭되는 파일
Spring MVC 구조에서 service와 비슷한 역할을 한다고 생각하면 된다. (DB 데이터를 불러와 가공하는 비지니스 로직이 포함되어 있다.)
- 소스상의
MutationResolver
,QueryResolver
의 차이는, 기능적인 차이는 없고 단순히 기능을 분리한기 위함이다. Mutation
은 생성, 삭제, 수정 등의 CRUD에서 CUD의 기능을 정의하고,Query
는 CRUD중 R의 기능을 정의한다.
Provider
여러 개의
fetcher
와*.graphqls
설정을 매칭해주는 class
controller
에서는fetcher
가 아니라provider
를 호출한다.
Controller
RestAPI
와는 다르게 하나의controller
를 가지고 모두 호출할 수 있다.controller
에서도 단순히query(request body)
를provider
에게 전달하는 역할만을 수행한다.
*.graphqls 파일 (설정 파일)
실제 사용자가 사용할 수 있도록 interface를 설정한 파일
fetcher
에 선언된method name
과 동일한 이름으로 선언해야 맵핑이 된다.
GraphQL 호출 예제
(캡처 상의 좌측은 Request Body, 우측은 Response 이다…. 오타…..)
목록 조회
단일 조회
업데이트
GraphQL을 고려한 MVC 구조
그래서…
- RESTAPI나 GraphQL, 둘중 뭐가 좋다 나쁘다는 케바케일 듯하다.
- GraphQL은 하나의 정보에 대해서 요청하는 데이터가 다를 경우에 유용하게 쓰일 듯하다. (ex> 유저의 ID만 필요한 API, 유저의 주소, 성별이 필요한 API)
- 현재까지 개발하면서 특별히 필요한 경우는 보지 못했지만, 알고 있으면 언젠가 유용하게 쓸수 있을 듯하다.