Spring Boot
これからJavaのアプリケーションを実装するならKotlinでSpring Bootをおすすめします。今回はこの2つを使ったRESTfulなCRUDサーバーの実装を簡単に紹介します。ソースコードはgithubに公開しているので参考にしてください。
https://github.com/tomokazukozuma/ToDoAppForKotlin
環境
- Mac OS X
- Eclipse Pleiades All in One 4.7.0
- Java 8
- Kotlin 1.1.3
- Spring Boot 1.5.4.RELEASE
手順
- Eclipseを使ったKotlinの環境構築
- Flywayを使ったMySQLのマイグレーション
- フォルダ構成
- Controllerの書き方
- Entityの書き方
- Repositoryの書き方
1. Eclipseを使ったKotlinの環境構築
無料のIDEで高機能なEclipseを今回は使用します。Spring BootはSpring スターター・プロジェクトという機能で必要最小限の機能を導入してプロジェクトを始められます。今回はweb, JPA, MySQL, Flywayという機能を最初に選択します。
環境構築の詳細は下記記事を参考してください。
2. Flywayを使ったMySQLのマイグレーション
環境構築が完了したら完了したら次はDBの準備をします。DBのマイグレーションにはFlywayを使用します。導入がものすごく簡単で使い始めるまでに他に何もインストールしなくて済むのでおすすめです。
Flywayの詳細は下記記事を参考にしてください。
今回作成するテーブルは下記2つです。このテーブルをFlywayで作るように設定してください。DB名はtodoappとしておきましょう。
CREATE DATABASE todoapp; USE todoapp; CREATE TABLE todo CREATE TABLE user
3. フォルダ構成
参考までにフォルダ構成は下記のようにしています。

