b

DGS(Domain Graph Service) Netflix 본문

카테고리 없음

DGS(Domain Graph Service) Netflix

dev.bistro 2021. 2. 9. 11:23
  • 2021/02/08 현재 v3.3.0 이 릴리즈 되었다  이 버전은  Spring Boot 2.3.6.RELEASE 와,  Spring Cloud 는 Hoxton Relase에 의존성을 가지고 있다 ( git.io/JtVCs , 음.. ilford 맞추려면 얼마나 삽질을 해야 할까 ... ㅠ)
  • 그리고 3.3.0 버전은 jcenter 에만 올려져 있으니 repository에 jcenter를 추가해야한다. (TMI : Jcenter는 2/4분기에 없어진다)
  • 기본이 되는 library 는 "com.graphql-java:graphql-java:15.0" ,  "com.graphql-java:java-dataloader:2.2.3" 이다.

Data Fetcher 

데이터를 서빙하는 코드는  netflix.github.io/dgs/getting-started/ 페이지를 참고하여 빠르게 Sample Application 을 작성 할 수 있다. 또한 DGS 가 graphiql autoconfiguration 을 포함하고 있기 때문에 아래와 같은 graphiql ( http://localhost:8080/graphiql) 에서 쿼리까지 쉽게 날려 볼 수 있었다.

getting-started 에서 볼 수 있는 'ShowsDatafetcher' 클래스는 schema.graphql 파일이 복잡해질수록 만들기 힘들다.  이 불편함은 dgs codegen 플러그인을 이용해서 조금 쉽게 풀 수 있다. netflix.github.io/dgs/generating-code-from-schema/ 를 참고해서 generateJava task를 실행 하면 보일플레이트코드 build/generated-examples 폴더에 생성되는데 이 코드들을 java classpath로 옮겨와서 작업을 진행하면 된다.

 


2. Querying

graphql 은 결국엔 HTTP / Post method 를 이용한 api 호출이다.

curl

curl 을 이용하거나 netflix.github.io/dgs/advanced/java-client/ 의 첫 번째 방법처럼 Plain String 을 이용해서 결과를 요청 할 수 있다. 하지만 이러한 방식은 Request Query 를 작성하기 까다롭고, 오류가 발생할 확률이 높으니 Type safe Query API 으로 사용하는 것을 추천한다.

이러한 Type 기반의 Query API 를 이용하려면 DGS CodeGen Plugin 을 이용하는것이 여러모로 편하다. (GraphQLQuery 와 Projection Class를 자동으로 생성해준다)

예를 들어 위의 graphiql 에서 사용한 쿼리인 query {shows{ title releaseYear } } 는 아래와 같이 호출 할 수 있다.

query {shows{ title releaseYear } } 

또한 shows 에 파라미터가 필요하다면 아래 처럼 사용 가능하다. 

 

GraphQLResponse 에서 Model로의 매핑은 JsonPath 를 이용한 extractValueAsObject 를 사용 할 수 있다.

 


@DgsComponent

DgsComponent 는 Spring 의 @Component 어노테이션을 가지고 있다. 그렇기 떄문에 스프링 빈으로 뜬다. 이후 AutoConfiguration 에 의해 DgsSchemaProvider 가 빈으로 등록되고 DgsSchemaProvider 의 schema() 가 GraphQLSchema를 생성한다 git.io/JtwrL

그리고 DgsDataLoaderProvider 는 DgsDataLoader 어노테이션을 처리해준다.


2017년인가? 처음으로 java-graphql 을 쓸 때에는 아 이거 아직 java 에서는 쓰기 불편하구나라고 생각이 들었다. 그리고
2018년도에는 팀원분들이 zuul 과 product api 사이에  graphQL 사용을 위해서 eureka service discovery 를 위한 sidecar + nodejs graphql 기반의 프로젝트를 진행 한적이 있었는데, 이러한 구성이 유지보수/관리 측면에서 만족스러워 하지 않으셔했다. 

그 때보다는 좀 더 고도화가 되었고,  springboot 와 codegen 기능이 강화되었기 때문에 좀 더 편할 것 같기는 하지만,  예전부터 가졌던 의문인...  git.io/JtVEa 이런 코드를 대규모 트래픽 서비스에 어떻게 적용시킬 수 있을것인가?에 대한 해법은 계속 좀 생각 해봐야할 듯 ( 사용당시에 java 의 dataloader가 없었기 때문에 써보질 못했다. 이번에 적용해보고 다시 생각해야 할 듯?)

 


  • DGS Code Generation Plugin
    • graphql schema 를 기반으로 보일플레이트 코드를 생성해주는 gradle plugin
    • generateJava 라는 task를 사용 할 수 있다.  ( 소스 :  git.io/JtVCp )
  • Metatron
    • DGS 페이지에서 나오는 '@Metatron'은 오픈소스가 아니닌 넷플릭스 내부의  서비스 디스커버리 라이브러리(아마도 인증도 포함한?) 인것 같다. 
  • GraphQL 을 적용한 시점이 2017년이었는데, DGS 때문에 graphQL library를 다시 살펴보니, spring 모듈이 추가된것을 확인 할 수 있었다. v1.0은 2018년, v2.0은 2020년 릴리즈 되었다 . 하지만 그 이후로 지속적인 개선은 되지 않고 있다 - 링크 

 

Comments