GraphQL SPQR (GraphQL Schema Publisher & Query Resolver, Speaker 와 같은 발음)은 Java에서 GraphQL API의 신속한 개발을위한 간단한 라이브러리입니다.
GraphQL SPQR은 모든 Java 프로젝트에 GraphQL API를 추가하는 것이 간단하게 만드는 것을 목표로합니다. Java 코드에서 GraphQL 스키마를 동적으로 생성하여 작동합니다.
GraphQL 가능 응용 프로그램을 개발할 때는 스키마를 먼저 정의하고 나중에 비즈니스 로직을 연결하는 것이 일반적입니다. 이것은 스키마 우선 스타일로 알려져 있습니다. Java와 같은 강력하고 정적으로 입력 한 언어로는 장점이 있지만 많은 복제로 이어집니다.
예를 들어, 간단한 그래프 QL 유형의 스키마 정의가 다음을 좋아할 수 있습니다.
type Link {
id : ID !
url : String !
description : String
}
그리고 일반적으로, 해당 Java 유형은 시스템에 다음과 유사하게 존재합니다.
public class Link {
private final String id ;
private final String url ;
private final String description ;
//constructors, getters and setters
//...
}
이 두 블록에는 정확히 동일한 정보가 포함되어 있습니다. 더 나쁜 것은, 하나를 바꾸려면 다른 하나를 즉각적으로 변경해야합니다. 이로 인해 리팩토링이 위험하고 번거롭게 만들어지고 컴파일러는 도움이되지 않습니다. 반면에, 기존 프로젝트에 그래프 QL API를 도입하려는 경우 스키마를 쓰는 것은 기존 모델 전체를 다시 설명하는 것을 의미합니다. 이것은 비싸고 오류가 발생하기 쉬우 며 여전히 복제와 툴링 부족으로 고통 받고 있습니다.
대신 GraphQL SPQR은 기존 모델에서 스키마를 생성하여 코드 우선 접근 방식을 취합니다. 이렇게하면 스키마와 모델이 동기화되어 리팩토링이 완화됩니다. 또한 기존 코드베이스 위에 GraphQL이 소개되는 프로젝트에서도 잘 작동합니다.
코드 우선 스타일로 개발하는 것은 여전히 효과적으로 스키마 우선이지만 차이점은 다른 언어가 아니라 IDE, 컴파일러 및 모든 도구를 사용하여 스키마를 개발한다는 것입니다. 스키마의 변경을 중단하면 컴파일이 실패합니다. 라이터 나 다른 취약 해킹이 필요하지 않습니다.
GraphQL SPQR은 Maven Central에 배포되었습니다.
Maven
< dependency >
< groupId >io.leangen.graphql</ groupId >
< artifactId >spqr</ artifactId >
< version >0.12.3</ version >
</ dependency >
Gradle
compile ' io.leangen.graphql:spqr:0.12.3 '
이 예제는 GraphQL SPQR 자체가 제공하는 주석을 사용하지만 옵션이며 매핑은 완전히 구성 가능하므로 기존 서비스가 수정없이 GraphQL을 통해 노출 될 수 있습니다.
서비스 수업 :
class UserService {
@ GraphQLQuery ( name = "user" )
public User getById ( @ GraphQLArgument ( name = "id" ) Integer id ) {
...
}
}
@GraphQLArgument
추가를 건너 뛰려면 -parameters
옵션으로 컴파일하지 않으면 이름이 손실됩니다.
도메인 클래스 :
public class User {
private String name ;
private Integer id ;
private Date registrationDate ;
@ GraphQLQuery ( name = "name" , description = "A person's name" )
public String getName () {
return name ;
}
@ GraphQLQuery
public Integer getId () {
return id ;
}
@ GraphQLQuery ( name = "regDate" , description = "Date of registration" )
public Date getRegistrationDate () {
return registrationDate ;
}
}
User
클래스를 수정하지 않고 추가 필드를 User
GraphQL 유형에 첨부하려면 User
있는 쿼리를 컨텍스트 로 추가합니다. 가장 간단한 방법은 @GraphQLContext
주석을 사용하는 것입니다.
class UserService {
... //regular queries, as above
// Attach a new field called twitterProfile to the User GraphQL type
@ GraphQLQuery
public TwitterProfile twitterProfile ( @ GraphQLContext User user ) {
...
}
}
GraphQL-SPQR로 서비스를 노출 :
UserService userService = new UserService (); //instantiate the service (or inject by Spring or another framework)
GraphQLSchema schema = new GraphQLSchemaGenerator ()
. withBasePackages ( "io.leangen" ) //not mandatory but strongly recommended to set your "root" packages
. withOperationsFromSingleton ( userService ) //register the service
. generate (); //done ;)
GraphQL graphQL = new GraphQL . Builder ( schema )
. build ();
//keep the reference to GraphQL instance and execute queries against it.
//this operation selects a user by ID and requests name, regDate and twitterProfile fields only
ExecutionResult result = graphQL . execute (
"{ user (id: 123) {
name,
regDate,
twitterProfile {
handle
numberOfTweets
}
}}" );
우리는 SPQR 구동 스프링 부트 스타터를 연구하고 있습니다. 이 프로젝트는 여전히 매우 젊지 만 이미 기능적입니다.
https://github.com/leangen/graphql-spqr-samples에서 Spring Boot를 사용하여 전체 예제를 참조하십시오
곧 올 것입니다
최상의 호환성을 위해서는 컴파일러 인수 -Xemit-jvm-type-annotations
에서 Kotlin 1.3.70 이상이 필요합니다. 이를 통해 Kotlin 컴파일러는 유형 사용 주석 (JDK8에 도입)을 올바르게 생성하도록 지시합니다. 자세한 내용은 KT-35843 및 KT-13228을 참조하십시오.
버전 16 B17 이전의 OpenJDK의 주석 파서에 버그가있어 일반 유형 매개 변수에 대한 주석이 복제됩니다. 당신은 이것을 신비한 형태로 경험할 수 있습니다
AnnotationFormatError: Duplicate annotation for class: interface io.leangen.graphql.annotations.GraphQLNonNull
유형과 일반 @GraphQLNonNull List<@GraphQLNonNull Item>
변수 모두에서 @GraphQLNonNull
사용할 때 던져지고 있습니다.
다행히도 영향을받는 JDK 에서도이 문제를 경험하는 사용자는 거의 없습니다. Java가 코드를 실행 하는 Java가 소스를 컴파일하는 것이 관련이 있습니다. 또한 Intellij Idea는 자체 JDK와 함께 제공되므로 아이디어에 프로젝트를 구축하면 이러한 오류가 발생할 수 있습니다. 시스템 Java가 다른 경우 IDE를 사용하도록 구성해야합니다.