4. Controllerの書き方
jsonを返すRESTful APIなのでview関連の処理は何もありません。なので@RestControllerを使用してjsonを返しています。
package com.todoapp.controller import com.todoapp.facade.ToDoFacade import com.todoapp.requestformat.todo.AddToDoRequestFormat import com.todoapp.requestformat.todo.GetToDoRequestFormat import com.todoapp.requestformat.todo.UpdateToDoTextRequestFormat import com.todoapp.responseformat.todo.AddToDoResponseFormat import com.todoapp.responseformat.todo.DeleteToDoResponseFormat import com.todoapp.responseformat.todo.ToDoResponseFormat import com.todoapp.responseformat.todo.UpdateToDoCompleteFlagResponseFormat import com.todoapp.responseformat.todo.UpdateToDoTextResponseFormat import org.springframework.beans.factory.annotation.Autowired import org.springframework.http.HttpStatus import org.springframework.web.bind.annotation.GetMapping import org.springframework.web.bind.annotation.ModelAttribute import org.springframework.web.bind.annotation.PathVariable import org.springframework.web.bind.annotation.PostMapping import org.springframework.web.bind.annotation.RequestBody import org.springframework.web.bind.annotation.RequestMapping import org.springframework.web.bind.annotation.RequestMethod import org.springframework.web.bind.annotation.ResponseStatus import org.springframework.web.bind.annotation.RestController @RestController @RequestMapping("/todo") class ToDoController @Autowired constructor(private val todoFacade: ToDoFacade) { @GetMapping fun getToDoList(@ModelAttribute requestFormat: GetToDoRequestFormat): ToDoResponseFormat { return todoFacade.getToDo(requestFormat.userId) } @PostMapping @ResponseStatus(HttpStatus.CREATED) fun addToDo(@RequestBody requestFormat: AddToDoRequestFormat): AddToDoResponseFormat { return todoFacade.addToDo(requestFormat.userId, requestFormat.text) } @RequestMapping(value = "{id:^[0-9]+$}", method = arrayOf(RequestMethod.PATCH)) fun updateToDoText(@PathVariable id: Int, @RequestBody requestFormat: UpdateToDoTextRequestFormat): UpdateToDoTextResponseFormat { return todoFacade.updateToDoText(id, requestFormat.text) } @RequestMapping(value = "{id:^[0-9]+$}/complete", method = arrayOf(RequestMethod.PATCH)) fun updateToDoCompleteFlag(@PathVariable id: Int): UpdateToDoCompleteFlagResponseFormat { return todoFacade.updateToDoCompleteFlag(id) } @RequestMapping(value = "{id:^[0-9]+$}", method = arrayOf(RequestMethod.DELETE)) fun deleteToDo(@PathVariable id: Int): DeleteToDoResponseFormat { return todoFacade.deleteToDo(id) } }
5. Entityの書き方
entityは基本的にはデータを保持するだけなのでKotlinのdataクラスを使用して書きます。varで宣言するとsetter,getterをvalで宣言するとgetterが生成されます。またdataクラスはプライマリコンストラクタにプロパティを設定するだけで下記のものが生成されます。
- equals()/hashCode()
- インスタンスのプロパティを表示するtoString()
- 宣言順で内容を取り出すcomponentN()
- copy()
package com.todoapp.entity import com.fasterxml.jackson.annotation.JsonIgnore import java.sql.Timestamp import javax.persistence.Column import javax.persistence.Entity import javax.persistence.GeneratedValue import javax.persistence.Id import javax.persistence.Table @Entity @Table(name = "todo") data class ToDo ( @Id @GeneratedValue var id: Int = 0, @Column(name = "user_id", nullable = false) var userId: Int = 0, @Column(nullable = false) var text: String = "", @Column(name = "complete_flag", nullable = false) var completeFlag: Boolean = false, @Column(name = "complete_datetime", nullable = true) var completeDatetime: Timestamp? = null, @JsonIgnore @Column(name = "insert_datetime", nullable = false) var insertDatetime: Timestamp = Timestamp(0), @JsonIgnore @Column(name = "update_datetime", nullable = false) var updateDatetime: Timestamp = Timestamp(0), @JsonIgnore @Column(name = "delete_flag", nullable = false) var deleteFlag: Boolean = false )
6. Repositoryの書き方
RepositoryはJavaで書いてもそんなに変化なくかけます。
package com.todoapp.repository import com.todoapp.entity.ToDo import org.springframework.data.jpa.repository.JpaRepository import org.springframework.data.jpa.repository.Modifying import org.springframework.data.jpa.repository.Query import org.springframework.data.repository.query.Param import org.springframework.stereotype.Repository import org.springframework.transaction.annotation.Transactional @Repository interface ToDoRepository : JpaRepository<ToDo, Long> { fun findOneById(id: Int): ToDo fun findByUserId(userId: Int): MutableList<ToDo> @Transactional @Modifying @Query("UPDATE ToDo AS t SET t.text = :text WHERE t.id = :id") fun updateTextById(@Param("id") id: Int, @Param("text") text: String) : Int @Transactional @Modifying @Query("UPDATE ToDo AS t SET t.completeFlag = true, completeDatetime = NOW() WHERE t.id = :id") fun updateCompleteFlagById(@Param("id") id: Int) : Int }
まとめ
ソースコードを少し紹介するだけになってしまいましたが、シンプルなRestful APIなら時間もかからずにすんなりかけました。Javaを使ってる人はこの機会にKotlinを試してみてください。
他にもSpring Bootについて書いているので下記リンクを是非参照してみてください!
- Spring Bootのテストコードで使うアノテーション解説
- Spring Data JPAでカスタムRepositoryインターフェースを実装する方法
- Spring BootでFlywayを使用したMySQLのマイグレーション
- EclipseでSpring BootとKotlinの環境構築
おすすめ書籍
JPAに関して体系的に学べる良い書籍だと思います。良くあるSpring系書籍ですとJPAは少ししか紹介がありませんが丸々一冊JPAに関してなので詳細な解説がされています。内容はJPAと他のORMとの比較から始まりセットアップ、実装の仕方まで幅広く網羅されています。これからJPAで開発を初めてみようかなと考えている方は一読することをオススメします!
Springの概要からインストール方法、各コア機能(Security, Sessionなど)の解説が体系的にまとめられています。2018年に出版されたばかりなので情報も新しいです。これからSpring Bootでアプリケーション開発をしたい方の最初に読む一冊としておすすめします。対象は初心者だけでなく上級者まで幅広く学べるので是非読んでみてください!
髙妻智一
最新記事 by 髙妻智一 (全て見る)
- Polkadot(Substrate)のアドレスとトランザクションについて - 2023-03-09
- 【無料公開】「Goで始めるBitcoin」3章 Bitcoinノードとの通信 技術書典8 - 2020-03-08
- エンジニアがゼロから技術ブログを書くための方法をまとめました - 2019-05-25
コメントを残す