9 Aralık 2020 Çarşamba

GraphQL

Giriş
GraphQL'in faydalarını anlatan bir yazı burada. Aslında bu kelimeyi daha önceden bir çok defa duymuş olsam da merak etmeme sebep olan yazı da bu. 

GraphQL'in Tarihçesi Nedir?
Facebook tarafından 2012 yılında geliştirildi, 2015 yılında açık kaynak haline getirildi

GraphQL'in Faydası Nedir?
En önemli faydası getirilen verinin alanlarını özelleştirebilmek. Böylece mobil uygulamalarda tam olarak ihtiyaç duyulan veri getirilir. Açıklaması şöyle. /graphql adresine POST isteği gönderilir.
All the resources of the API are exposed in a single request — normally a POST to /graphql — and the content is a query using GraphQL specification. The query specifies the filter and the data to be returned by the API.
Json içinde 
type Foo {...} ve
type Query{...}
şeklinde kullanım vardır.

Type Alan Tipleri
Boolean
Date
Float
ID
Int
String

olabilir. Tipin yanında ! (ünlem) işareti varsa, mecburi olduğunu belirtir

Geliştirme Yöntemi
Açıklaması şöyle. Yani schema elle yazılabilir veya üretilebilir.
There are two different approaches to GraphQL development; schema-first and code-first development. 
With schema-first development, you manually define your API’s schema using the GraphQL Schema Language. The code in your service only implements this schema.

With code-first development, you don’t have a schema file. Instead, the schema gets generated at runtime based on definitions in code.

Kavramlar
Schemas
Type'ları ve işlemleri (Query + Mutations) belirtir. GraphQL Schema yazısına taşıdım

Query
Sorgu için kullanılan metod imzaları. GraphQL Query yazısına taşıdım

Mutations
Create, update, delete işlemleri için metod imzaları. GraphQL Mutation yazısına taşıdım

Resolvers
GraphQL'e veriyi nereden alacağını belirtir Yani Query'leri çalıştıran kodlar

Subscriptions
GraphQL sunucusuna abone olunur ve değişikliklerden haberdar olunur. GraphQL Subscriptions yazısına taşıdım

GraphQL ile Neo4J İlişkisi Nedir?
Neo4J bir Graph veri tabanı . GraphQL ile ilişkisi yoktur. Sadece isimlerindeki Graph kelimeleri aynı

Kütüphaneler
Java + GraphQL kullanabilmek için bir sürü kütüphane var. Bazılar şöyle

1. graphql-spring-boot-starter Kullanımı
Maven
Örnek
Şu satırı dahil ederiz
<dependency>
  <groupId>com.graphql-java</groupId>
  <artifactId>graphql-spring-boot-starter</artifactId>
  <version>5.0.2</version>
</dependency>
<dependency>
  <groupId>com.graphql-java</groupId>
  <artifactId>graphql-java-tools</artifactId>
  <version>5.2.4</version>
</dependency>
Bu satırlar ile bir tane GraphQL için servlet projeye dahil edilir. Açıklaması şöyle
By default, this will expose the GraphQL Service on the /graphql endpoint of our application and will accept POST requests containing the GraphQL Payload. This endpoint can be customised in our application.properties file if necessary.
GraphQL SPQR Kullanımı
GraphQL SPQR kullanımında sadece anotasyonlar var. .graphqls" uzantılı dosyalarla uğraşmıyoruz. Bence bu kullanım Spring'in ruhuna daha uygun.

Örnek
Kullanımı daha kolay olan GraphQL SPQR projesi de tercih edilebilir. Şöyle yaparız
<dependency>
  <groupId>io.leangen.graphql</groupId>
  <artifactId>graphql-spqr-spring-boot-starter</artifactId>
  <version>0.0.4</version>
</dependency>

graphql-java Kullanımı
Açıklaması şöyle
graphql-java is most popular for implementing schema-first GraphQL APIs in Java, but is designed to be a low level library. The graphql-java-kickstart starter is a set of libraries for implementing GraphQL services, and provides graphql-java-tools and graphql-java-servlet on top of graphql-java.
graphql-java-tools Kullanımı
Bazı notlarım şöyle
- Schema .graphqls uzantlı dosyalara yazılır. GraphQL Java Tools bu dosyaları parse edebilir.

- Gerekli entity için GraphQLResolver'dan kalıtan bir resolver yazılır. Bu resolver aynı zamanda bir bean'dir. Bu resolver'da kendi repository sınıflarımız çağrılır.

- Gerekli entity için GraphQLMutationResolver 'dan kalıtan bir resolver yazılır. Bu resolver aynı zamanda bir bean'dir. Bu resolver'da kendi repository sınıflarımız çağrılır.

- Mutation ve Query bean'leri de yaratılır

- http://localhost:8080/graphql/schema.json adresinde schema görülebilir

.graphqls Dosyaları
Açıklaması şöyle
The GraphQL Tools library works by processing GraphQL Schema files to build the correct structure and then wires special beans to this structure. The Spring Boot GraphQL starter automatically finds these schema files.

These files need to be saved with the extension “.graphqls” and can be present anywhere on the classpath. We can also have as many of these files as desired, so we can split the scheme up into modules as desired.

The one requirement is that there must be exactly one root query, and up to one root mutation. This can not be split across files, unlike the rest of the scheme. This is a limitation of the GraphQL Schema definition itself, and not of the Java implementation.
GraphQLQueryResolver 
Örnek
Elimizde şöyle bir query olsun
# The Root Query for the application
type Query {
    recentPosts(count: Int, offset: Int): [Post]!
}
Şöyle yaparız. Not : Metod imzasının izlemesi gereken bazı kurallar var. 
public class Query implements GraphQLQueryResolver {
  private PostDao postDao;
  public List<Post> getRecentPosts(int count, int offset) {
    return postsDao.getRecentPosts(count, offset);
  }
}

Hiç yorum yok:

Yorum Gönder