Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
Kotlin nativeなDBライブラリ Exposedを採用した話 / A story o...
Search
Sponsored
·
Your Podcast. Everywhere. Effortlessly.
Share. Educate. Inspire. Entertain. You do you. We'll handle the rest.
→
Yuya Urano
June 06, 2019
Programming
1.2k
2
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
Kotlin nativeなDBライブラリ Exposedを採用した話 / A story of adopting Exposed - a DB library written by Kotlin
Yuya Urano
June 06, 2019
Other Decks in Programming
See All in Programming
依存関係から依存物へ―Dependencyという言葉の歴史をひも解く
j_lee
0
130
Lessons from Spec-Driven Development
simas
PRO
0
220
Vue × Nuxt × Oxc どこまで使える?実運用の現在地
andpad
0
290
PHPで使える日時の表現と、その知り方 #frontend_phpcon_do
o0h
PRO
0
260
IBM Bobを活用したレガシーアプリの最新化
oniak3ibm
PRO
1
210
気圧・高度・GPSを記録&可視化するアプリ「Koudo」を作った話
hjmkth
1
320
1B+ /day規模のログを管理する技術
broadleaf
0
110
並列実装の現場、2ヶ月間実務でAIを使い倒したAIもPCも私も限界が近い
ming_ayami
0
130
エンジニアと一緒にテストコードの設計と実装を改善した話
mototakatsu
0
210
New "Type" system on PicoRuby
pocke
1
1k
Inside Stream API
skrb
1
760
気づいたらRubyで100作品 ー クリエイティブコーディングが生活の一部になるまで / 100 Ruby Sketches Later: How Creative Coding Became Part of My Life
chobishiba
3
600
Featured
See All Featured
Darren the Foodie - Storyboard
khoart
PRO
3
3.4k
No one is an island. Learnings from fostering a developers community.
thoeni
21
3.8k
Redefining SEO in the New Era of Traffic Generation
szymonslowik
1
340
The Organizational Zoo: Understanding Human Behavior Agility Through Metaphoric Constructive Conversations (based on the works of Arthur Shelley, Ph.D)
kimpetersen
PRO
0
360
The Limits of Empathy - UXLibs8
cassininazir
1
370
Beyond borders and beyond the search box: How to win the global "messy middle" with AI-driven SEO
davidcarrasco
3
170
Thoughts on Productivity
jonyablonski
76
5.2k
Measuring & Analyzing Core Web Vitals
bluesmoon
9
870
Building AI with AI
inesmontani
PRO
1
1.1k
SEO for Brand Visibility & Recognition
aleyda
0
4.6k
The Psychology of Web Performance [Beyond Tellerrand 2023]
tammyeverts
49
3.5k
世界の人気アプリ100個を分析して見えたペイウォール設計の心得
akihiro_kokubo
PRO
72
40k
Transcript
Kotlin nativeなDBライブラリ Exposedを採用した話 浦野 裕也 (@yu_rano) 株式会社 日本経済新聞社 日経IDチーム
自己紹介 2
3 浦野 裕也 (うらの ゆうや) @yu_rano 所属 | 日本経済新聞社
日経IDチーム 日経IDのリニューアルプロジェクトでサーバーサイ ドの言語にKotlinを採用。 今日はサーバーサイドの話をします。
サーバーサイドで Kotlin使ってる人 4
DBライブラリの選定迷いませんか? 5
各種ライブラリ 採用候補 6 Application framework • Spring • Ktor Test
• JUnit • Spek Database access • Spring JPA (Hibernate) • MyBatis • DOMA2 • Exposed
Spring, JUnitはJava界の デファクト 7
各種ライブラリ 採用候補 8 Application framework • Spring (採用) • Ktor
Test • JUnit (採用) • Spek Database access • Spring JPA (Hibernate) • MyBatis • DOMA2 • Exposed
DBアクセスのデファクトは Hibernate? 9
各種ライブラリ 採用候補 10 Application framework • Spring (採用) • Ktor
Test • JUnit (採用) • Spek Database access • Spring JPA (Hibernate) • MyBatis • DOMA2 • Exposed どれも決め手に欠ける...
なぜExposedを採用したか • 軽量なライブラリ • 異なるパラダイムの2つのAPI ◦ DSL API: SQLライクにかけるKotlin DSLのAPI
◦ DAO API: O/R mapper • 設定とデータアクセス処理がKotlinで完結する • ロードマップにコルーチンサポート・R2DBC/ADBAへの移行が載っていた ◦ 将来的にnon-blocking I/O モデルへの移行も視野に入れられそう ◦ https://github.com/JetBrains/Exposed/blob/master/ROADMAP.md • JetBrains製 11
軽量なライブラリ mvnリポジトリにあるjarの容量 698KB (version 0.13.7) 参考| hibernate-core: 6.8MB (version
5.4.3.Final) 12
異なるパラダイムのAPI DSL API 型安全でSQLライクなsyntaxのDSL(ドメイン固有言語) 生のSQLを書いているような感覚で書けるが、Kotlinベースなので静的型付けの恩恵を 受けられる。 DAO API 軽量なDAO(Data Access
Object)を実現するAPI データアクセスのインターフェースを隠蔽してくれるため、SQLを書かずにデータアクセス を実装できる。 13
テーブル定義 14 object StarWarsFilms : Table() { val id =
integer("id").autoIncrement().primaryKey() val sequelId = integer("sequel_id").uniqueIndex() val name = varchar("name", 50) val director = varchar("director", 50) } 出典 | https://github.com/JetBrains/Exposed/wiki/DSL Tableクラスを継承したobjectを定義する • テーブル名はTable(name=”table_name”)で指定 • 指定しない場合、クラス名から”Table”サフィックスを取ったものになる • 列名や型、PKなどの制約をメソッドチェーンで指定する
DSL APIの例 fun main(args: Array<String>) { //an example connection to
H2 DB Database.connect("jdbc:h2:mem:test", driver = "org.h2.Driver") transaction { // insert new city. SQL: INSERT INTO Cities (name) VALUES ('St. Petersburg') val stPeteId = Cities.insert { it[name] = "St. Petersburg" } get Cities.id // 'select *' SQL: SELECT Cities.id, Cities.name FROM Cities println("Cities: ${Cities.selectAll()}") } } object Cities: IntIdTable() { val name = varchar("name", 50) } 15 出典 | https://github.com/JetBrains/Exposed/wiki/Getting-Started
DAO APIの例 fun main(args: Array<String>) { //an example connection to
H2 DB Database.connect("jdbc:h2:mem:test" , driver = "org.h2.Driver" ) transaction { // insert new city. SQL: INSERT INTO Cities (name) VALUES ('St. Petersburg') val stPete = City.new { name = "St. Petersburg" } // 'select *' SQL: SELECT Cities.id, Cities.name FROM Cities println("Cities: ${City.all()}") } } object Cities: IntIdTable() { val name = varchar("name", 50) } class City(id: EntityID<Int>) : IntEntity(id) { companion object : IntEntityClass <City>(Cities) var name by Cities.name } 16 出典 | https://github.com/JetBrains/Exposed/wiki/Getting-Started
設定とデータアクセス処理がKotlinで完結する Kotlinで完結することの利点: • DBアクセス部分のテストカバレッジが取りやすい • コード補完機能の恩恵を受けられる • Kotlinの型チェックの恩恵を受けられる 17
実際使ってみてどうだったか? 18
• ライブラリのサイズが小さいため学習コストも小さい • コード補完の支援を受けながらクエリ書けるのが気持ちいい • 全てExposedで完結しようとせず、複雑なクエリは生のSQLを書くことも検討する ◦ Exposedで大抵のユースケースには対応できる ◦ CQRS(コマンドクエリ責務分離)の考え方に従ってモデルを分けて、複雑な参
照系のみ生のSQLを使うと良さそう • DAO APIを使うとテーブル設計の制約が強くなるので、既存のデータベースを扱う 必要がある場合はDSL APIを推奨 ◦ このあたりはHibernateなど他のO/R mapperと変わらない 19
結論 20
サーバーサイドKotlin 楽しい 21
ご清聴ありがとうございました 22