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
SpringBoot 3.0 のNative Imageを試してみた
Search
Sponsored
·
Ship Features Fearlessly
Turn features on and off without deploys. Used by thousands of Ruby developers.
→
Kazuhiro Seo
January 29, 2023
Programming
460
0
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
SpringBoot 3.0 のNative Imageを試してみた
Kazuhiro Seo
January 29, 2023
More Decks by Kazuhiro Seo
See All by Kazuhiro Seo
PostgreSQL 18で考えるUUID主キー
kazuhiro1982
0
500
GitHub ActionsとAWSをOIDC認証で連携する
kazuhiro1982
1
230
Gradleとちょっと仲良くなろう
kazuhiro1982
0
120
JavaとWebAssembly
kazuhiro1982
0
150
セッションデータの管理にSpring Sessionを利用する
kazuhiro1982
0
3.6k
AWSのLake Formation Governed Tablesを触ってみた
kazuhiro1982
0
460
VS CodeとRemote Containerで開発環境もコード管理しよう
kazuhiro1982
1
760
SpringBootをコンテナで動かしてみる
kazuhiro1982
0
440
Serverless FrameworkでWebサイトの更新を検知して通知する
kazuhiro1982
0
530
Other Decks in Programming
See All in Programming
<title><a id="</title>君はこのHTMLをパースできるか"></a></title> #雑LT_study
pizzacat83
0
170
「つくるAI」だけではバグは見つからない ~テストに必要な「見つけるAI」を分離させる戦略~
mfunaki
0
150
そこに3びきプロダクトがいるじゃろう——生成AI時代における“価値が届かない理由”の構造
kosuket
0
560
初めての模倣学習とVLA
natsutan
0
180
いまどきの Codex で開発する visionOS アプリの開発スタイルについて
karad
0
160
170k Jobs a Day on GKE: Scaling Mercari's CI Platform - and What's Next for AI-Native Development
junyaokabe
0
120
Building a Meta Ray-Ban display app
akkeylab
0
180
KotlinConf Extended South Korea 2026 Keynote
l2hyunwoo
0
120
今さら聞けない .NET CLI
htkym
0
210
異なる設計思想のフレームワークを経験して得た学び
amekuhideki
1
130
Loosening the Reins: Go Generics Get More Flexible
kuro_kurorrr
0
270
ソフトウェアエンジニアにとっての生成AI - 特性を知って使い倒す / generative ai for software enginner
kishida
7
2.1k
Featured
See All Featured
My Coaching Mixtape
mlcsv
0
260
Site-Speed That Sticks
csswizardry
13
1.5k
Hiding What from Whom? A Critical Review of the History of Programming languages for Music
tomoyanonymous
3
1.1k
Neural Spatial Audio Processing for Sound Field Analysis and Control
skoyamalab
0
410
Why Your Marketing Sucks and What You Can Do About It - Sophie Logan
marketingsoph
0
390
ラッコキーワード サービス紹介資料
rakko
1
4.5M
What Being in a Rock Band Can Teach Us About Real World SEO
427marketing
0
1.1k
The SEO Collaboration Effect
kristinabergwall1
1
530
Bash Introduction
62gerente
615
220k
The Art of Delivering Value - GDevCon NA Keynote
reverentgeek
16
2.1k
Become a Pro
speakerdeck
PRO
31
6.2k
Tips & Tricks on How to Get Your First Job In Tech
honzajavorek
1
710
Transcript
SpringBoot 3.0 の Native Image を試してみた
自己紹介 妹尾 一弘 サーバーサイドエンジニア 最近Web 開発から遠のいている LT 駆動学習 Java Do
スタッフ
Spring Boot 3.0 リリース 🎉
Native Image のサポートがGA
Native Image 単独で実行可能となるようにビルドされたイメージ 起動時間が高速 メモリ使用量が削減できる コンテナイメージを縮小できる 完全に互換ではない
やってみた
サンプルコード 簡単なCRUD を行うREST API DynamoDB にアクセス
Bean @Data public class Item { private String id; private
String name; private String code; }
Controller @RestController @RequestMapping("/items") public class ItemController { @Autowired private ItemService
service; @GetMapping("/") public Iterable<Item> index() { return service.list(); }
Service @Service public class ItemService { @Autowired private ItemRepository repository;
public void create(Item item) { repository.save(item); }
Repository public interface ItemRepository { Item save(Item item); Iterable<Item> findAll();
Optional<Item> findById(String id); void deleteById(String id); }
ビルド
Gradle plugins plugins { id 'java' id 'org.springframework.boot' version '3.0.1'
id 'io.spring.dependency-management' version '1.1.0' id 'org.graalvm.buildtools.native' version '0.9.18' }
bootBuildImage タスク Spring Boot Plugin のタスク Cloud Native Buildpacks を利用してビルド
ソースコードからビルド構成を検知 Native BuildTools プラグインがある時Native Build
bootBuildImage ./gradlew bootBuildImage --imageName spring-boot-3:latest docker push ...
潤沢なメモリが必要 自分のローカルマシンだとOOME 今回はAWS CodeBuild を利用してビルド 15 GB メモリ、8 vCPU のインスタンス
問題なく動いたか?
問題 - CASE 1 - DB アクセスにサードパーティライブラリを利用 spring-data-dynamodb dependencies {
implementation 'com.github.derjust:spring-data-dynamodb:5.1.0' }
Bean 生成エラー( 実行時エラー)
原因 - CASE 1 - AWS SDK for Java は
v2 以降からNativeImage に対応 該当ライブラリはv1 にしか対応していなかった
対策 - CASE 1 - 公式のdynamodb-enhanced を利用 dependencies { implementation
'software.amazon.awssdk:dynamodb' implementation 'software.amazon.awssdk:dynamodb-enhanced' }
対策 - CASE 1 - Bean とDynamoDB Table のマッピングを生成 @Bean
DynamoDbTable<Item> itemTable(DynamoDbEnhancedClient client) { return client.table("Items", TableSchema.fromBean(Item.class)); }
対策 - CASE 1 - Repository を独自実装 @Component public class
ItemRepositoryImpl implements ItemRepository { @Autowired private DynamoDbTable<Item> table; @Override public Item save(Item item) { table.putItem(item); return item; }
問題 - CASE 2 - Bean 生成エラー( 実行時エラー)
原因 - CASE 2 - dynamodb-enhanced も一部非対応
対策 - CASE 2 - StaticTableSchema を利用 private TableSchema<Item> getStaticTableSchema()
{ return StaticTableSchema.builder(Item.class) .newItemSupplier(Item::new) .addAttribute(String.class, a -> a.name("id").setter(Item::se .addAttribute(String.class, a -> a.name("name").setter(Item:: .addAttribute(String.class, a -> a.name("code").setter(Item:: .build(); }
成功!
性能比較
イメージサイズ plane: 17-jdk-alpine 上にbootJar を配備 220MB ⇒ 43MB に改善
メモリ使用量
起動速度 - bootJar - 起動時間: 14.354s
起動速度 - native - 起動時間: 0.596s
まとめ SpringBoot の起動時間は高速になる メモリ使用量は今回は参考程度 あまり負荷もかけていない イメージサイズの節約も嬉しい
課題 ライブラリがNative 対応してるか調査コストが高い 実行時エラーになるので確認に時間がかかる いい調査方法をご存知の方は教えて下さい
ありがとうございました