Java 사용 Graphql 쿼리 서비스 구축 상세 정보
React의 개원에 따라 페이스북은 관련 프로젝트를 많이 개원했다. 이런 프로젝트는 그들 내부에서 이미 여러 해 동안 사용되었다. 그 중에서 나의 주의를 끄는 것은 바로 이번 토론에서graphql이다. 현재 공식적으로는 nodejs 버전밖에 없다. 많은 회사의 백엔드 기술 창고가 자바이기 때문에graphql의java 버전이 실현되었다. github에서 찾을 수 있다. 쓸데없는 말은 하지 않고 코드를 직접 보자. 구체적으로 소개하려면 관PC방에 가야 한다.안 그러면 주제에서 벗어날 거야.
GraphQLSchema
Schema는 하나의 데이터베이스에 해당하고 GraphQLFieldDefinition으로 구성되어 있으며 Field는 데이터베이스 테이블/보기에 해당하며 각 테이블/보기는 명칭, 조회 매개 변수, 데이터 구조, 데이터로 구성되어 있다.
1) 데이터 구조(GraphQLOutputType) 필드를 정의한 다음 초기화 방법을 정의합니다.
private GraphQLOutputType userType;
private void initOutputType() {
/**
*
*/
userType = newObject()
.name("User")
.field(newFieldDefinition().name("id").type(GraphQLInt).build())
.field(newFieldDefinition().name("age").type(GraphQLInt).build())
.field(newFieldDefinition().name("sex").type(GraphQLInt).build())
.field(newFieldDefinition().name("name").type(GraphQLString).build())
.field(newFieldDefinition().name("pic").type(GraphQLString).build())
.build();
}
2) 이름, 조회 매개 변수, 데이터 구조, 데이터 검색기를 포함하는 두 개의 테이블/보기를 정의합니다.
/**
*
* @return
*/
private GraphQLFieldDefinition createUserField() {
return GraphQLFieldDefinition.newFieldDefinition()
.name("user")
.argument(newArgument().name("id").type(GraphQLInt).build())
.type(userType)
.dataFetcher(environment -> {
//
int id = environment.getArgument("id");
// ,
User user = new User();
user.setId(id);
user.setAge(id + 15);
user.setSex(id % 2);
user.setName("Name_" + id);
user.setPic("pic_" + id + ".jpg");
return user;
})
.build();
}
/**
*
* @return
*/
private GraphQLFieldDefinition createUsersField() {
return GraphQLFieldDefinition.newFieldDefinition()
.name("users")
.argument(newArgument().name("page").type(GraphQLInt).build())
.argument(newArgument().name("size").type(GraphQLInt).build())
.argument(newArgument().name("name").type(GraphQLString).build())
.type(new GraphQLList(userType))
.dataFetcher(environment -> {
//
int page = environment.getArgument("page");
int size = environment.getArgument("size");
String name = environment.getArgument("name");
// ,
List<User> list = new ArrayList<>(size);
for (int i = 0; i < size; i++) {
User user = new User();
user.setId(i);
user.setAge(i + 15);
user.setSex(i % 2);
user.setName(name + "_" + page + "_" + i);
user.setPic("pic_" + i + ".jpg");
list.add(user);
}
return list;
})
.build();
}
3) 다음에 Schema를 정의하고 이름을 포함하고 하나 이상의 테이블/보기(Field)를 초기화합니다.
private GraphQLSchema schema;
public GraphSchema() {
initOutputType();
schema = GraphQLSchema.newSchema().query(newObject()
.name("GraphQuery")
.field(createUsersField())
.field(createUserField())
.build()).build();
}
4) 상기 절차를 마친 후에 모델을 정의해야 한다. 클래스 이름은 제한되지 않지만 구조는 앞에서 정의한 데이터 구조를 만족시켜야 하고public의
public class User {
private int id;
private int age;
private int sex;
private String name;
private String pic;
// getter, setter...
}
5) 다음에 main 방법을 써서 테스트해 봅시다
public static void main(String[] args) {
GraphQLSchema schema = new GraphSchema().getSchema();
String query1 = "{users(page:2,size:5,name:\"john\") {id,sex,name,pic}}";
String query2 = "{user(id:6) {id,sex,name,pic}}";
String query3 = "{user(id:6) {id,sex,name,pic},users(page:2,size:5,name:\"john\") {id,sex,name,pic}}";
Map<String, Object> result1 = (Map<String, Object>) new GraphQL(schema).execute(query1).getData();
Map<String, Object> result2 = (Map<String, Object>) new GraphQL(schema).execute(query2).getData();
Map<String, Object> result3 = (Map<String, Object>) new GraphQL(schema).execute(query3).getData();
//
System.out.println(result1);
//
System.out.println(result2);
// 、
System.out.println(result3);
}
출력:
{users=[{id=0, sex=0, name=john_2_0, pic=pic_0.jpg}, {id=1, sex=1, name=john_2_1, pic=pic_1.jpg}, {id=2, sex=0, name=john_2_2, pic=pic_2.jpg}, {id=3, sex=1, name=john_2_3, pic=pic_3.jpg}, {id=4, sex=0, name=john_2_4, pic=pic_4.jpg}]}
{user={id=6, sex=0, name=Name_6, pic=pic_6.jpg}}
{user={id=6, sex=0, name=Name_6, pic=pic_6.jpg}, users=[{id=0, sex=0, name=john_2_0, pic=pic_0.jpg}, {id=1, sex=1, name=john_2_1, pic=pic_1.jpg}, {id=2, sex=0, name=john_2_2, pic=pic_2.jpg}, {id=3, sex=1, name=john_2_3, pic=pic_3.jpg}, {id=4, sex=0, name=john_2_4, pic=pic_4.jpg}]}
6) 마지막으로main 방법의 코드를 웹층에 놓고query 파라미터를 정의하면 조회 서비스를 쉽게 구축할 수 있다. 데이터Fetcher에서 원래의 조회 인터페이스를 호출할 수 있다7) maven 의존 도입
<dependency>
<groupId>com.graphql-java</groupId>
<artifactId>graphql-java</artifactId>
<version>2.0.0</version>
</dependency>
graphql 조회에 대한 정의는 무엇입니까? 이것 좀 보세요. 도움이 될 수도 있습니다.json
{
id=6,
sex=0,
name="Name_6",
pic="pic_6.jpg"
}
query
{
id,
sex,
name,
pic
}
뒤에 있는 부분은 사실 json 문자열입니다. =와value를 뺀 결과는 읽을 수 있습니다.결어
graphql는 새로운 사고방식을 가지고 웹api의 개발을 간소화할 수 있다. 클라이언트가 지정한 데이터가 무엇인지, 서비스 측이 어떤 데이터를 되돌려주는지, 불필요한 데이터 전송을 줄이고 이동 측에 우호적이며 다양한 데이터 집합 조회를 제공할 수 있다. 여러 개의 조회는 하나의 요청으로api의 최소 입도를 만족시킬 뿐만 아니라api의 수요를 만족시키고 요청을 줄이며 성능을 향상시킬 수 있다.
앞으로 이 방면으로 발전할 것 같아서 크게 밀리고 있다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
JPA + QueryDSL 계층형 댓글, 대댓글 구현(2)이번엔 전편에 이어서 계층형 댓글, 대댓글을 다시 리팩토링해볼 예정이다. 이전 게시글에서는 계층형 댓글, 대댓글을 구현은 되었지만 N+1 문제가 있었다. 이번에는 그 N+1 문제를 해결해 볼 것이다. 위의 로직은 이...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.