Slide 1

Slide 1 text

JavaエンジニアがKotlin+SpringでWebアプ リケーションを作った話 2021年2月18日(木)LINE Developer Meetup #70 - Kotlin Finatext Ltd. 山﨑 康行

Slide 2

Slide 2 text

Copyright © FINATEXT. All rights Reserved. 1
 自己紹介 山﨑 康行   @yasu_yamasaki ( 2018/12〜 Finatext ) ● バックエンド担当 ● JavaでのWebアプリケーション開発歴:8年 ● Kotlin歴:2年 ● フロント(Vue.js)とインフラもやります ● 趣味は一人カラオケ

Slide 3

Slide 3 text

Copyright © FINATEXT. All rights Reserved. 2
 会社紹介 Finatext グループ ● 『金融を「サービス」として再発明する』 ● 証券ビジネスプラットフォーム「BaaS (Brokerage as a Service)」 ○ ずーっと手数料無料のコミュニティ型株取引アプリ「STREAM」 ○ 永久不滅ポイントで気軽に積立投資「セゾンポケット」 ○ 日本株だけのポートフォリオで資産運用「Wealth Wing」 ● 保険プラットフォーム「Inspire (Insurance as a Service)」 ○ 産前から産後まで、妊婦さんの困りごとにきめ細かく寄り添うミニ保険「母子 保険はぐ」

Slide 4

Slide 4 text

Copyright © FINATEXT. All rights Reserved. 3
 今日話すこと ● Kotlinを使ってみたいJavaのサーバサイドエンジニアに向けて ○ JavaのWebアプリ開発経験あれば、KotlinでWebアプリは作れたと いう事例 ○ 躓いたポイントを紹介 ● Kotlinをすでに習得している人に向けて ○ サーバーサイドKotlinの開発事例

Slide 5

Slide 5 text

Copyright © FINATEXT. All rights Reserved. 4
 Agenda ● 事例紹介 ● 使ってみての所感 ● つまづきエピソード紹介

Slide 6

Slide 6 text

Copyright © FINATEXT. All rights Reserved. 5
 Agenda ● 事例紹介 ● 使ってみての所感 ● つまづきエピソード紹介

Slide 7

Slide 7 text

Copyright © FINATEXT. All rights Reserved. 6
 サービスについて Wealth Wingは入金をするだけで運用が始まる、お まかせ投資サービスです。 あなたは待つだけ。日本株のみの高度な運用戦略 で高いリターンを目指します。 ● サービスの特性 ○ システムによるポートフォリオ(資産)管理 ○ リバランス・出金等に伴う証券の自動売買 ○ ユーザのリクエストに対してリアルタイムな証券の 売買は発生しない

Slide 8

Slide 8 text

Copyright © FINATEXT. All rights Reserved. 7
 システム構成 現物株の売買 証券口座管理 (残高・入出金) 認証 投資一任 戦略管理 外部システム(市場等) 証券ビジネスプラットフォーム BaaS ポートフォリオ 管理 Wealth Wingシステム サービス管理 (お知らせ・利用料等) BFF エンドユーザ

Slide 9

Slide 9 text

Copyright © FINATEXT. All rights Reserved. 8
 システム構成をインフラよりにブレイクダウン Application Fargate 【Consumer】 Consumer

Slide 10

Slide 10 text

Copyright © FINATEXT. All rights Reserved. 9
 アプリケーションのアーキテクチャ概要 Consumerモジュール ・エンドユーザ向けAPI ・BFF的な処理 Adminモジュール ・管理者向けAPI ・BFF的な処理 Batchモジュール ・バッチ処理 Coreモジュール ・ドメインロジック Infrastructureモジュール ・リポジトリの実装 ・ドメインエンティティの永続化、 復元 ・DBやBaaS等の外部システム との接続 ● 各アプリケーションはそれぞれ別のモジュール ● ドメインロジックはCoreモジュールに集約 ● DBや外部システムとの接続はInfrastructureモジュールに集約 ● これらのモジュールは1つのGradleプロジェクトのサブプロジェクトになっている モジュールの依存関係図

Slide 11

Slide 11 text

Copyright © FINATEXT. All rights Reserved. 10
 利用している技術

Slide 12

Slide 12 text

Copyright © FINATEXT. All rights Reserved. 11
 Agenda ● 事例紹介 ● 使ってみての所感 ● つまづきエピソード紹介

