Java 사용 Graphql 쿼리 서비스 구축 상세 정보

6746 단어 JavaGraphql
배경
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의 수요를 만족시키고 요청을 줄이며 성능을 향상시킬 수 있다.
앞으로 이 방면으로 발전할 것 같아서 크게 밀리고 있다.

좋은 웹페이지 즐겨찾기