SlideShare a Scribd company logo
1 of 114
Download to read offline
Spring Bootで変わる
Javaアプリ開発!
日本Springユーザ会 勉強会
∼やっぱりSpringを始めよう!
2014/08/13
槙 俊明(@making)
ハッシュタグ
#jsug
自己紹介
• @making
• http://blog.ik.am
• 日本Javaユーザーグループ(JJUG)幹事
• Spring Boot本書いています
http://amzn.to/hajiboo
地味にSpring Boot Contributor
JJUG CCC 2014 Fall
http://www.java-users.jp/?p=1253
2014/11/15(土)
2014/09/30までCall for Paper募集中!
Springネタを是非お待ちしております!
http://www.slideshare.net/makingx/
spring-4spring-boot-spring-jjug-jsug
http://www.slideshare.net/
makingx/grails-30-spring-boot
今日のコンテンツ
1. Spring Boot概要
2. Spring Bootで何が変わる?
• アプリの設定が変わる
• アプリのデプロイも変わる
• システムのアーキテクチャも変わる?
Spring Boot概要
Spring Bootとは?
フレームワークというよりプラットフォーム
現在1.1.5.RELEASE
簡単に言うと、Spring Framework
でアプリケーションを簡単に作る
ための仕組み
Spring Bootを使うことで・・
モダンでいけてるJava
アプリケーションを
簡単に構築できる
Spring Bootの特徴
• あらかじめオススメの組み合わせが決
まる
• 依存ライブラリを同梱するだけで自動
で設定が決まる
• 組み込みサーバーを同梱し、アプリを
即実行可能 アプリケーション自体は
Spring MVCやSpring Batchで書く
Spring BootはDropwizard
にインスパイアされた
Dropwizardに比べてSpring Bootがいいところ
•これまでのSpring Frameworkのノウ
ハウがそのまま活かせる
•Spring Frameworkの開発元が開発し
ている
•チュートリアル・サンプル・ドキュメ
ントが充実している
チュートリアルが豊富
• http://spring.io/guides
70種類以上の簡易チュートリアル
サンプルが豊富
• https://github.com/spring-projects/spring-boot/tree/
master/spring-boot-samples
40種類以上のサンプルプロジェクト
Technology Radar July2014
http://thoughtworks.fileburst.com/assets/technology-radar-july-2014-en.pdf
Spring BootでHello World
Mavenアーキタイプでプロジェ
クト雛形生成
$ mvn -B archetype:generate -DgroupId=com.example
-DartifactId=jsug-helloworld -Dversion=1.0.0-
SNAPSHOT -DarchetypeArtifactId=maven-archetype-
quickstart
Spring Bootに関係のない汎用的な手順
pom.xmlを編集
<parent>	
<groupId>org.springframework.boot</groupId>	
<artifactId>spring-boot-starter-parent</artifactId>	
<version>1.1.5.RELEASE</version>	
</parent>	
<dependencies>	
<dependency>	
<groupId>org.springframework.boot</groupId>	
<artifactId>spring-boot-starter-web</artifactId>	
</dependency>	
<dependency>	
<groupId>org.springframework.boot</groupId>	
<artifactId>spring-boot-starter-test</artifactId>	
<scope>test</scope>	
</dependency>	
</dependencies>	
<build>	
<plugins>	
<plugin>	
<groupId>org.springframework.boot</groupId>	
<artifactId>spring-boot-maven-plugin</artifactId>	
</plugin>	
</plugins>	
</build>	
<properties>	
<java.version>1.8</java.version>	
</properties>	
 
