すぐに始める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
Spring Bootプロジェクト開封の儀
上記でGenerate Projectしてダウンロードしたzipフォルダを開封の儀式をしながら、解凍しましょう そのフォルダをintellijでimportしてやろう(ちゃんとGradleにしてね??????????)
とりあえず動かしてみるの巻
プロジェクトをimportして、buildも問題なくできたら開発していきまっしょしょしょい
まずは適当なSampleController的なのをApplicationと同じとこに作成しよう
作成したClassに@RestControllerをつけてあげることで、そいつはSpring BootからControllerと認識されるよよ
@Controllerでもいいけど、今回はAPIとしてレスポンスデータを返したいので@RestControllerにしてます
ここにアクセスされたら、これして!ってのを書いてくぜ
とりあえず動かすということで、文字列"hello"を返すhello関数定義してみましょう これだけでは動いてくれません
このURLにアクセスされたら、これする!って明示してあげないとだめなので、書きましょう 宣言した関数の上に@GetMapping("/hello")
これで/helloにGETアクセスされたら、helloって返ってくるやったぜってなります
こんな感じになります
今更ですが、Kotlinの解説とかSpringBootの詳細解説はしません! 他にもっと良質な記事があるからだ!!!!!(逃避
ここで起動してみて、localhost:8080/helloにブラウザでアクセスしてみましょう! helloって返って来たら完璧bbbbb
自分の名前で挨拶されたくね?
やり方は色々ありますが、今のとりあえず動かす場面では@PathVariableでパスに値を渡す方式でいきましょう!
hello関数の引数に@PathVariableアノテーションをつけて宣言しましょう! 次に、GetMappingの引数の/helloのあとに続けて、/{name}をつけたしてくだせえ
/hello/{name}みたいになるよ
これで起動してみて、localhost:8080/hello/gumiojiみたいにすると名前で挨拶されるよ!やったぜ!!
API作ってく
ここまでで、一旦動かすってのはできたと思うのでAPI作ってみましょう!
SpringBootのRestControllerがついてる場合は、デフォルトのリクエストやレスポンスは内部のJacksonが働いてくれている
なので、マッピングなどは受け皿となるdata classがあって明示することで特に気にすることなくマッピングしてくれるのだ
てことで今回はidと名前と年齢を返すUserデータを返すAPIを作ってみましょう!
まずは受け皿となるdata class Userの作成
さっき言ったように、マッピングはデフォルトでやってくれるので、ControllerにUser Classを戻り値とする関数定義してやりましょう!
これだけ!!!!!
実際に起動してlocalhost:8080/userにアクセスしてみましょう!
JSONが返ってきたらおめでたい
Kotlinサーバサイド開発完全に理解したって言えますね
これだけでは物足りないと思うのでこれを少し実践寄りのものに弄っていきましょう
Swagger
まず初めにAPIを他の人やクライアントが利用するときに、なるほどー!こういうものかーってわかるドキュメント + 動作確認ができる便利なAPI仕様書を定義してみましょう
build.gradleファイルの一番下のdependenciesブロックに以下のSpringBootで簡単にswagger定義ができるライブラリを導入しましょう
Swagger設定をするためのファイルSwaggerConfigをkotlinファイルとして作りましょう
ここのAPIのベースとなるパッケージを指定する
basePackageの引数は各自のpackageで合わせてください
コントローラーだけをベースとして表示したいので src/main/package~~/controllerという感じで一段controller用に掘りましょう New -> Packageで作成できるよん
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にライブラリ追加を書きましょう!
src/main/resources配下にapplication.propertiesがありますよね そこにはアプリの設定などを記入する場所だと思ってください
H2
そこにDBの接続情報を書きましょう
今回は簡易にするために組み込みメモリを使用してますが、MySQLとか用意してる場合はここに書いてる内容を変えるだけでおっけーでしbbb
次にアプリが起動した時にFlywayがテーブルを作ってくれるようにしましょう!
Flyway
Flywayはresources/db/migration配下のVx.x__hoge.sqlという名前のファイルを探してマイグレーションするので、まずはresources配下にdb/migrationディレクトリ掘って、そこにV1.0__init.sqlというファイルを作成しましょう
SQLファイルにはUSER TABLEを作成するように書いてあげましょう!
これでアプリ起動されたら、H2DBにUSER TABLEが生成されているようになりました!
あとは、APIを叩いたときにコード上からDBにデータ操作をできるようにするだけです!
Mybatis
src/main/kotlinにSampleMapperとSampleRepositoryインタフェースを作成しましょう!
Mybatisは直接SQLが書けるので、かゆい操作にも手が届くのでおすすめです! 今回みたいな場合だとそんな恩恵は感じられないんですけどね.......
パスを叩いて呼び出して使えるようにしよう!
ここまでできたら、最後はRepositoryを呼び出すService Classを作って、そのServiceをControllerから呼び出したら終わりです!
なぜ、間にそんなクラスを挟むの? そういうお作法です!!! Controllerは何も知らずにただ、サービスの機能を呼び出すだけにしようという目的です!
SpringBootのありがたいところは、引数に@Serviceや@Repositoryと宣言したクラスはDIされるとこです! インスタンス生成もしなくて、シングルトンで使い回しができるってことなんだなーって思ってもらえたら良いです!
ってことで、さっきかいたDBアクセスのRepositoryの機能を呼び出すSampleService Classを作りましょう!
引数にSampleRepositoryがあるけど、これでもうDIされて使えるようになってます!ありがてえぇ。。。
最後にこのServiceをControllerから呼び出しましょう
これで、起動してswagger-uiからcreateしてfindしてupdateしてdeleteという操作ができるようになってます!
おわり
いかがだったでしょうか??? 最後が勢いよく飛ばし気味になったのと、sample codeが結構めちゃくちゃになったのは反省です 投稿することに注力しました!!!!!
今後変更できそうなら、編集しておきます...
こんな感じでAPIがささっと作れるので、必要になったら作ってみたらいかがでしょう!!!!!!!??????
きっかけになったらいいなと思いますし、今回詳細な説明はしてませんが、こうやったらできるんだろうということは伝えたつもりなので、疑問に残ったとこは自分で調べて勉強してみましょう!!!!!
皆さんよいアドカレ生活を