갓생사는 김초원의 개발 블로그
chocho_log
갓생사는 김초원의 개발 블로그
전체 방문자
오늘
어제
  • 분류 전체보기 (76)
    • 개발 (22)
      • Spring (4)
      • Java (3)
      • Database (2)
      • Elasticsearch (3)
      • ETC (3)
      • JPA (3)
      • 이슈 (1)
    • 코딩 테스트 (43)
      • 프로그래머스 (23)
      • 백준 (12)
      • TIP (8)
    • 자료구조 (2)
    • 알고리즘 (4)
    • 잡생각 (0)
    • 경험 (3)
      • AWS re:Invent 2024 (3)

블로그 메뉴

    공지사항

    인기 글

    태그

    • 지연로딩
    • war
    • jar
    • jpa
    • Spring Boot Embedded Tomcat
    • 디자인패턴 #SOLID 원칙
    • querydsl
    • Lazy Loading

    최근 댓글

    최근 글

    갓생사는 김초원의 개발 블로그

    chocho_log

    개발

    GraphQL 라이브러리 비교(kickstart/netflix-dgs/graphql-kotlin)

    2022. 8. 11. 02:38

    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
        • 일일히 클래스를 정의하고 필드를 선언하는 것이 꽤나 노가다일 수도 있을 것 같다.
    • 스키마의 쿼리와 코드의 메서드간 바인딩은 메서드 네이밍과 쿼리명이 일치해야 한다. 
    • 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은 그 반대로 코드를 먼저 생성한 다음 그를 기반으로 스키마를 생성
    • 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

     

    '개발' 카테고리의 다른 글

    Terraform의 init/plan/apply  (0) 2023.12.12
    JsonParseException: Unrecognized token : was expecting (JSON String, Number, Array, Object or token 'null', 'true' or 'false') - String과 JsonString을 구분합시다.  (0) 2023.04.23
      '개발' 카테고리의 다른 글
      • Terraform의 init/plan/apply
      • JsonParseException: Unrecognized token : was expecting (JSON String, Number, Array, Object or token 'null', 'true' or 'false') - String과 JsonString을 구분합시다.
      갓생사는 김초원의 개발 블로그
      갓생사는 김초원의 개발 블로그
      갓생사는 김초원의 개발 블로그 github: https://github.com/kimchowon

      티스토리툴바