KotlinでSpring BootのRESTful APIを実装




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

手順

  1. Eclipseを使ったKotlinの環境構築
  2. Flywayを使ったMySQLのマイグレーション
  3. フォルダ構成
  4. Controllerの書き方
  5. Entityの書き方
  6. Repositoryの書き方

1. Eclipseを使ったKotlinの環境構築

無料のIDEで高機能なEclipseを今回は使用します。Spring BootはSpring スターター・プロジェクトという機能で必要最小限の機能を導入してプロジェクトを始められます。今回はweb, JPA, MySQL, Flywayという機能を最初に選択します。

環境構築の詳細は下記記事を参考してください。

EclipseでSpring BootとKotlinの環境構築

 

2. Flywayを使ったMySQLのマイグレーション

環境構築が完了したら完了したら次はDBの準備をします。DBのマイグレーションにはFlywayを使用します。導入がものすごく簡単で使い始めるまでに他に何もインストールしなくて済むのでおすすめです。

Flywayの詳細は下記記事を参考にしてください。

Spring BootでFlywayを使用したMySQLのマイグレーション

今回作成するテーブルは下記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について書いているので下記リンクを是非参照してみてください!

おすすめ書籍

JPAに関して体系的に学べる良い書籍だと思います。良くあるSpring系書籍ですとJPAは少ししか紹介がありませんが丸々一冊JPAに関してなので詳細な解説がされています。内容はJPAと他のORMとの比較から始まりセットアップ、実装の仕方まで幅広く網羅されています。これからJPAで開発を初めてみようかなと考えている方は一読することをオススメします!

Springの概要からインストール方法、各コア機能(Security, Sessionなど)の解説が体系的にまとめられています。2018年に出版されたばかりなので情報も新しいです。これからSpring Bootでアプリケーション開発をしたい方の最初に読む一冊としておすすめします。対象は初心者だけでなく上級者まで幅広く学べるので是非読んでみてください!

 

The following two tabs change content below.

髙妻智一

2013年CyberAgent新卒入社 スマホゲームを作る子会社に所属し、サーバーサイドのエンジニアを担当。2年目の終わりから新規子会社の立ち上げに参加し、サーバーサイドのエンジニアリーダーとしてサービースのリリースから運用までを担当。 2018年仮想通貨のスマホウォレットを提供するGinco Incにブロックチェーンエンジニアとして入社。






よく読まれている関連記事はこちら



コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です