LoginSignup
1
3

More than 3 years have passed since last update.

SpringBoot + MongoDB を使ってREST APIを作ってみよう

Last updated at Posted at 2020-09-03

この記事は何?

データストアにMongoDBを利用し、SpringBootを使ったREST APIを構築するハンズオン用ページです。
研修用の突貫なので、簡単に順次手順をまとめ、写経することで簡単に体感できることを目標にします。

内容自体はほぼ下記のコピペです。Gradleを使いたかったのでちょっと内容変えています。
https://stackabuse.com/spring-data-mongodb-tutorial/

前提

  • Javaを触ったことがあること
  • IntelliJ IDEAを使えること
  • REST APIとは何かを知っていること
  • Postmanを使えること
  • NoSQL・MongoDBについて知っていること

実装概要

SpringBootを使ってREST APIを作ります。
データストアにMongoDBを使用し、リクエストに応じてMongoDBのデータをCRUDします

完成物は下記GitHubにあげていますので、上手く行かないところなどあれば参考にしてください。
https://github.com/theMistletoe/MongoDB-SpringBoot-sample

ハンズオン手順

MongoDBのセットアップ

MongoDBにサインアップする
https://account.mongodb.com/account/register

サインアップしたら「Build a Cluster」をクリック

image.png

無料でやりたいのでFREEを選びましょう

image.png

clusterの設定。特に変えなくても良いです。

image.png

cluster構築が始まります。

image.png

cluster構築が完了したら、まずDatabaseアクセス用のユーザーを作ります。
image.png

パスワード認証を選択して、ユーザー名・パスワードを入力してユーザーを作成する。
あとでこのユーザー名・パスワードは使うので覚えておいてください。

image.png

ユーザーができた

image.png

次にNetworkAccessを設定します。
IPアドレスを使ったホワイトリストを定義できるので、練習用に任意のIPアドレスを受けいれるよう設定しましょう。
(練習用にセキュリティゆるゆるなので、本番での利用はやめてください)

image.png

[ALLOW ACCESS FROM ANYWHERE]をクリックしてConfirmしましょう

image.png

ではDB作っていきましょう
ClustersのCOLLECTIONSをクリック

image.png

[Add My Own Data]をクリック

image.png

データベース名に「jobs」、コレクション名に「candidate」を入力しCreateしましょう

image.png

データベース作成後、コンソール画面が表示されます。
のちのデータ更新についてはここに反映されていきます。

image.png

一旦ここまででMongoDBのセットアップおしまいです。

SpringBootの環境構築

Spring Initializrにアクセスして、テンプレートを画像の通り設定して、Generateでzipをダウンロードしましょう。

image.png

zipを解凍して、IntelliJで開きましょう。
まずはapplication.propertiesを開いて、MongoDBのアクセス情報をセッティングしましょう


spring.data.mongodb.uri=mongodb+srv://user:<password>@cluster0.ayoho.mongodb.net/<dbname>?retryWrites=true&w=majority

spring.data.mongodb.uriへの設定値についてはMongoDBコンソールから取得できます。

image.png

image.png

image.png

passwordとdbnameについてはMongoDBセットアップ時に設定したものを使いましょう
(手順に従っていればdbnameは「jobs」になります)

Javaプログラム実装

あとはJavaを書いていきましょう。
細かい実装の解説はいれませんので、不明点は解消しながら書いていってみてください。
配置場所はどこでもいいんですが、package情報を参照いただくか、GitHubを参考にしてみてください。

Candidate.java
package com.example.mongoDBsample.entity;

import org.springframework.data.annotation.Id;
import org.springframework.data.mongodb.core.index.Indexed;
import org.springframework.data.mongodb.core.mapping.Document;

@Document(collection = "candidate")
public class Candidate {
    @Id
    private String id;

    private String name;

    private double exp;

    @Indexed(unique = true)
    private String email;

    public String getId() {
        return id;
    }

    public void setId(String id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public double getExp() {
        return exp;
    }

    public void setExp(double exp) {
        this.exp = exp;
    }

    public String getEmail() {
        return email;
    }

    public void setEmail(String email) {
        this.email = email;
    }
}
CandidateRepository.java
package com.example.mongoDBsample.repository;

import com.example.mongoDBsample.entity.Candidate;
import org.springframework.data.mongodb.repository.MongoRepository;

import java.util.List;
import java.util.Optional;

public interface CandidateRepository extends MongoRepository<Candidate, String> {
    Optional<Candidate> findByEmail(String email);