この設定を追加
するだけ
インポート後
いろいろな依存関係が追加され
ている
package com.example;	
!
import org.springframework.boot.SpringApplication;	
import org.springframework.boot.autoconfigure.EnableAutoConfiguration;	
import org.springframework.web.bind.annotation.RequestMapping;	
import org.springframework.web.bind.annotation.RestController;	
!
@RestController	
@EnableAutoConfiguration	
public class App {	
!
@RequestMapping("/")	
String home() {	
return "Hello World!";	
}	
!
public static void main(String[] args) {	
SpringApplication.run(App.class, args);	
}	
}
魔法のアノテーション
mainメソッドでアプリ実行
まずは実行
• 実行方法は2通り
または
$ mvn spring-boot:run
$ gradle bootRun Gradleの場合
ログ
組込Tomcatが起動した
http://localhost:8080 にアクセス
実行可能jarを作成
$ mvn package
jarを実行
$ java -jar target/jggug-helloworld-1.0.0-
SNAPSHOT.jar
プロパティを変更して実行
$ java -jar target/jggug-helloworld-1.0.0-
SNAPSHOT.jar --server.port=8888
--(プロパティ名)=(プロパティ値)
予め用意されている沢山のプロ
パティを変更可能
• http://docs.spring.io/spring-boot/docs/
1.1.4.RELEASE/reference/html/common-application-
properties.html
一度作ったjarはそのまま本番環境で使用可能。
配布も可能。
Spring Bootで何が変わる?
Spring Bootで何が変わる?
• アプリの設定が変わる
• アプリのデプロイが変わる
Spring Bootで何が変わる?
• アプリの設定が変わる
• アプリのデプロイが変わる
ほとんど設定不要!
Spring Bootで何が変わる?
• アプリの設定が変わる
• アプリのデプロイが変わる
ほとんど設定不要!
jarを実行するだけ!
アプリの設定が変わる
AutoConfigure
• 自動でいい感じの設定が行われる仕組み
• @EnableAutoConfigurationで自動設
定が有効化
• ポイントは@Conditionalアノテーション
AutoConfigureの説明の前に
ベースとなるJavaConfigの説明
package com.example;	
!
import org.springframework.context.annotation.Bean;	
import org.springframework.context.annotation.Configuration;	
!
@Configuration	
public class AppConfig {	
!
@Bean	
SomeBean someBean() {	
returen new SomeBean();	
}	
}
JavaConfigの記法 com.example.AppConfig
JavaConfig宣言
Bean定義宣言
@Conditional
package com.example;	
!
import
org.springframework.boot.autoconfigure.condition.ConditionalOnClass;	
import org.springframework.context.annotation.Bean;	
import org.springframework.context.annotation.Configuration;	
!
@Configuration	
@ConditionalOnClass({SomeBean.class})	
public class AppConfig {	
!
@Bean	
SomeBean someBean() {	
returen new SomeBean();	
}	
}
クラスパス上にSomeBeanが存在
した場合にこのBean定義が有効
SomeBeanを含むライブラリ(jar)
を追加するだけで有効になる!
Autoconfigureを支える
@Conditional
@ConditionalOnBean
指定したクラスの
有効
@ConditionalOnClass 指定したクラスがクラスパス上にあれば有効
@ConditionalOnMissing
Bean
指定したクラスの
ば有効
@ConditionalOnMissing
Class
指定したクラスがクラスパス上にあれば有効
@ConditionalOnPropert
y
指定したプロパティが指定した値であれば有効
@ConditionalOnExpress
ion
指定した
等。
org.springframework.boot.autoconfigure.condition	
以下を参照
初めからサポートされている
Autoconfigure
初めからサポートされている
Autoconfigure
•Spring AMQP(RabitMQ)
•Spring Batch
•Spring Data
•Spring HATEOAS
•Spring Integration
•Spring Mobile
•Spring Security
•Spring Social
•Tomcat
•Jetty
•ThymeLeaf
•JPA
•JMS
•WebSocket
•Solr
•ElasticSearch
•MongoDB
•Redis
•Liquibase
•Flyway
など
Starter
• 使いたい機能のAutoConfigureを有効にするための、
依存関係を定義したMavenプロジェクト(pom)
https://github.com/spring-projects/spring-boot/tree/master/spring-boot-starters
30種類以上のstarterプロ
ジェクト
!
<dependency>	
<groupId>org.springframework.boot</groupId>	
<artifactId>spring-boot-starter-data-jpa</artifactId>	
</dependency>	
spring-boot-starter-data-
jpaを追加するだけ。
[例] Spring Data JPAを使いたい
必要な依存関係が追加される
👉 AutoConfigureの中をのぞこう
@Configuration	
@ConditionalOnBean(DataSource.class)	
@ConditionalOnClass(JpaRepository.class)	
@ConditionalOnMissingBean(RepositoryFactoryBeanSupport.class)	
@ConditionalOnExpression("${spring.data.jpa.repositories.enabled:true}")	
@Import(JpaRepositoriesAutoConfigureRegistrar.class)	
@AutoConfigureAfter(HibernateJpaAutoConfiguration.class)	
public class JpaRepositoriesAutoConfiguration {	
	 @Configuration	
	 @EnableSpringDataWebSupport	
	 @ConditionalOnWebApplication	
	 @ConditionalOnMissingBean(PageableHandlerMethodArgumentResolver.class)	
	 protected static class JpaWebConfiguration {	
	 }	
}
DataSourceが出来ていて
JpaRepositoryクラスが存在
各種条件が ったら有効
別の定義をimport
@EnableConfigurationProperties(JpaProperties.class)	
@Import(DataSourceInitializedPublisher.Registrar.class)	
public abstract class JpaBaseConfiguration implements BeanFactoryAware {	
!
	 // ...	
	 @Bean	
	 @ConditionalOnMissingBean	
	 public EntityManagerFactoryBuilder entityManagerFactoryBuilder(	
	 	 	 JpaVendorAdapter jpaVendorAdapter) {	
	 	 EntityManagerFactoryBuilder builder = new EntityManagerFactoryBuilder(	
	 	 	 	 jpaVendorAdapter, this.jpaProperties, this.persistenceUnitManager);	
	 	 builder.setCallback(getVendorCallback());	
	 	 return builder;	
	 }	
	 @Bean	
	 @Primary	
	 @ConditionalOnMissingBean	
	 public LocalContainerEntityManagerFactoryBean entityManagerFactory(	
	 	 	 EntityManagerFactoryBuilder factory) {	
	 	 return factory.dataSource(this.dataSource).packages(getPackagesToScan())	
	 	 	 	 .properties(getVendorProperties()).build();	
	 }	
}
HibernateJpaAutoConfiguration	
の親クラス
EntityManagerFactory	
の生成
@Configuration	
@ConditionalOnWebApplication	
@ConditionalOnMissingBean({ OpenEntityManagerInViewInterceptor.class,	
	 	 OpenEntityManagerInViewFilter.class })	
