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
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
480
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
Transcript
35 slides
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 対応してるか調査コストが高い 実行時エラーになるので確認に時間がかかる いい調査方法をご存知の方は教えて下さい
ありがとうございました
More Decks by Kazuhiro Seo
See All by Kazuhiro Seo
PostgreSQL 18で考えるUUID主キー
kazuhiro1982
0
590
GitHub ActionsとAWSをOIDC認証で連携する
kazuhiro1982
1
260
Gradleとちょっと仲良くなろう
kazuhiro1982
0
140
JavaとWebAssembly
kazuhiro1982
0
180
セッションデータの管理にSpring Sessionを利用する
kazuhiro1982
0
3.8k
AWSのLake Formation Governed Tablesを触ってみた
kazuhiro1982
0
470
VS CodeとRemote Containerで開発環境もコード管理しよう
kazuhiro1982
1
790
SpringBootをコンテナで動かしてみる
kazuhiro1982
0
450
Serverless FrameworkでWebサイトの更新を検知して通知する
kazuhiro1982
0
550
Other Decks in Programming
See All in Programming
あなたの await、OS まで届いてる? strace で覗く JavaScript の非同期
hasutosasaki
1
2.3k
ローカルLLMの基本と近況 2611 / Local LLM basics and recent situation 2611
kishida
1
210
学びを記事・スライド・Xへ高速展開する― AI-assisted Learning Loopで回すコンテンツ生成術
ochtum
0
210
Getting Started with Vibe Coding
miccheng
0
220
Apple Intelligenceとオンデバイス時代の到来
yahir0
0
240
私なりのハーネスエンジニアリング ~独自の言語処理系の開発を通して~
seosoft
0
200
baseline으로 마이그레이션, 리팩토링 안전하게 맡기기
fornewid
1
980
AIが生成したコードは読むべきか?抽象化設計とコードの品質保証 / abstraction-design-and-quality
minodriven
16
9.1k
Railsのためのパスキー実践入門 〜マルチテナントSaaSでの意思決定〜
utakaha
4
4.2k
FactoryBotをやめればRSpecは速くなるのか?
yuta_onishi_97
0
1.7k
GraphQL の onError と Nullability のこれから
quramy
0
210
AI-Powered Domain-Driven Design
ziobrando
0
440
Featured
See All Featured
Leo the Paperboy
mayatellez
11
2.5k
Design of three-dimensional binary manipulators for pick-and-place task avoiding obstacles (IECON2024)
konakalab
0
660
Sam Torres - BigQuery for SEOs
techseoconnect
PRO
0
610
The #1 spot is gone: here's how to win anyway
tamaranovitovic
4
1.2k
[SF Ruby Conf 2025] Rails X
palkan
3
1.5k
How to Build an AI Search Optimization Roadmap - Criteria and Steps to Take #SEOIRL
aleyda
1
2.2k
Visualization
eitanlees
153
17k
Stop Working from a Prison Cell
hatefulcrawdad
274
21k
Deep Space Network (abreviated)
tonyrice
0
410
The agentic SEO stack - context over prompts
schlessera
0
1k
Primal Persuasion: How to Engage the Brain for Learning That Lasts
tmiket
0
520
Build The Right Thing And Hit Your Dates
maggiecrowley
39
3.5k