    List<Candidate> findByExpGreaterThanEqual(double exp);

    List<Candidate> findByExpBetween(double from, double to);
}
CandidateController.java
package com.example.mongoDBsample.controller;

import com.example.mongoDBsample.exception.ResourceNotFoundException;
import com.example.mongoDBsample.entity.Candidate;
import com.example.mongoDBsample.repository.CandidateRepository;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.HttpStatus;
import org.springframework.web.bind.annotation.*;

import java.util.ArrayList;
import java.util.List;

@RestController
@RequestMapping("/candidate")
public class CandidateController {

    @Autowired
    private CandidateRepository candidateRepository;

    @PostMapping
    @ResponseStatus(code = HttpStatus.CREATED)
    public Candidate add(@RequestBody Candidate candidate) {
        return candidateRepository.save(candidate);
    }

    @GetMapping
    public List<Candidate> getAll() {
        return candidateRepository.findAll();
    }

    @GetMapping(value = "/{id}")
    public Candidate getOne(@PathVariable String id) {
        return candidateRepository.findById(id)
                .orElseThrow(() -> new ResourceNotFoundException());
    }

    @PutMapping(value = "/{id}")
    public Candidate update(@PathVariable String id, @RequestBody Candidate updatedCandidate) {
        Candidate candidate = candidateRepository.findById(id)
                .orElseThrow(() -> new ResourceNotFoundException());
        candidate.setName(updatedCandidate.getName());
        candidate.setExp(updatedCandidate.getExp());
        candidate.setEmail(updatedCandidate.getEmail());
        return candidateRepository.save(candidate);
    }

    @DeleteMapping(value = "/{id}")
    @ResponseStatus(code = HttpStatus.ACCEPTED)
    public void delete(@PathVariable String id) {
        Candidate candidate = candidateRepository.findById(id)
                .orElseThrow(() -> new ResourceNotFoundException());
        candidateRepository.delete(candidate);
    }

    @GetMapping("/searchByEmail")
    public Candidate searchByEmail(@RequestParam(name = "email") String email) {
        return candidateRepository.findByEmail(email)
                .orElseThrow(() -> new ResourceNotFoundException());

    }

    @GetMapping("/searchByExp")
    public List<Candidate> searchByExp(@RequestParam(name = "expFrom") Double expFrom, @RequestParam(name = "expTo", required = false) Double expTo) {
        List<Candidate> result = new ArrayList<>();
        if (expTo != null) {
            result = candidateRepository.findByExpBetween(expFrom, expTo);
        } else {
            result = candidateRepository.findByExpGreaterThanEqual(expFrom);
        }
        return result;
    }
}
ResourceNotFoundException.java
package com.example.mongoDBsample.exception;

import org.springframework.http.HttpStatus;
import org.springframework.web.bind.annotation.ResponseStatus;

@ResponseStatus(value = HttpStatus.NOT_FOUND)
public class ResourceNotFoundException extends RuntimeException {
    public ResourceNotFoundException() {
    }
}

実装の確認

これで実装完了なので、データアクセスがAPI経由でできるかどうかを確認してみましょう。

IntelliJでアプリを起動しましょう

image.png

image.png

あるいはCUIで下記を実行して起動する

./gradlew bootRun

ユーザーを登録する

まずはユーザーを登録しましょう。
POSTリクエストを http://localhost:8080/candidate/ に下記JSONオブジェクトをbodyにつけて投げると、
登録ユーザーの情報がレスポンスに返ってきます。

{
    "name": "Axel",
    "exp": "10",
    "email": "axel@example.com"
}

image.png

MongoDBのコンソールを見ると、データが追加されていることが確認できる。

image.png

ユーザーを参照する

GETリクエストをhttp://localhost:8080/candidate に投げると登録ユーザーが全件返ってきます。

image.png

ユーザー情報を更新する

PUTリクエストで http://localhost:8080/candidate/{ユーザーid}
更新後のJSONオブジェクトをbodyにつけると、登録情報が更新されます。

image.png

image.png

ユーザーを削除する

DELETEリクエストを http://localhost:8080/candidate/{ユーザーid} に投げることで
ユーザーを削除できます。

image.png

image.png


以上です。

MongoDB/SpringBootを作ってデータストアを利用できるREST APIのバックエンドの基礎を実装できたと思います。
これを拡張したりフロントエンドと連携してアプリケーションを作ってみましょう!

1
3
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
3