@ConditionalOnExpression("${spring.jpa.openInView:${spring.jpa.open_in_view:true}}")	
protected static class JpaWebConfiguration extends WebMvcConfigurerAdapter {	
	 // ...	
!
	 @Bean	
	 public OpenEntityManagerInViewInterceptor openEntityManagerInViewInterceptor() {	
	 	 return new OpenEntityManagerInViewInterceptor();	
	 }	
}	
Open Session In Viewパターン
がデフォルトで適用されている
= Springのオススメパターン?
@EnableAutoConfiguration
package com.example;	
!
import org.springframework.boot.SpringApplication;	
import org.springframework.boot.autoconfigure.EnableAutoConfiguration;	
import org.springframework.context.annotation.ComponentScan;	
!
@EnableAutoConfiguration	
@ComponentScan	
public class App {	
!
public static void main(String[] args) {	
SpringApplication.run(App.class, args);	
}	
}
エントリポイントに
@EnableAutoConfigurationをつけると
自動設定が有効になる
@Service	
@Transactional	
public class BookmarkService {	
@Autowired	
BookmarkRepository bookmarkRepository;	
!
public List<Bookmark> findAll() {	
return bookmarkRepository.findAll(new Sort(Sort.Direction.ASC, "id"));	
}	
!
public Bookmark save(Bookmark bookmark) {	
return bookmarkRepository.save(bookmark);	
}	
!
public void delete(Long id) {	
bookmarkRepository.delete(id);	
}	
}
public interface BookmarkRepository
extends JpaRepository<Bookmark, Long>
{	
!
}
特別な設定なしでSpring Data JPAが使える。特別な設定なしでSpring Data JPAが使える。
ハンズオンで作ったアプリ
設定なしでREST API
を作れる!
AutoConfigureは黒魔術ではない
org.springframework.boot.autoconfigure	
パッケージのソースを読めば、
何が設定されるか分かる。
通常はマニュアル読めばよい。
使いたい機能が合った場合(いままで)
1.必要なライブラリ群の依存関係(通常複数)を追加
2.ライブラリを使うために必要な設定を追加
3.アプリケーションからライブラリを使用する
使いたい機能が合った場合(いままで)
1.必要なライブラリ群の依存関係(通常複数)を追加
2.ライブラリを使うために必要な設定を追加
3.アプリケーションからライブラリを使用する
autoconfigureで不要
starterだけでOK
ここに注力できる
使いたい機能が合った場合(これから)
1.必要なライブラリのstarterを追加
2.ライブラリを使うために必要な設定を追加
3.アプリケーションからライブラリを使用する
例1: 「Spring Social Twitter」を
使ってつぶやく
HelloWorldアプリから10数行だけ
コードを足して、OAuth認可後、
Twitterへツイートできるようにする。
!
<dependency>	
<groupId>org.springframework.boot</groupId>	
<artifactId>spring-boot-starter-social-twitter</artifactId>	
</dependency>	
HelloWorldアプリから10数行だけコー
ドを足して、OAuth認可後、Twitterへ
ツイートできるようにする。
例1: 「Spring Social Twitter」を
使ってつぶやく
starterを追加
@RestController	
@EnableAutoConfiguration	
public class App {	
@Autowired	
ConnectionRepository connectionReposiory;	
@Autowired	
Twitter twitter;	
!
@RequestMapping("/")	
String home(@RequestParam("tweet") String tweet) {	
if (connectionRepository.findPrimaryConnection(Twitter.class) == null) {	
return "<a href='/connect/twitter'>Please connect</a>";	
}	
twitter.timelineOperations().updateStatus(tweet);	
return tweet + " is tweeted!";	
}	
!
public static void main(String[] args) {	
SpringApplication.run(App.class, args);	
}	
}
App.java編集
アプリケーション登録
https://dev.twitter.com/
APIキーの設定
spring.social.twitter:	
app-id: 3b6ZO4iF4AG08P62OVFWlVxEP	
app-secret: 2IdbPGbLjwsCw6prcPNumrQlV07uMKi4hseQoShaeJl51xEEkA	
spring.social.auto-connection-views: true
コネクション用の画面を自動生成
application.yml
Appを実行
ツイート
例2: DBマイグレーションライブラリ
「FlyWay」を使ってみる
<dependency>	
	 <groupId>org.springframework.boot</groupId>	
	 <artifactId>spring-boot-starter-data-jpa</artifactId>	
</dependency>	
<dependency>	
	 <groupId>org.hsqldb</groupId>	
	 <artifactId>hsqldb</artifactId>	
	 <scope>runtime</scope>	
</dependency>	
<dependency>	
	 <groupId>org.flywaydb</groupId>	
	 <artifactId>flyway-core</artifactId>	
</dependency>
ライブラリを追加するだけで
AutoConfigureが有効に
あとは所定の位置にSQLを書くだけ
spring.jpa.hibernate.ddl-auto: validate
CREATE TABLE PERSON (	
	 id BIGINT GENERATED BY DEFAULT AS IDENTITY,	
	 first_name varchar(255) not null,	
	 last_name varchar(255) not null	
);	
!
insert into PERSON (first_name, last_name) values ('Dave', 'Syer');
現在適用されているSQLの
バージョンを確認して、必要
なSQLを自動で実行
DDLの実行はFlywayに任せ
るために、JPAの機能を抑制
Spring Bootの対象は
Webアプリだけではない
• バッチ処理
• システム連携
• Hadoop YARN
説明量が増えすぎたので
今日はカット😢
アプリのデプロイが変わる
これまでのデプロイ(開発)
1.コードを書く/修正する
2.(アプリケーションをビルドする) <= IDEが
自動で行う
3.IDEのプラグインでAPサーバーを起動する
4.IDEのプラグインでAPサーバー上でアプリ
ケーションを実行する
これまでのデプロイ(本番)
1.コードを書く/修正する
2.Ant/Maven/Gradleなどでアプリケーショ
ンをビルドしてwarを作成する
3.APサーバーを起動する
4.APサーバーにwarをデプロイする(warを所
定の場所に配置する)
Spring Bootのデプロイ(開発)
1.コードを書く/修正する
2.(アプリケーションをビルド
する) <= IDEが自動で行う
3.mainメソッド実行する
Spring Bootのデプロイ(本番)
1.コードを書く/修正する
2.Maven/Grandleでビルドして

実行可能jarを作成する
3.jarを所定のフォルダにcpする
4.jarを実行する
Spring Bootの基本パターン
実行可能jarを作って実行。
プロパティは外から変える。
一度作ったjarはどこでも使えてポータブル!
アプリケーションの更新
新しいjarをcpするだけ。
JenkinsやGitbucketと同じ!
起動スクリプト(RedHat系)
# 途中略	
case "$1" in	
start)	
	 echo -n "Starting MyApp "	
	 nohup java $JVM_OPTS -jar $MYAPP_HOME/myapp.jar $PARAMS >> $LOG_FILE 2>&1 &	
	 pid=$!	
	 echo $pid > "$MYAPP_PID_FILE"	
	 success	
	 echo	
	 ;;	
stop)	
	 echo -n "Shutting down MyApp "	
	 killproc myapp	
	 RETVAL=$?	
	 echo	
	 ;;	
*)	
	 echo "Usage: $0 {start|stop}"	
	 exit 1	
	 ;;	
