Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Sign up for free
Menu
Search
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Pricing
Search
Sign in
Sign up for free
Kotlin nativeなDBライブラリ Exposedを採用した話 / A story o...
Search
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
WebMCP Challenge に星空観察アプリで参加した話
okajun35
0
180
一人だけ、Kiroが静止する日
hideg
0
120
cdk deploy JawsSonic #MARATHONしながらAWSリソースをデプロイしてみよう
akihisaikeda
2
140
『寄り添うラジオ』をAIで作る 体験価値から逆算した、会話しないUXと品質設計
theoriatec2024
3
180
Vue Fes Japan 2026 タイムテーブル徹底解説
448jp
1
250
AI活用は、個人から組織へ|マルチプレイヤーエージェントハーネス「QM」の社内活用事例 / AI use is moving from individuals to orgs
rkaga
1
110
手動確認はもう限界 〜XCUITestでCustom URL Schemeの遷移を起動種別ごとに自動テストする〜 / Testing Custom URL Schemes with XCUITest
otouto
0
300
JPUG勉強会 OSSデータベースの内部構造を理解しよう(第2回)
oga5
0
260
FreeBSDでZabbixを動かす
kenkino
0
300
WebAssembly in Android Apps 〜 WASMはJNIの夢を見るか
keiji
1
110
スマートフォンでモールス信号を送受信する 〜スマートフォンのLEDとカメラで作る光通信の設計と実装〜
atsuki_seo
0
130
SREの越境 / SRE Collaboration
y0hgi
2
230
Featured
See All Featured
The AI Search Optimization Roadmap by Aleyda Solis
aleyda
1
6.2k
The Mindset for Success: Future Career Progression
greggifford
PRO
0
500
Six Lessons from altMBA
skipperchong
29
4.5k
Design in an AI World
tapps
1
320
Building Adaptive Systems
keathley
44
3.2k
Practical Orchestrator
shlominoach
192
12k
brightonSEO & MeasureFest 2025 - Christian Goodrich - Winning strategies for Black Friday CRO & PPC
cargoodrich
3
840
How to train your dragon (web standard)
notwaldorf
97
6.8k
コードの90%をAIが書く世界で何が待っているのか / What awaits us in a world where 90% of the code is written by AI
rkaga
63
46k
A Soul's Torment
seathinner
8
3.6k
How to optimise 3,500 product descriptions for ecommerce in one day using ChatGPT
katarinadahlin
PRO
3
3.8k
Paper Plane (Part 1)
katiecoart
PRO
2
11k
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