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
Kazuhiro Seo
January 29, 2023
Programming
450
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
GitHub ActionsとAWSをOIDC認証で連携する
kazuhiro1982
1
210
Gradleとちょっと仲良くなろう
kazuhiro1982
0
110
JavaとWebAssembly
kazuhiro1982
0
150
セッションデータの管理にSpring Sessionを利用する
kazuhiro1982
0
3.4k
AWSのLake Formation Governed Tablesを触ってみた
kazuhiro1982
0
440
VS CodeとRemote Containerで開発環境もコード管理しよう
kazuhiro1982
1
750
SpringBootをコンテナで動かしてみる
kazuhiro1982
0
430
Serverless FrameworkでWebサイトの更新を検知して通知する
kazuhiro1982
0
530
Other Decks in Programming
See All in Programming
吝嗇家のためのAI活用 / AI development for miser - ChatGPT + Issue Driven Development
tooppoo
0
180
コーディングルールの鮮度を保ちたい for SRE NEXT 2026 / keep-fresh-go-internal-conventions-sre-next-2026
handlename
0
120
これからAgentCoreを触る方へトレンドはGatewayです
har1101
6
480
Welcome to the "Parametricity" 🏙️ − Generic だけど Specific な世界 −
guvalif
1
120
TAKTでAI駆動開発の品質を設計する
j5ik2o
7
1.7k
AIを活用したE2Eテスト実装効率化のあゆみ / ebisu-mobile-14-kotetu
kotetuco
0
160
Signal Forms: Details & Live Coding @enterJS 2026 in Mannheim
manfredsteyer
PRO
0
220
Generative UI & AI-Assistants for Your Angular Solutions
manfredsteyer
PRO
0
140
LLM本来の能力を解き放つサンドボックス技術とAI民主化への適用
yukukotani
3
4.9k
使用 Meilisearch 建立新聞搜尋工具
johnroyer
0
110
Even G2とAWSで推しのエージェントを召喚しよう!
har1101
1
140
Embedded SREと共に達成した会員管理システムのAWS移行 - SRE NEXT 2026 ランチスポンサーセッション
niftycorp
PRO
0
1.6k
Featured
See All Featured
The Limits of Empathy - UXLibs8
cassininazir
1
400
Measuring Dark Social's Impact On Conversion and Attribution
stephenakadiri
2
230
Easily Structure & Communicate Ideas using Wireframe
afnizarnur
194
17k
The Director’s Chair: Orchestrating AI for Truly Effective Learning
tmiket
1
210
Amusing Abliteration
ianozsvald
1
220
Visualization
eitanlees
152
17k
For a Future-Friendly Web
brad_frost
183
10k
What does AI have to do with Human Rights?
axbom
PRO
1
2.2k
Between Models and Reality
mayunak
4
360
Build The Right Thing And Hit Your Dates
maggiecrowley
39
3.2k
Paper Plane
katiecoart
PRO
1
52k
Building Better People: How to give real-time feedback that sticks.
wjessup
370
20k
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 対応してるか調査コストが高い 実行時エラーになるので確認に時間がかかる いい調査方法をご存知の方は教えて下さい
ありがとうございました