blog

GraphQL Spring Bootの使い方

spring-boot-graphql-demo を使ったLadder@GraphQL Spring Boot\nSpringBootとGraphQLを使って、MongoDBを使ってデータを保存するシ...

Nov 30, 2018 · 5 min. read
シェア


GraphQL Spring Bootの使い方

SpringBootとGraphQLを使って、MongoDBを使ってデータを保存する最もシンプルな追加、削除、変更、クエリーのインターフェースアプリケーションを作成します!

アプリケーションの作成

  • 依存関係の追加
dependencies {
 implementation('org.springframework.boot:spring-boot-starter-web')
 implementation('org.springframework.boot:spring-boot-starter-data-mongodb')

 compileOnly('org.projectlombok:lombok')
 testImplementation('org.springframework.boot:spring-boot-starter-test')
}

ベースインターフェイスの追加

  • モデルの追加
@Data
@Builder
@Document
@AllArgsConstructor
@NoArgsConstructor
public class Post {

 @Id
 private String id;

 private String title;

 private String content;

 @CreatedDate
 private Date createDate;
}
  • リポジトリの追加
public interface PostRepository extends MongoRepository<Post, String> {
}
  • 設定の追加
# MongoDB Config
spring.data.mongodb.host=localhost
spring.data.mongodb.port=27017
#spring.data.mongodb.username=
#spring.data.mongodb.password=
spring.data.mongodb.database=graphql
  • データ初期化の追加
@Component
@Slf4j
public class DataInitializer implements ApplicationRunner {

 @Autowired
 private PostRepository postRepository;

 @Override
 public void run(ApplicationArguments args) throws Exception {
 List<Post> posts = initPost();
 posts.forEach(post -> log.info("Post: {}", post));
 }

 private List<Post> initPost() {
 postRepository.deleteAll();

 return Stream.of("Post one", "Post two")
 .map(title -> {
 Post post = Post.builder()
 .title(title)
 .content("Content of " + title)
 .build();
 return postRepository.save(post);
 })
 .collect(Collectors.toList());
 }
}
 posts = initPost();
 posts.forEach(post -> log.info(「Post: {}」, post));
 }



 private List initPost() {
 postRepository.deleteAll();

 return Stream.of(「Post one」, 「Post two」)
 .map(title -> {
 Post post = Post.builder()
 .title(title)
 .content(「Content of 」 + title)
 .build();
 return postRepository.save(post);
 })
 .collect(Collectors.toList());


 }
}

GraphQL設定の追加

  • GraphQL依存関係の追加
implementation('com.graphql-java:graphql-spring-boot-starter:5.0.2');
implementation('com.graphql-java:graphiql-spring-boot-starter:5.0.2');
implementation('com.graphql-java:graphql-java-tools:5.2.4');
  • インターフェース定義スクリプトの追加
# io.github.helloworlde.graphql.model.Post 対応モデル
type Post {
 id: ID,
 title: String,
 content: String,
 createDate: String
}


# io.github.helloworlde.graphql.resolver.PostMutation.updatePost   post
input PostInput{
 title: String!,
 content: String!
}

#   io.github.helloworlde.graphql.resolver.PostQuery
type Query{
 posts: [Post]
 post(id: ID!): Post
}

#   io.github.helloworlde.graphql.resolver.PostMutation
type Mutation{
 createPost(post: PostInput): Post!
 updatePost(id: ID!, post: PostInput): Post!
 deletePost(id: ID!): String
}

インターフェースリゾルバを追加する

  • リゾルバの変更
@Component
public class PostQuery implements GraphQLQueryResolver {

 @Autowired
 private PostRepository postRepository;

 public List<Post> posts() {
 return postRepository.findAll();
 }

 public Optional<Post> post(String id) {
 return postRepository.findById(id);
 }

}
  • リゾルバの変更
@Component
public class PostMutation implements GraphQLMutationResolver {

 @Autowired
 private PostRepository postRepository;

 public Post createPost(Post post) {
 Post newPost = Post.builder()
 .title(post.getTitle())
 .content(post.getContent())
 .build();

 return postRepository.save(newPost);
 }

 public Post updatePost(String id, Post post) throws Exception {
 Post currentPost = postRepository.findById(id)
 .orElseThrow();

 currentPost.setTitle(post.getTitle());
 currentPost.setContent(post.getContent());

 return postRepository.save(currentPost);
 }

 public String deletePost(String id) throws Exception {
 postRepository.findById(id)
 .orElseThrow();

 postRepository.deleteById(id);
 return id;
 }
}

テスト

  • アプリケーションの起動

  • <a href="http://localhost:8080" graphiql"="">"http://localhost:8080"/graphiql</a></p> をご覧ください。

クエリ

  • クエリーリスト
{
 posts {
 id
 title
 content
 createDate
 }
}
{
 "data": {
 "posts": [
 {
 "id": "5c50245b7ed65eacb3372aba",
 "title": "Post one",
 "content": "Content of Post one",
 "createDate": "Tue Jan 29 18:00:59 CST 2019"
 },
 {
 "id": "5c50245b7ed65eacb3372abb",
 "title": "Post two",
 "content": "Content of Post two",
 "createDate": "Tue Jan 29 18:00:59 CST 2019"
 }
 ]
 }
}
  • 指定したidの取得
{
 post(id: "5c50245b7ed65eacb3372aba") {
 id
 title
 content
 createDate
 }
}
{
 "data": {
 "post": {
 "id": "5c50245b7ed65eacb3372aba",
 "title": "Post one",
 "content": "Content of Post one",
 "createDate": "Tue Jan 29 18:00:59 CST 2019"
 }
 }
}

修正する

  • 追加
mutation {
 createPost(post: {title: "New Posts", content: "New Post Content"}) {
 id
 title
 content
 createDate
 }
}
{
 "data": {
 "createPost": {
 "id": "5c5027197ed65eaf47a0854d",
 "title": "New Posts",
 "content": "New Post Content",
 "createDate": "Tue Jan 29 18:12:41 CST 2019"
 }
 }
}
  • 変更
mutation {
 updatePost(id: "5c5027197ed65eaf47a0854d", post: {title: "Update Posts", content: "Update Post Content"}) {
 id
 title
 content
 createDate
 }
}
{
 "data": {
 "updatePost": {
 "id": "5c5027197ed65eaf47a0854d",
 "title": "Update Posts",
 "content": "Update Post Content",
 "createDate": "Tue Jan 29 18:12:41 CST 2019"
 }
 }
}
  • 削除
mutation {
 deletePost(id: "5c5027197ed65eaf47a0854d")
}
{
 "data": {
 "deletePost": "5c5027197ed65eaf47a0854d"
 }
}
Read next