Androidマンになりたいおじさん

自分の備忘録的なのです。Androidを普及できたらいいなと思ったりしながら書きます

すぐに始めるKotlinサーバサイド開発(Spring Boot + Swagger + Flyway + Mybatis)

この記事は学内サークルのアドカレでし

おはようこんにちはこんばんわ、2日目を担当するぐみおじさんです

思いっきりDiscord Botの話する気満々でしたが Discord Botの話を成果発表でしていたのをすっかり忘れてた人です

ってことでサクッとKotlinで始めるAPI作りいってみよおおおおおおおおお(やり投げ並の勢い

intellij IDEA(以下intellij)前提で話していくのでご了承を

Spring Bootプロジェクト生成

Spring InitializrというSpring BootプロジェクトのテンプレをGUI形式でポチポチした後にダウンロードされたプロジェクトを解凍して、buildするなりintellijでimportすれば開発始めれるぜやったーーーというプロジェクトテンプレート生成サービスです

let's go

https://start.spring.io/

f:id:qurangumio:20181201184056p:plain
こんな感じに設定してね(最初はWebだけでいいよ)

Spring Bootプロジェクト開封の儀

上記でGenerate Projectしてダウンロードしたzipフォルダを開封の儀式をしながら、解凍しましょう そのフォルダをintellijでimportしてやろう(ちゃんとGradleにしてね??????????)

とりあえず動かしてみるの巻

プロジェクトをimportして、buildも問題なくできたら開発していきまっしょしょしょい

まずは適当なSampleController的なのをApplicationと同じとこに作成しよう

f:id:qurangumio:20181201185136p:plain
Class名は何でもいいけど、コントローラーだよって明示してた方がわかりやすいよ!

作成したClassに@RestControllerをつけてあげることで、そいつはSpring BootからControllerと認識されるよよ

@Controllerでもいいけど、今回はAPIとしてレスポンスデータを返したいので@RestControllerにしてます

ここにアクセスされたら、これして!ってのを書いてくぜ

とりあえず動かすということで、文字列"hello"を返すhello関数定義してみましょう これだけでは動いてくれません

このURLにアクセスされたら、これする!って明示してあげないとだめなので、書きましょう 宣言した関数の上に@GetMapping("/hello")

これで/helloにGETアクセスされたら、helloって返ってくるやったぜってなります

こんな感じになります

f:id:qurangumio:20181201190426p:plain
src/main/kotlin/package~~/SampleContoller.ktの中身

今更ですが、Kotlinの解説とかSpringBootの詳細解説はしません! 他にもっと良質な記事があるからだ!!!!!(逃避

ここで起動してみて、localhost:8080/helloにブラウザでアクセスしてみましょう! helloって返って来たら完璧bbbbb

自分の名前で挨拶されたくね?

やり方は色々ありますが、今のとりあえず動かす場面では@PathVariableでパスに値を渡す方式でいきましょう!

hello関数の引数に@PathVariableアノテーションをつけて宣言しましょう! 次に、GetMappingの引数の/helloのあとに続けて、/{name}をつけたしてくだせえ

/hello/{name}みたいになるよ

f:id:qurangumio:20181201191807p:plain
src/main/kotlin/package~~/SampleContoller.ktの中身

これで起動してみて、localhost:8080/hello/gumiojiみたいにすると名前で挨拶されるよ!やったぜ!!

API作ってく

ここまでで、一旦動かすってのはできたと思うのでAPI作ってみましょう!

SpringBootのRestControllerがついてる場合は、デフォルトのリクエストやレスポンスは内部のJacksonが働いてくれている

なので、マッピングなどは受け皿となるdata classがあって明示することで特に気にすることなくマッピングしてくれるのだ

てことで今回はidと名前と年齢を返すUserデータを返すAPIを作ってみましょう!

まずは受け皿となるdata class Userの作成

f:id:qurangumio:20181201192656p:plain
src/main/kotlin/package~~/User.ktの中身

さっき言ったように、マッピングはデフォルトでやってくれるので、ControllerにUser Classを戻り値とする関数定義してやりましょう!

f:id:qurangumio:20181201193139p:plain
src/main/kotlin/package~~/SampleContoller.ktの中身

これだけ!!!!!

実際に起動してlocalhost:8080/userにアクセスしてみましょう!

JSONが返ってきたらおめでたい

Kotlinサーバサイド開発完全に理解したって言えますね

これだけでは物足りないと思うのでこれを少し実践寄りのものに弄っていきましょう

Swagger

まず初めにAPIを他の人やクライアントが利用するときに、なるほどー!こういうものかーってわかるドキュメント + 動作確認ができる便利なAPI仕様書を定義してみましょう

build.gradleファイルの一番下のdependenciesブロックに以下のSpringBootで簡単にswagger定義ができるライブラリを導入しましょう

f:id:qurangumio:20181201194505p:plain
TopDirecroty/build.gradleの中身

Swagger設定をするためのファイルSwaggerConfigをkotlinファイルとして作りましょう

f:id:qurangumio:20181201194946p:plain
src/main/kotlin/package~~/SwaggerConfig.ktの中身

ここのAPIのベースとなるパッケージを指定する

basePackageの引数は各自のpackageで合わせてください

コントローラーだけをベースとして表示したいので src/main/package~~/controllerという感じで一段controller用に掘りましょう New -> Packageで作成できるよん

f:id:qurangumio:20181201195344p:plain
こんな感じになればokok!

SwaggerConfigを作成して、controllerパッケージを掘ってController Classを設置して、basePackageの引数にControllerがある場所を明記できましたか??

できたら、起動して

localhost:8080/swagger-ui.html

にアクセスしてみましょう!

ここで自分が定義したパス一覧や扱われているmodelが見れたりしますよ! ただ、見れるだけじゃなくて実際に定義したのをTry Outで動くかを実行できるので色々試してみてください!便利ですねbbbb

DBに繋ぐの巻

さっきはUserデータを直接生成して返してましたが、まあそんなケースはないですよね... 大抵はCRUD操作ができるDBが裏側にいるもんです

それを作って終わりましょう!

H2, Flyway, Mybatis

DB -> H2

DBマイグレーションツール -> Flyway

ORM -> Mybatis

各種の詳細は時間の都合上割愛します!!

さっそくswaggerを取り込んだときのように、build.gradleのdependenciesにライブラリ追加を書きましょう!

f:id:qurangumio:20181201221340p:plain
TopDirecroty/build.gradleの中身

src/main/resources配下にapplication.propertiesがありますよね そこにはアプリの設定などを記入する場所だと思ってください

H2

そこにDBの接続情報を書きましょう

f:id:qurangumio:20181201221541p:plain
src/main/resources/application.propertiesの中身

今回は簡易にするために組み込みメモリを使用してますが、MySQLとか用意してる場合はここに書いてる内容を変えるだけでおっけーでしbbb

次にアプリが起動した時にFlywayがテーブルを作ってくれるようにしましょう!

Flyway

Flywayはresources/db/migration配下のVx.x__hoge.sqlという名前のファイルを探してマイグレーションするので、まずはresources配下にdb/migrationディレクトリ掘って、そこにV1.0__init.sqlというファイルを作成しましょう

f:id:qurangumio:20181201222037p:plain
flywayのファイル設置場所

SQLファイルにはUSER TABLEを作成するように書いてあげましょう!

f:id:qurangumio:20181201222210p:plain
src/main/resources/db/migration/V1.0__init.sqlの中身

これでアプリ起動されたら、H2DBにUSER TABLEが生成されているようになりました!

あとは、APIを叩いたときにコード上からDBにデータ操作をできるようにするだけです!

Mybatis

src/main/kotlinにSampleMapperとSampleRepositoryインタフェースを作成しましょう!

f:id:qurangumio:20181201222614p:plain
src/main/kotlin/package~~/SampleMapper.ktの中身

f:id:qurangumio:20181201222703p:plain
src/main/kotlin/package~~/SampleRepository.ktの中身

f:id:qurangumio:20181201222737p:plain
src/main/kotlin/package~~/SampleRepository.ktの続き

Mybatisは直接SQLが書けるので、かゆい操作にも手が届くのでおすすめです! 今回みたいな場合だとそんな恩恵は感じられないんですけどね.......

パスを叩いて呼び出して使えるようにしよう!

ここまでできたら、最後はRepositoryを呼び出すService Classを作って、そのServiceをControllerから呼び出したら終わりです!

なぜ、間にそんなクラスを挟むの? そういうお作法です!!! Controllerは何も知らずにただ、サービスの機能を呼び出すだけにしようという目的です!

SpringBootのありがたいところは、引数に@Serviceや@Repositoryと宣言したクラスはDIされるとこです! インスタンス生成もしなくて、シングルトンで使い回しができるってことなんだなーって思ってもらえたら良いです!

ってことで、さっきかいたDBアクセスのRepositoryの機能を呼び出すSampleService Classを作りましょう!

f:id:qurangumio:20181201223554p:plain
src/main/kotlin/package~~/SampleService.ktの中身

引数にSampleRepositoryがあるけど、これでもうDIされて使えるようになってます!ありがてえぇ。。。

最後にこのServiceをControllerから呼び出しましょう

f:id:qurangumio:20181201223728p:plain
src/main/kotlin/package~~/SampleContoller.ktの中身

これで、起動してswagger-uiからcreateしてfindしてupdateしてdeleteという操作ができるようになってます!

おわり

いかがだったでしょうか??? 最後が勢いよく飛ばし気味になったのと、sample codeが結構めちゃくちゃになったのは反省です 投稿することに注力しました!!!!!

今後変更できそうなら、編集しておきます...

こんな感じでAPIがささっと作れるので、必要になったら作ってみたらいかがでしょう!!!!!!!??????

きっかけになったらいいなと思いますし、今回詳細な説明はしてませんが、こうやったらできるんだろうということは伝えたつもりなので、疑問に残ったとこは自分で調べて勉強してみましょう!!!!!

皆さんよいアドカレ生活を