GraphQL이란
- 페이스북에서 만든 API용 쿼리 언어
- sql과 graphql의 차이점
- sql: 데이터베이스 시스템에 저장된 데이터를 효율적으로 가져오는 것이 목적, 쿼리를 주로 벡엔드 시스템에서 작성하고 호출
- grpahql: 웹 클라이언트가 서버로부터 데이터를 효율적으로 가져오는 것이 목적, 쿼리를 주로 클라이언트 시스템에서 작성하고 호출
- 특징
- 쿼리언어이다 보니 스키마 작성이 필요하다. (클라이언트와 서버간 스펙 정의)
- Restful API에서 발생하는 under-fetching, over-fetching 이슈를 해결할 수 있다.
Java 진영의 GraphQL Library
Java/Kotlin 진영에서 사용 가능한 GraphQL 라이브러리는 여러가지가 있다.(Spring For GraphQL, MicroProfile GraphQL, Jimmer 등등). 대표적으로 kickstart/dgs/grahql-koltin 3가지만 비교해보고자 하며 참고로 아래 3가지는 모두 JVM 기반 grpahql -java의 구현체이다.
1. Graphql Java Kickstart
- 작성일 기준 latest version: 15.1.0 (3주전)
- 스키마와 매핑되는 클래스 생성
- 스키마와 매핑되는 vo 클래스를 직접 생성하는 선언적 방식이다.
- 튜토리얼 영상: https://www.youtube.com/watch?v=rH2kdMPUQpQ&t=446s
- 일일히 클래스를 정의하고 필드를 선언하는 것이 꽤나 노가다일 수도 있을 것 같다.
- 스키마와 매핑되는 vo 클래스를 직접 생성하는 선언적 방식이다.
- 스키마의 쿼리와 코드의 메서드간 바인딩은 메서드 네이밍과 쿼리명이 일치해야 한다.
- dataloaders 구현 방법
-
- 회사에서 kickstart -> dgs로 넘어가는 과도기에 입사하게 되어서 kickstart 경험을 아예 안해봤다고 할 수 있다. kickstart + graphql koltin 으로 구성되어 있던 서비스 하나를 dgs로 전환하는 프로젝트에 참여하긴 했지만 하필 dataloader를 사용하지 않던 간단한 포팅용 서비스였다. 구성 아키텍처를 그림으로 봤을 때 kickstart는 N+1 이슈를 처리하는 dataloaders 구현시 Dataregistry와 GraphQLServletContextBuilder를 함께 사용해야 하는 듯 하다.
- 예시 코드
- Application Architecture

2. DGS
- 작성일 기준 latest version: 8.2.0(3주전)
- Netflix에서 출시한 라이브러리
- Code Generation 기능
- 프로젝트 빌드시 스키마를 기반으로 코드를 생성해준다.
- kikstart에서 dgs로 전환할 때 편리해졌다고 할 수 있는 기능인데, 아무래도 직접 선언하는 방식이 아니다 보니 때에 따라 기대와는 다르게 코드 생성시 컴파일 에러가 발생할 수 있다. ex) 스키마에 예약어가 있다거나 뭐 그런..
- 참고: https://netflix.github.io/dgs/generating-code-from-schema/
- @DgsData, @DgsQuery, @DgsMutaion, @InputArgument 등 어노테이션 방식으로 동작한다.
- 쿼리와 코드 바인딩을 어노테이션 기반으로 한다.(쿼리명과 메서드명이 아예 일치하면 생략 가능하기도 하다.)
- 어노테이션이 덕지 덕지 붙는게 Spring스럽다.
- dataloaders 구현 방법
- dataloader를 통해 조회할 메서드에 @DgsData를 붙이고, 실제 데이터 처리는 @DgsDataLoader 어노테이션이 붙은 클래스에서 한다.
- Aplication Architecture

3. GraphQL Kotlin
- Expedia Group에서 만든 오픈소스 라이브러리
- 작성일 기준 최신 버전: 7.0.2(마지막 업데이트일 10/31)
- Code Generation 기능
- 사이트를 보면 dgs와의 차이점에 다음과 같이 나와 있다.
- dgs는 스키마 우선 vs grpahql-kotlin은 코드 우선
- dgs는 스키마를 기반으로 코드를 생성하고 grpahql-kotlin은 그 반대로 코드를 먼저 생성한 다음 그를 기반으로 스키마를 생성
- 사이트를 보면 dgs와의 차이점에 다음과 같이 나와 있다.
- Client 중점 라이브러리로서의 사용
- DGS는 DGS-Client 라이브러리를 제공해주기도 하지만 서버 중점 라이브러리에 더 가깝다.
- grpahql-kotlin은 경량 GraphQL HTTP 클라이언트 세트를 제공한다. 호출할 쿼리를 정의하면 이를 기반으로 클래스가 생성되고(code gen) http 호출시 사용하는 방식인 듯 하다.
- 예시 코드
정리
어떤 라이브러리를 사용하던간에 서비스의 성격에 맞춰 잘 사용하면 된다.
DGS가 아무래도 주석 기반으로 편리하기도 하고 무엇보다 code generation 기능이 있다보니 여기저기서 사용하는 것 같다(레퍼런스가 netflix기도 하고). DGS + GrhapQL Kotlin 조합으로 서버쪽 모듈과 클라이언트쪽 모듈에서 각각 사용해도 좋을 것 같다.
References
- https://medium.com/springboot-chronicles/graphql-in-springboot-a-comparative-study-among-the-libraries-and-their-implementation-know-how-b0e8d544f2fc
- https://graphql.org/code/#java-kotlin
GraphQL in Springboot : A comparative study among the libraries and their implementation know-how
A detailed study and comparison among available libraries to implement GraphQL endpoint in Spring Boot with sample code and examples.
medium.com
GraphQL Code Libraries, Tools and Services
Typetta is an open-source ORM written in TypeScript that aims to allow seamless access to data in a typed fashion to all main SQL databases (MySQL, PostgreSQL, Microsoft SQL Server, SQLLite3, CockroachDB, MariaDB, Oracle & Amazon Redshift) and also to the
graphql.org