この記事は何?
データストアにMongoDBを利用し、SpringBootを使ったREST APIを構築するハンズオン用ページです。
研修用の突貫なので、簡単に順次手順をまとめ、写経することで簡単に体感できることを目標にします。
内容自体はほぼ下記のコピペです。Gradleを使いたかったのでちょっと内容変えています。
https://stackabuse.com/spring-data-mongodb-tutorial/
前提
- Javaを触ったことがあること
- IntelliJ IDEAを使えること
- REST APIとは何かを知っていること
- Postmanを使えること
- この辺り参考にしてください:https://qiita.com/notch0314/items/97c7d1bb565fdae4a712
- 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」をクリック
無料でやりたいのでFREEを選びましょう
clusterの設定。特に変えなくても良いです。
cluster構築が始まります。
cluster構築が完了したら、まずDatabaseアクセス用のユーザーを作ります。
パスワード認証を選択して、ユーザー名・パスワードを入力してユーザーを作成する。
あとでこのユーザー名・パスワードは使うので覚えておいてください。
ユーザーができた
次にNetworkAccessを設定します。
IPアドレスを使ったホワイトリストを定義できるので、練習用に任意のIPアドレスを受けいれるよう設定しましょう。
(練習用にセキュリティゆるゆるなので、本番での利用はやめてください)
[ALLOW ACCESS FROM ANYWHERE]をクリックしてConfirmしましょう
ではDB作っていきましょう
ClustersのCOLLECTIONSをクリック
[Add My Own Data]をクリック
データベース名に「jobs」、コレクション名に「candidate」を入力しCreateしましょう
データベース作成後、コンソール画面が表示されます。
のちのデータ更新についてはここに反映されていきます。
一旦ここまででMongoDBのセットアップおしまいです。
SpringBootの環境構築
Spring Initializrにアクセスして、テンプレートを画像の通り設定して、Generateでzipをダウンロードしましょう。
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コンソールから取得できます。
passwordとdbnameについてはMongoDBセットアップ時に設定したものを使いましょう
(手順に従っていればdbnameは「jobs」になります)
Javaプログラム実装
あとはJavaを書いていきましょう。
細かい実装の解説はいれませんので、不明点は解消しながら書いていってみてください。
配置場所はどこでもいいんですが、package情報を参照いただくか、GitHubを参考にしてみてください。
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;
}
}
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);
}
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;
}
}
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でアプリを起動しましょう
あるいはCUIで下記を実行して起動する
./gradlew bootRun
ユーザーを登録する
まずはユーザーを登録しましょう。
POSTリクエストを http://localhost:8080/candidate/ に下記JSONオブジェクトをbodyにつけて投げると、
登録ユーザーの情報がレスポンスに返ってきます。
{
"name": "Axel",
"exp": "10",
"email": "axel@example.com"
}
MongoDBのコンソールを見ると、データが追加されていることが確認できる。
ユーザーを参照する
GETリクエストをhttp://localhost:8080/candidate に投げると登録ユーザーが全件返ってきます。
ユーザー情報を更新する
PUTリクエストで http://localhost:8080/candidate/{ユーザーid} に
更新後のJSONオブジェクトをbodyにつけると、登録情報が更新されます。
ユーザーを削除する
DELETEリクエストを http://localhost:8080/candidate/{ユーザーid} に投げることで
ユーザーを削除できます。
以上です。
MongoDB/SpringBootを作ってデータストアを利用できるREST APIのバックエンドの基礎を実装できたと思います。
これを拡張したりフロントエンドと連携してアプリケーションを作ってみましょう!