21
Spring Gradle Kotlin でWebアプリケーションを作ってみてる W8LT#5 @ふぁっとだるま

Spring + Gradle + Kotlin W8LT#5

Embed Size (px)

Citation preview

Page 1: Spring + Gradle + Kotlin W8LT#5

Spring Gradle Kotlin

でWebアプリケーションを作ってみてる

W8LT#5 @ふぁっとだるま

Page 2: Spring + Gradle + Kotlin W8LT#5

もういらない気がしてきた

•  松田 淳平 (だるま,デブ,酒クズ) •  東工大 佐伯研M2 •  Java, Kotlin,シェル芸 •  twitter:@fat_daruuuuma, github:jmatsu

Page 3: Spring + Gradle + Kotlin W8LT#5

発端 •  某講義のページがRails1だか2で動いている •  最低限の機能しかないので不便 •  講義中小課題提出がメール •  メール用の管理ツールも古い

•  今後のこと(あと数年?)も考えるとちょっと不安 → 新しいものを作るしかない (๑•`ㅂ•́)و✧

Page 4: Spring + Gradle + Kotlin W8LT#5

検討 •  Rails4 •  つまらない •  現在のサーバーを汚すのは避けたい

•  Play1.x (一回作りました) •  助教氏「なんで2.xじゃないの」 •  僕「それな」

•  Play2.x •  sbt「ぶおおおんwwww・・・(フリーズ」 •  本当に消えて欲しい

Page 5: Spring + Gradle + Kotlin W8LT#5

検討(続) •  Play1.xでいいやん! •  バグが見つかる •  設計が汚い •  Java7で書かれている(重要) •  用意した自動設定の書式を忘れた(最重要)

•  作り直すにも, •  Lambdaがないとやる気になれない •  Play2.xは重すぎてやる気になれない

Page 6: Spring + Gradle + Kotlin W8LT#5

そうだ、Kotlinにしよう

•  目的等をガン無視して手段から入る最低な発想

Page 7: Spring + Gradle + Kotlin W8LT#5

Kotlin •  静的型付オブジェクト指向のJVM言語 •  intelliJで有名なJetBrains社が作成(現在OSS化) •  Javaと相互完全運用 •  Lambdaやら諸々が標準装備

7

Page 8: Spring + Gradle + Kotlin W8LT#5

検討(続続) •  あ、KotlinでPlay1.xって動くんかな!?

→ 祈りが足りず動く方法を見つけられない •  KotlinでPlay2.xなら!? •  Gradle → 祈りが足りず終了 •  Sbt → まあ動きはしたけど重すぎ却下

•  Kotlinでなんかないかな!? •  勉強会で @yy_yank さんがSSに触れてたぞ!

•  http://www.slideshare.net/yyyank/server-side-kotlin-49030491

•  Spring Bootが現実的っぽい?

Page 9: Spring + Gradle + Kotlin W8LT#5

Spring Boot •  Spring frameworkの各コンポーネントを簡単に

使えるようごにょごにょしたもの •  Controllerレイヤーに関するコンポーネントだけ,

とか色々選択しながら利用することが可能 •  Not XML-based configuration. •  Java/Annotation-based Configuration!

9

Page 10: Spring + Gradle + Kotlin W8LT#5

つまり

10

Page 11: Spring + Gradle + Kotlin W8LT#5

11

Page 12: Spring + Gradle + Kotlin W8LT#5

じゃなくて

12

Page 13: Spring + Gradle + Kotlin W8LT#5

13

Page 14: Spring + Gradle + Kotlin W8LT#5

14

♡接着剤

Page 15: Spring + Gradle + Kotlin W8LT#5

要件(?)を全て満たしている(???) •  Rails4

•  つまらない → 楽しい!

•  現在のサーバーを汚すのは避けたい → one jarなので汚れない!

•  Play1.x (一回作りました) •  助教氏「なんで2.xじゃないの

→ この議論が不要!!! •  僕「それな」

→ それな •  Play2.x

•  sbt「ぶおおおんwwww・・・(フリーズ」 → Gradleなので問題ない(?)

•  本当に消えて欲しい → 使わない!

Page 16: Spring + Gradle + Kotlin W8LT#5

利用物 •  Controller layer •  Spring Boot Starter(SBS) Web

•  Model layer •  mongoDB via SBS

•  View layer •  Thymeleaf via SBS

•  Security component •  SBS Security

16

Page 17: Spring + Gradle + Kotlin W8LT#5

構築は超簡単 •  Gradleでひな形を作成 •  Kotlinの設定 •  Kotlin pluginを追加 •  compileにKotlinのstdlibを追加

•  Spring Bootの設定 •  Spring Boot pluginを追加 •  compileに必要なコンポーネントを追加 •  springBoot内でmainClassを記述

•  以上.一瞬で終わる.下は最小構成 •  https://github.com/jmatsu/SpringBootWithKotlinSample

17

Page 18: Spring + Gradle + Kotlin W8LT#5

つまずいた点 •  KotlinのIntやStringがSerializableじゃない •  このままじゃmodelのIDに使えない!!

•  ネット情報「Converterってのがあってな?」 •  僕「Configクラスで追加すればええんやな?」

•  Configクラスでinjectionがエラーになる orz •  @Value(“${spring.data.mongodb.database}”)

•  Kotlinだと変数展開と判定 → CE •  Raw stringにしても無理

•  ラップして回避 •  E.g. data class SInt(body: Int): Serializable

18

Page 19: Spring + Gradle + Kotlin W8LT#5

Spring Boot w/ Kotlinの利点 •  Null安全 && Let等による構造化が強すぎる •  API部分で冗長になりがちな記述に対して良い •  スコープが制限されるのでレイヤー違反を減らし

やすい •  Accessorが生えるので,PropertyはViewから

そのままアクセス可能 •  import A as B が神すぎてヤバい

19

Page 20: Spring + Gradle + Kotlin W8LT#5

Spring Boot w/ Kotlinの欠点 •  View側ではKotlinは使えない •  Javaから呼び出すときの記法に従う必要がある

•  そのままじゃ拡張メソッドは使えない •  Kotlin部分はHotDeployできない・・・ •  拡張メソッドを使える余地が大きすぎる •  各自が勝手に拡張するとひどいことになりそう •  Android開発時よりも,冗長な部分の解決策が広

そうな感触

20

Page 21: Spring + Gradle + Kotlin W8LT#5

課題 •  有用性は大いにあるけど,HotDeployがないのは

つらい •  現状の規模ならビルドは十分に早いけども

•  Webフレームワーク用Kotlinライブラリが必要 •  Kotlin人口 •  はよAndroid界の標準になって欲しいな!!!1

21