일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
- kafkastream
- kafka interactive query
- Elasticsearch
- Logstash
- spring-kafka
- Spring
- avo
- 카프카
- 플레이 프레임워크
- play framework
- scala
- kafka streams
- schema registry
- 한빛미디어
- reactive
- coursera
- scala 2.10
- spring-cloud-stream
- Kafka
- confluent
- Elk
- Slick
- enablekafkastreams
- aws
- kafkastreams
- RabbitMQ
- spring-batch
- springboot
- gradle
- statestore
- Today
- Total
b
DGS(Domain Graph Service) Netflix 본문
- 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 을 이용하거나 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 } } 는 아래와 같이 호출 할 수 있다.
또한 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년 릴리즈 되었다 . 하지만 그 이후로 지속적인 개선은 되지 않고 있다 - 링크