Slide 13

Slide 13 text

Copyright © FINATEXT. All rights Reserved. 12
 所感 ● Java + Springの知見は、そのまま使える。 ○ 基本的にはJava + Springと同じ ○ システムの運用保守は同じ ○ Springの使い方も同じ ○ Lintやカバレッジ計測等、Kotlinとして扱わなければならない部分で、若干はまりポイント はある ここを消すと、もはやJavaによる開発

Slide 14

Slide 14 text

Copyright © FINATEXT. All rights Reserved. 13
 所感 Javaに比べKotlinは、堅牢性の高いコードが簡潔に書ける 例:null safety public void request(Input input) { if (input == null) { throw new IllegalArgumentException("input not null") } // ... } 不必要なnullチェックはなくなります ※Javaでも@NotNull等で対応可

Slide 15

Slide 15 text

Copyright © FINATEXT. All rights Reserved. 14
 所感 Javaに比べKotlinは、堅牢性の高いコードが簡潔に書ける 例:data class data class User( // = デフォルト値 val id: UUID = UUID.randomUUID(), // 変わらない val birthDay: LocalDate, // 変わる var address: String, // nullable var company: Company? ) Value Objectを簡潔に表現できる ※Javaにも似た仕様のRecordが実装されました

Slide 16

Slide 16 text

Copyright © FINATEXT. All rights Reserved. 15
 所感 Javaに比べKotlinは、堅牢性の高いコードが簡潔に書ける 例:Scope Functions User createUser(String name) { User user = new User(name) userRepository.insert(user) return user } ローカル変数を減らすことができる fun createUser(name: String): User { return User(name) .also { userRepository.insert(it) } } Java Kotlin

Slide 17

Slide 17 text

Copyright © FINATEXT. All rights Reserved. 16
 所感 チーム開発は・・・ ● プロジェクトの状況 ○ バックエンドチーム:最大5人、入れ替わりトータル10人くらい ○ Kotlinを習得しているメンバは1人くらいしかおらず ● 学習コストは低い ○ Javaを知っているメンバであれば、Kotlinの習得は早かった(1,2週間程度) ○ Javaを知らないメンバだと、結構時間が掛かった印象だが、どちらかというとSpring Frameworkによるもの ● 堅牢性が高いコードが書けるのでチーム開発も◎

Slide 18

Slide 18 text

Copyright © FINATEXT. All rights Reserved. 17
 Agenda ● 事例紹介 ● 使ってみての所感 ● つまづきエピソード紹介

Slide 19

Slide 19 text

Copyright © FINATEXT. All rights Reserved. 18
 つまづきエピソード紹介 Kotlinには検査例外がない

Slide 20

Slide 20 text

Copyright © FINATEXT. All rights Reserved. 19
 やりたかったこと 業務ロジックで発生する業務例外を定義して …

Slide 21

Slide 21 text

Copyright © FINATEXT. All rights Reserved. 20
 やりたかったこと 呼び出し側で確実にキャッチ!

Slide 22

Slide 22 text

Copyright © FINATEXT. All rights Reserved. 21
 まず:@Throwsをつける catch強制できない…

Slide 23

Slide 23 text

Copyright © FINATEXT. All rights Reserved. 22
 次に:Result型を使う Result型はreturnできない

Slide 24

Slide 24 text

Copyright © FINATEXT. All rights Reserved. 23
 最後に:Sealed Classを使う Sealed Classとは… 同じファイル内からだけ継承できるクラス。 誤解を恐れずに言うと、インスタンスを生成できる Enumのようなもの

Slide 25

Slide 25 text

Copyright © FINATEXT. All rights Reserved. 24
 最後に:Sealed Classを使う ● 呼び出し側で必ずチェックされる ● Errorが追加された場合、呼び出し側がコンパイルエラーになり、対応漏れを防げる

Slide 26

Slide 26 text

Copyright © FINATEXT. All rights Reserved. 25
 さいごに ● 質問・ご意見歓迎です ● 個別のご質問があれば @yasu_yamasaki 宛にご連絡ください ● 資料のURLもTwitterで共有いたします ● Finatext では一緒に働く仲間を募集中です ○ https://hd.finatext.com/recruit/ ● ミートアップやってます。当面はオンライン。 ○ https://finatext.connpass.com/event/202070/

Slide 27

Slide 27 text

Copyright © FINATEXT. All rights Reserved. 26