esac
/etc/init.d/myapp start
/etc/init.d/myapp stop
ポータビリティはPaaSフレンドリ
Spring Bootで作ったWebアプリはHeroku
やCloud Foundryへ簡単にデプロイできる
Immutable/Disposable Infrastructure
と相性が良い。Dockerとか。
Herokuにデプロイ
web: java $JAVA_OPTS -jar target/*.jar --server.port=$PORT
プロジェクト直下のProcfileに以下を記述
$ heroku create	
$ git push heroku master	
でHerokuへデプロイ!
Herokuとローカルで
DBを動的に切り替えたい場合
@Bean(destroyMethod = "close")	
DataSource dataSource() throws URISyntaxException {	
String url, username, password;	
String databaseUrl = System.getenv("DATABASE_URL");	
if (databaseUrl != null) {	
URI dbUri = new URI(databaseUrl);	
url = "jdbc:postgresql://" + dbUri.getHost() + dbUri.getPath() + ":" +
dbUri.getPort() + dbUri.getPath();	
username = dbUri.getUserInfo().split(":")[0];	
password = dbUri.getUserInfo().split(":")[1];	
} else {	
url = this.properties.getUrl();	
username = this.properties.getUsername();	
password = this.properties.getPassword();	
}	
DataSourceBuilder factory = DataSourceBuilder	
.create(this.properties.getClassLoader())	
.url(url)	
.username(username)	
.password(password);	
return factory.build();	
}
Herokuでは環境変数
DATABASE_URLにDB情報
が含まれる
Herokuの場合
ローカルの場合
Spring Cloudというサブプロジェク
トを使うとこのへんを吸収できる
Herokuとローカルで
DBを動的に切り替えたい場合
spring:	
profle:	
active: dev	
jpa.hibernate.ddl-auto: update	
---	
spring:	
profiles: dev	
datasource:	
driverClassName: org.h2.Driver	
url: jdbc:h2:file:/tmp/bookmark	
username: sa	
password:	
jpa.database: H2	
---	
spring:	
profiles: heroku	
datasource:	
driverClassName: org.postgresql.Driver	
jpa.database: POSTGRESQL
Profile毎にYAMLで設定可能
デフォルトでdevを指定
Herokuの場合
PostgreSQLを使用する
ローカル(dev)の場合
H2データベースを使用する
application.yml
profile毎のファイルを
作成することも可能
実行時にProfile指定
web: java $JAVA_OPTS -jar target/*.jar —server.port=$PORT
--spring.profiles.active=heroku
Procfileに--spring.profiles.active	
でherokuプロファイルを指定
ちなみにこれはBoot以前からある機能。
YAMLもSpring4.1から本体に取り込まれる。
Heroku Button
Github上のアプリを「ボタンぽち」で
Herokuにデプロイできる仕組み
[![Deploy](https://www.herokucdn.com/deploy/
button.png)](https://heroku.com/deploy)
README.mdにボタンのリンクを貼るだけ
Spring Bootなら簡単
Procfileと
app.jsonを用意
{	
"name": "Bookmark Application",	
"description": “Handson Application"	
}
app.json
http://bit.ly/jsug-heroku
Spring Bootなら簡単
Procfileと
app.jsonを用意
{	
"name": "Bookmark Application",	
"description": “Handson Application"	
}
app.json
ぽち
http://bit.ly/jsug-heroku
ブランチを自動で判断
ぽち
ブランチを自動で判断
2~3分
2~3分
アプリの配布も変わる?
Spring Bootでアプリを作成して、
Githubで管理し、
Heroku Buttonを配置
アプリの配布も変わる?
Spring Bootでアプリを作成して、
Githubで管理し、
Heroku Buttonを配置
アプリを即座にDeploy & Tryできる!
(PaaS上の)アプリの状態を知りたい
<dependency>	
	 <groupId>org.springframework.boot</groupId>	
	 <artifactId>spring-boot-starter-actuator</artifactId>	
</dependency>
Spring Boot Actuator
(PaaS上の)アプリの状態を知りたい
<dependency>	
	 <groupId>org.springframework.boot</groupId>	
	 <artifactId>spring-boot-starter-actuator</artifactId>	
</dependency>
Spring Boot Actuator
依存関係を追加するだけで、アプリの情
報やメトリクスを取得するためのエンド
ポイントが公開される
JSONで取得できる情報
http://docs.spring.io/spring-boot/docs/1.1.5.RELEASE/reference/html/production-ready-endpoints.html
等
パス 取得内容
/metrics
アクセスカウンタやレスポンスタイム、
JVM
/health 各種データソースのヘルスチェック
/dump スレッドダンプ
/configprops プロパティ
/env 環境変数
Actuator用のAutoconfigure対応
サードパーティ
• CRaSH (SSHサポート)
• Jolokia (JMXをJSONで出力)
• CodaHale Metrics (さらなるメトリクス)
システムアーキテクチャも
変わる?
伝統的なアーキテクチャ
http://www.infoq.com/articles/microservices-intro より図を拝借
モノリシックアーキテクチャ
伝統的なアーキテクチャ
http://www.infoq.com/articles/microservices-intro より図を拝借
モノリシックアーキテクチャ
システムが大きくなると、全体
を把握するのが大変で、保守が
難しい。
伝統的なアーキテクチャ
http://www.infoq.com/articles/microservices-intro より図を拝借
モノリシックアーキテクチャ
システムが大きくなると、全体
を把握するのが大変で、保守が
難しい。
技術の変更は難しい(リスキー
d)
伝統的なアーキテクチャ
http://www.infoq.com/articles/microservices-intro より図を拝借
モノリシックアーキテクチャ
システムが大きくなると、全体
を把握するのが大変で、保守が
難しい。
技術の変更は難しい(リスキー
d)
技術的に発展的成長が難しい
アーキテクチャ
マイクロサービスアーキテクチャ
http://www.infoq.com/articles/microservices-intro より図を拝借
Single Responsibility Principle (SRP)
に基づき名詞や動詞単位でサービスを分割
マイクロサービスアーキテクチャ
http://www.infoq.com/articles/microservices-intro より図を拝借
Single Responsibility Principle (SRP)
に基づき名詞や動詞単位でサービスを分割
HTTPやAMQPで通信
マイクロサービスアーキテクチャ
http://www.infoq.com/articles/microservices-intro より図を拝借
Single Responsibility Principle (SRP)
に基づき名詞や動詞単位でサービスを分割
HTTPやAMQPで通信
Amazon
Netfilx
eBay
などが採用
マイクロサービスアーキテクチャ
http://www.infoq.com/articles/microservices-intro より図を拝借
Single Responsibility Principle (SRP)
に基づき名詞や動詞単位でサービスを分割
HTTPやAMQPで通信
これまで説明
してきた
Spring Bootの
機能が効く!
Amazon
Netfilx
eBay
などが採用
マイクロサービスアーキテクチャの
メリット・デメリット
メリット デメリット
自担当のサービスのコードを
理解しやすい
システム全体を見なくなる
新しい技術を採用しやすい・
失敗してもやり直しやすい
分散システムの整合をとる
のが難しい
サービス単位でスケールできる
サービス間の通信オーバー
ヘッドがある
1
ーク等
他サービスの障害をふまえ
た設計が必要
IDE
マイクロサービスアーキテクチャの
メリット・デメリット
メリット デメリット
自担当のサービスのコードを
理解しやすい
システム全体を見なくなる
新しい技術を採用しやすい・
失敗してもやり直しやすい
分散システムの整合をとる
のが難しい
サービス単位でスケールできる
サービス間の通信オーバー
ヘッドがある
1
ーク等
他サービスの障害をふまえ
た設計が必要
IDE 銀の弾丸ではない
続きはWebで
http://www.infoq.com/minibooks/emag-microservices
まとめ
アプリの設定が変わる
• Autoconfigureで自動設定
• Starterで依存関係解決
アプリのデプロイが変わる
• 実行可能jar + 外部プロパティ
• Herokuボタン
システムアーキテクチャも変わる?
• モノリシックアーキテクチャ
• マイクロサービスアーキテクチャ
まとめ
アプリの設定が変わる
• Autoconfigureで自動設定
• Starterで依存関係解決
アプリのデプロイが変わる
• 実行可能jar + 外部プロパティ
• Herokuボタン
システムアーキテクチャも変わる?
• モノリシックアーキテクチャ
• マイクロサービスアーキテクチャ
_人人人人人人人人人人人人人人_	
 
> SIerの皆様は使えないかも <	
 
 ̄Y^Y^Y^Y^Y^Y^Y^Y^Y^Y^Y^Y^Y ̄
最後に
これからのレガシーJavaアプリ
•JSP
•web.xml
•src/main/webapp
使ったら負け!
移行の際の注意
• Bean定義ファイルの内容を”
そのまま移植”してはいけない
• JSP、warなど踏襲してはいけ
ない
Grails3のベースにもなる
http://www.slideshare.net/danveloper/future-of-grails
Scala、Kotlinでも普通に使えます
https://github.com/making/jggug-workshop-
springboot/tree/bookmark-scala
https://github.com/making/spring-boot-
demo-jvm-languages
色々なJVM言語でHello World
ハンズオンアプリのScala版
まずはハンズオンから
Webブラウザ
curl
Tomcat
Spring Boot
Spring Framework
SpringSecurity
ThymeLeaf
SpringMVC
Jackson
SpringDataJPA
Hibernate
H2
Database画面のあるアプリ
REST API
http://www.slideshare.net/
makingx/grails-30-spring-boot
ご清聴有り難うございました
Spring Boot本出版されたら買ってください!

More Related Content

What's hot

Amazon Cognito使って認証したい?それならSpring Security使いましょう!
Amazon Cognito使って認証したい?それならSpring Security使いましょう!Amazon Cognito使って認証したい?それならSpring Security使いましょう!
Amazon Cognito使って認証したい?それならSpring Security使いましょう!
Ryosuke Uchitate
 
ユニットテストの保守性を作りこむ, xpjugkansai2011
ユニットテストの保守性を作りこむ, xpjugkansai2011ユニットテストの保守性を作りこむ, xpjugkansai2011
ユニットテストの保守性を作りこむ, xpjugkansai2011
H Iseri
 

What's hot (20)

Spring超入門-Springと出会ってから1年半-
Spring超入門-Springと出会ってから1年半-Spring超入門-Springと出会ってから1年半-
Spring超入門-Springと出会ってから1年半-
 
さくっと理解するSpring bootの仕組み
さくっと理解するSpring bootの仕組みさくっと理解するSpring bootの仕組み
さくっと理解するSpring bootの仕組み
 
Spring bootでweb セキュリティ(ログイン認証)編
Spring bootでweb セキュリティ(ログイン認証)編Spring bootでweb セキュリティ(ログイン認証)編
Spring bootでweb セキュリティ(ログイン認証)編
 
これからSpringを使う開発者が知っておくべきこと
これからSpringを使う開発者が知っておくべきことこれからSpringを使う開発者が知っておくべきこと
これからSpringを使う開発者が知っておくべきこと
 
【Spring fest 2019】徹底解剖Spring MVCアーキテクチャー
【Spring fest 2019】徹底解剖Spring MVCアーキテクチャー【Spring fest 2019】徹底解剖Spring MVCアーキテクチャー
【Spring fest 2019】徹底解剖Spring MVCアーキテクチャー
 
Spring bootでweb ユニットテスト編
Spring bootでweb ユニットテスト編Spring bootでweb ユニットテスト編
Spring bootでweb ユニットテスト編
 
Spring Boot × Vue.jsでSPAを作る
Spring Boot × Vue.jsでSPAを作るSpring Boot × Vue.jsでSPAを作る
Spring Boot × Vue.jsでSPAを作る
 
ドメイン駆動設計のための Spring の上手な使い方
ドメイン駆動設計のための Spring の上手な使い方ドメイン駆動設計のための Spring の上手な使い方
ドメイン駆動設計のための Spring の上手な使い方
 
GraalVM の概要と、Native Image 化によるSpring Boot 爆速化の夢
GraalVM の概要と、Native Image 化によるSpring Boot 爆速化の夢GraalVM の概要と、Native Image 化によるSpring Boot 爆速化の夢
GraalVM の概要と、Native Image 化によるSpring Boot 爆速化の夢
 
今さら聞けないDiとspring
今さら聞けないDiとspring今さら聞けないDiとspring
今さら聞けないDiとspring
 
マーブル図で怖くないRxJS
マーブル図で怖くないRxJSマーブル図で怖くないRxJS
マーブル図で怖くないRxJS
 
SpringBootTest入門
SpringBootTest入門SpringBootTest入門
SpringBootTest入門
 
Amazon Cognito使って認証したい?それならSpring Security使いましょう!
Amazon Cognito使って認証したい?それならSpring Security使いましょう!Amazon Cognito使って認証したい?それならSpring Security使いましょう!
Amazon Cognito使って認証したい?それならSpring Security使いましょう!
 
Java ORマッパー選定のポイント #jsug
Java ORマッパー選定のポイント #jsugJava ORマッパー選定のポイント #jsug
Java ORマッパー選定のポイント #jsug
 
Spring Boot の Web アプリケーションを Docker に載せて AWS ECS で動かしている話
Spring Boot の Web アプリケーションを Docker に載せて AWS ECS で動かしている話Spring Boot の Web アプリケーションを Docker に載せて AWS ECS で動かしている話
Spring Boot の Web アプリケーションを Docker に載せて AWS ECS で動かしている話
 
async/await のしくみ
async/await のしくみasync/await のしくみ
async/await のしくみ
 
ドメイン駆動設計 本格入門
ドメイン駆動設計 本格入門ドメイン駆動設計 本格入門
ドメイン駆動設計 本格入門
 
DDD x CQRS 更新系と参照系で異なるORMを併用して上手くいった話
DDD x CQRS   更新系と参照系で異なるORMを併用して上手くいった話DDD x CQRS   更新系と参照系で異なるORMを併用して上手くいった話
DDD x CQRS 更新系と参照系で異なるORMを併用して上手くいった話
 
SPAセキュリティ入門~PHP Conference Japan 2021
SPAセキュリティ入門~PHP Conference Japan 2021SPAセキュリティ入門~PHP Conference Japan 2021
SPAセキュリティ入門~PHP Conference Japan 2021
 
ユニットテストの保守性を作りこむ, xpjugkansai2011
ユニットテストの保守性を作りこむ, xpjugkansai2011ユニットテストの保守性を作りこむ, xpjugkansai2011
ユニットテストの保守性を作りこむ, xpjugkansai2011
 

Viewers also liked

Seasar2で作った俺たちのサービスの今
Seasar2で作った俺たちのサービスの今Seasar2で作った俺たちのサービスの今
Seasar2で作った俺たちのサービスの今
Koichi Sakata
 

Viewers also liked (6)

Spring Boot in Action
Spring Boot in Action Spring Boot in Action
Spring Boot in Action
 
Building a Spring Boot Application - Ask the Audience!
Building a Spring Boot Application - Ask the Audience!Building a Spring Boot Application - Ask the Audience!
Building a Spring Boot Application - Ask the Audience!
 
Spring boot introduction
Spring boot introductionSpring boot introduction
Spring boot introduction
 
Microservices with Java, Spring Boot and Spring Cloud
Microservices with Java, Spring Boot and Spring CloudMicroservices with Java, Spring Boot and Spring Cloud
Microservices with Java, Spring Boot and Spring Cloud
 
Seasar2で作った俺たちのサービスの今
Seasar2で作った俺たちのサービスの今Seasar2で作った俺たちのサービスの今
Seasar2で作った俺たちのサービスの今
 
Microservice With Spring Boot and Spring Cloud
Microservice With Spring Boot and Spring CloudMicroservice With Spring Boot and Spring Cloud
Microservice With Spring Boot and Spring Cloud
 

Similar to Spring Bootで変わる Javaアプリ開発! #jsug

Spring Frameworkの今 (2013年版) #jjug_ccc #ccc_r17 #springframework
Spring Frameworkの今 (2013年版) #jjug_ccc #ccc_r17 #springframeworkSpring Frameworkの今 (2013年版) #jjug_ccc #ccc_r17 #springframework
Spring Frameworkの今 (2013年版) #jjug_ccc #ccc_r17 #springframework
Toshiaki Maki
 
Spring Bootキャンプ @関ジャバ #kanjava_sbc
Spring Bootキャンプ @関ジャバ #kanjava_sbcSpring Bootキャンプ @関ジャバ #kanjava_sbc
Spring Bootキャンプ @関ジャバ #kanjava_sbc
Toshiaki Maki
 
Ec cube開発合宿 プラグインセミナー
Ec cube開発合宿 プラグインセミナーEc cube開発合宿 プラグインセミナー
Ec cube開発合宿 プラグインセミナー
Ayumu Kawaguchi
 
Jenkinsプラグイン開発
Jenkinsプラグイン開発Jenkinsプラグイン開発
Jenkinsプラグイン開発
Takahisa Wada
 

Similar to Spring Bootで変わる Javaアプリ開発! #jsug (20)

どこよりも早い Spring Boot 1.2 解説 #渋谷Java
どこよりも早い Spring Boot 1.2 解説 #渋谷Javaどこよりも早い Spring Boot 1.2 解説 #渋谷Java
どこよりも早い Spring Boot 1.2 解説 #渋谷Java
 
REST with Spring Boot #jqfk
REST with Spring Boot #jqfkREST with Spring Boot #jqfk
REST with Spring Boot #jqfk
 
Spring Frameworkの今 (2013年版) #jjug_ccc #ccc_r17 #springframework
Spring Frameworkの今 (2013年版) #jjug_ccc #ccc_r17 #springframeworkSpring Frameworkの今 (2013年版) #jjug_ccc #ccc_r17 #springframework
Spring Frameworkの今 (2013年版) #jjug_ccc #ccc_r17 #springframework
 
Grails 3.0先取り!? Spring Boot入門ハンズオン #jggug_boot
Grails 3.0先取り!? Spring Boot入門ハンズオン #jggug_bootGrails 3.0先取り!? Spring Boot入門ハンズオン #jggug_boot
Grails 3.0先取り!? Spring Boot入門ハンズオン #jggug_boot
 
Head toward Java 16 (Night Seminar Edition)
Head toward Java 16 (Night Seminar Edition)Head toward Java 16 (Night Seminar Edition)
Head toward Java 16 (Night Seminar Edition)
 
Spring native について
Spring native についてSpring native について
Spring native について
 
Spring Bootキャンプ @関ジャバ #kanjava_sbc
Spring Bootキャンプ @関ジャバ #kanjava_sbcSpring Bootキャンプ @関ジャバ #kanjava_sbc
Spring Bootキャンプ @関ジャバ #kanjava_sbc
 
JSUG勉強会 2018年その5 Spring I/O 報告会
JSUG勉強会 2018年その5 Spring I/O 報告会JSUG勉強会 2018年その5 Spring I/O 報告会
JSUG勉強会 2018年その5 Spring I/O 報告会
 
WildFly Swarm - Rightsize Your Java EE Apps
WildFly Swarm - Rightsize Your Java EE AppsWildFly Swarm - Rightsize Your Java EE Apps
WildFly Swarm - Rightsize Your Java EE Apps
 
React を導入した フロントエンド開発
React を導入したフロントエンド開発React を導入したフロントエンド開発
React を導入した フロントエンド開発
 
第4回REST勉強会 RequireJS編
第4回REST勉強会 RequireJS編第4回REST勉強会 RequireJS編
第4回REST勉強会 RequireJS編
 
20160521 大規模映像配信サービスの Java8による全面リニューアルの裏側
20160521 大規模映像配信サービスの Java8による全面リニューアルの裏側20160521 大規模映像配信サービスの Java8による全面リニューアルの裏側
20160521 大規模映像配信サービスの Java8による全面リニューアルの裏側
 
ルーター自前実装の話
ルーター自前実装の話ルーター自前実装の話
ルーター自前実装の話
 
Ec cube開発合宿 プラグインセミナー
Ec cube開発合宿 プラグインセミナーEc cube開発合宿 プラグインセミナー
Ec cube開発合宿 プラグインセミナー
 
Javaと小道具
Javaと小道具Javaと小道具
Javaと小道具
 
Jenkinsプラグイン開発
Jenkinsプラグイン開発Jenkinsプラグイン開発
Jenkinsプラグイン開発
 
React+TypeScriptもいいぞ
React+TypeScriptもいいぞReact+TypeScriptもいいぞ
React+TypeScriptもいいぞ
 
【Camphor ×サイボウズ】selenium勉強会
【Camphor ×サイボウズ】selenium勉強会【Camphor ×サイボウズ】selenium勉強会
【Camphor ×サイボウズ】selenium勉強会
 
jvmlang.daitokai 1.0.0 MinCamlJを作ってみた
jvmlang.daitokai 1.0.0 MinCamlJを作ってみたjvmlang.daitokai 1.0.0 MinCamlJを作ってみた
jvmlang.daitokai 1.0.0 MinCamlJを作ってみた
 
JobStreamerではじめるJavaBatchのクラウド分散実行
JobStreamerではじめるJavaBatchのクラウド分散実行JobStreamerではじめるJavaBatchのクラウド分散実行
JobStreamerではじめるJavaBatchのクラウド分散実行
 

More from Toshiaki Maki

マイクロサービスに必要な技術要素はすべてSpring Cloudにある #DO07
マイクロサービスに必要な技術要素はすべてSpring Cloudにある #DO07マイクロサービスに必要な技術要素はすべてSpring Cloudにある #DO07
マイクロサービスに必要な技術要素はすべてSpring Cloudにある #DO07
Toshiaki Maki
 
実例で学ぶ、明日から使えるSpring Boot Tips #jsug
実例で学ぶ、明日から使えるSpring Boot Tips #jsug実例で学ぶ、明日から使えるSpring Boot Tips #jsug
実例で学ぶ、明日から使えるSpring Boot Tips #jsug
Toshiaki Maki
 

More from Toshiaki Maki (20)

From Spring Boot 2.2 to Spring Boot 2.3 #jsug
From Spring Boot 2.2 to Spring Boot 2.3 #jsugFrom Spring Boot 2.2 to Spring Boot 2.3 #jsug
From Spring Boot 2.2 to Spring Boot 2.3 #jsug
 
Concourse x Spinnaker #concourse_tokyo
Concourse x Spinnaker #concourse_tokyoConcourse x Spinnaker #concourse_tokyo
Concourse x Spinnaker #concourse_tokyo
 
Serverless with Spring Cloud Function, Knative and riff #SpringOneTour #s1t
Serverless with Spring Cloud Function, Knative and riff #SpringOneTour #s1tServerless with Spring Cloud Function, Knative and riff #SpringOneTour #s1t
Serverless with Spring Cloud Function, Knative and riff #SpringOneTour #s1t
 
決済システムの内製化への旅 - SpringとPCFで作るクラウドネイティブなシステム開発 #jsug #sf_h1
決済システムの内製化への旅 - SpringとPCFで作るクラウドネイティブなシステム開発 #jsug #sf_h1決済システムの内製化への旅 - SpringとPCFで作るクラウドネイティブなシステム開発 #jsug #sf_h1
決済システムの内製化への旅 - SpringとPCFで作るクラウドネイティブなシステム開発 #jsug #sf_h1
 
Spring Boot Actuator 2.0 & Micrometer #jjug_ccc #ccc_a1
Spring Boot Actuator 2.0 & Micrometer #jjug_ccc #ccc_a1Spring Boot Actuator 2.0 & Micrometer #jjug_ccc #ccc_a1
Spring Boot Actuator 2.0 & Micrometer #jjug_ccc #ccc_a1
 
Spring Boot Actuator 2.0 & Micrometer
Spring Boot Actuator 2.0 & MicrometerSpring Boot Actuator 2.0 & Micrometer
Spring Boot Actuator 2.0 & Micrometer
 
Open Service Broker APIとKubernetes Service Catalog #k8sjp
Open Service Broker APIとKubernetes Service Catalog #k8sjpOpen Service Broker APIとKubernetes Service Catalog #k8sjp
Open Service Broker APIとKubernetes Service Catalog #k8sjp
 
Spring Cloud Function & Project riff #jsug
Spring Cloud Function & Project riff #jsugSpring Cloud Function & Project riff #jsug
Spring Cloud Function & Project riff #jsug
 
Introduction to Spring WebFlux #jsug #sf_a1
Introduction to Spring WebFlux #jsug #sf_a1Introduction to Spring WebFlux #jsug #sf_a1
Introduction to Spring WebFlux #jsug #sf_a1
 
BOSH / CF Deployment in modern ways #cf_tokyo
BOSH / CF Deployment in modern ways #cf_tokyoBOSH / CF Deployment in modern ways #cf_tokyo
BOSH / CF Deployment in modern ways #cf_tokyo
 
Why PCF is the best platform for Spring Boot
Why PCF is the best platform for Spring BootWhy PCF is the best platform for Spring Boot
Why PCF is the best platform for Spring Boot
 
Zipkin Components #zipkin_jp
Zipkin Components #zipkin_jpZipkin Components #zipkin_jp
Zipkin Components #zipkin_jp
 
マイクロサービスに必要な技術要素はすべてSpring Cloudにある #DO07
マイクロサービスに必要な技術要素はすべてSpring Cloudにある #DO07マイクロサービスに必要な技術要素はすべてSpring Cloudにある #DO07
マイクロサービスに必要な技術要素はすべてSpring Cloudにある #DO07
 
Spring Framework 5.0による Reactive Web Application #JavaDayTokyo
Spring Framework 5.0による Reactive Web Application #JavaDayTokyoSpring Framework 5.0による Reactive Web Application #JavaDayTokyo
Spring Framework 5.0による Reactive Web Application #JavaDayTokyo
 
実例で学ぶ、明日から使えるSpring Boot Tips #jsug
実例で学ぶ、明日から使えるSpring Boot Tips #jsug実例で学ぶ、明日から使えるSpring Boot Tips #jsug
実例で学ぶ、明日から使えるSpring Boot Tips #jsug
 
Spring ❤️ Kotlin #jjug
Spring ❤️ Kotlin #jjugSpring ❤️ Kotlin #jjug
Spring ❤️ Kotlin #jjug
 
Event Driven Microservices with Spring Cloud Stream #jjug_ccc #ccc_ab3
Event Driven Microservices with Spring Cloud Stream #jjug_ccc #ccc_ab3Event Driven Microservices with Spring Cloud Stream #jjug_ccc #ccc_ab3
Event Driven Microservices with Spring Cloud Stream #jjug_ccc #ccc_ab3
 
Managing your Docker image continuously with Concourse CI
Managing your Docker image continuously with Concourse CIManaging your Docker image continuously with Concourse CI
Managing your Docker image continuously with Concourse CI
 
Data Microservices with Spring Cloud Stream, Task, and Data Flow #jsug #spri...
Data Microservices with Spring Cloud Stream, Task,  and Data Flow #jsug #spri...Data Microservices with Spring Cloud Stream, Task,  and Data Flow #jsug #spri...
Data Microservices with Spring Cloud Stream, Task, and Data Flow #jsug #spri...
 
Short Lived Tasks in Cloud Foundry #cfdtokyo
Short Lived Tasks in Cloud Foundry #cfdtokyoShort Lived Tasks in Cloud Foundry #cfdtokyo
Short Lived Tasks in Cloud Foundry #cfdtokyo
 

Recently uploaded

Recently uploaded (8)

Hyperledger Fabricコミュニティ活動体験& Hyperledger Fabric最新状況ご紹介
Hyperledger Fabricコミュニティ活動体験& Hyperledger Fabric最新状況ご紹介Hyperledger Fabricコミュニティ活動体験& Hyperledger Fabric最新状況ご紹介
Hyperledger Fabricコミュニティ活動体験& Hyperledger Fabric最新状況ご紹介
 
情報を表現するときのポイント
情報を表現するときのポイント情報を表現するときのポイント
情報を表現するときのポイント
 
ネットワーク可視化 振る舞い検知(NDR)ご紹介_キンドリル202405.pdf
ネットワーク可視化 振る舞い検知(NDR)ご紹介_キンドリル202405.pdfネットワーク可視化 振る舞い検知(NDR)ご紹介_キンドリル202405.pdf
ネットワーク可視化 振る舞い検知(NDR)ご紹介_キンドリル202405.pdf
 
LoRaWAN無位置ロープ型水漏れセンサー WL03A-LB/LSカタログ ファイル
LoRaWAN無位置ロープ型水漏れセンサー WL03A-LB/LSカタログ ファイルLoRaWAN無位置ロープ型水漏れセンサー WL03A-LB/LSカタログ ファイル
LoRaWAN無位置ロープ型水漏れセンサー WL03A-LB/LSカタログ ファイル
 
LoRaWAN無位置ロープ式水漏れセンサーWL03A 日本語マニュアル
LoRaWAN無位置ロープ式水漏れセンサーWL03A 日本語マニュアルLoRaWAN無位置ロープ式水漏れセンサーWL03A 日本語マニュアル
LoRaWAN無位置ロープ式水漏れセンサーWL03A 日本語マニュアル
 
Keywordmap overview material/CINC.co.ltd
Keywordmap overview material/CINC.co.ltdKeywordmap overview material/CINC.co.ltd
Keywordmap overview material/CINC.co.ltd
 
2024年5月17日 先駆的科学計算フォーラム2024 機械学習を用いた新たなゲーム体験の創出の応用
2024年5月17日 先駆的科学計算フォーラム2024 機械学習を用いた新たなゲーム体験の創出の応用2024年5月17日 先駆的科学計算フォーラム2024 機械学習を用いた新たなゲーム体験の創出の応用
2024年5月17日 先駆的科学計算フォーラム2024 機械学習を用いた新たなゲーム体験の創出の応用
 
MPAなWebフレームワーク、Astroの紹介 (その1) 2024/05/17の勉強会で発表されたものです。
MPAなWebフレームワーク、Astroの紹介 (その1) 2024/05/17の勉強会で発表されたものです。MPAなWebフレームワーク、Astroの紹介 (その1) 2024/05/17の勉強会で発表されたものです。
MPAなWebフレームワーク、Astroの紹介 (その1) 2024/05/17の勉強会で発表されたものです。
 

Spring Bootで変わる Javaアプリ開発! #jsug