Spring Frameworkの今 (2013年版) #jjug_ccc #ccc_r17 #springframework
-
Upload
toshiaki-maki -
Category
Technology
-
view
11.387 -
download
14
Transcript of Spring Frameworkの今 (2013年版) #jjug_ccc #ccc_r17 #springframework
R1-7 [BOF] Spring Frameworkの今
(2013年版)JJUG CCC Fall 2013
2013/11/09 槙 俊明 (@making)
自己紹介• @making
• 大手SIerでR&D
• JJUG幹事
• 金魚本(http://amzn.to/JavaEE6)を一部翻訳
• http://blog.ik.am
• 公私ともにSpringユーザー
[宣伝] はじめてのBootstrap• なぜか畑違いのBootstrap3入門の本書きました
• 11月末 工学社より出版(1900円)
今日のコンテンツ• Spring Frameworkとは
• 最近のSpring Ecosystemを紹介
• Spring 4の紹介
• Spring FrameworkによるWebアプリのアーキテクチャ
• Spring Framework or Java EE ?
今日のコンテンツ前半:最新動向の話
後半:エンタープライズ寄りな話?
• Spring Frameworkとは
• 最近のSpring Ecosystemを紹介
• Spring 4の紹介
• Spring FrameworkによるWebアプリのアーキテクチャ
• Spring Framework or Java EE ?
Spring Frameworkとは
Spring Frameworkとは• Javaでエンタープライズ開発するためのオープンソースのフルスタックフレームワーク
• 2013年 開発元VMWare → Pivotalにスピンアウト
• 2013年 Springの象徴であるRob Jonsonが退社→TypeSafeへ
• 安定バージョンは現在3.2.5
Spring Frameworkとは• DI x AOPで注目され、重厚なJ2EEのアンチテーゼとして2004年に登場
!
!
• Web(MVC), DataAccess, Security, Batch, Integration, Mobile, …
• サブプロジェクトが増え、Java EEより肥大化?
Spring Frameworkとは
• (基本的な)後方互換性
• 一貫性、対称性のある設計ポリシーこれ重要!
そしてVersion 4へ
•現在Spring4開発中
• 4.0.0.RC1公開
• Java8, Java EE 7サポート(WebSocket等)
Springは今も進化中
Pivotalとは
• 割愛
STSから簡単にサンプルを試せる
Spring Ecosystemの紹介
Spring Ecosystem
Web
Core
DataAccess Batch Enterprise Integration
Security
IDE
RAD Starter
Social
Spring MVC
Spring WebFlow
Spring Mobile
Spring Roo
Spring Data JPA
Spring DataMongoDB
Spring Boot
Spring Tool Suite (STS)
Spring SocialTwitter
Spring SocialFacebook
Spring SocialGithub
Big Data
Spring Data Rest
Spring Batch Spring Integration
Spring DI Spring AOP
Spring Security
Spring SecurityOAuth
Spring XD
Spring TX
Spring Hadoop
Spring Ecosystem
Web
Core
DataAccess Batch Enterprise Integration
Security
IDE
RAD Starter
Social
Spring MVC
Spring WebFlow
Spring Mobile
Spring Roo
Spring Data JPA
Spring DataMongoDB
Spring Boot
Spring Tool Suite (STS)
Spring SocialTwitter
Spring SocialFacebook
Spring SocialGithub
Big Data
Spring Data Rest
Spring Batch Spring Integration
Spring DI Spring AOP
Spring Security
Spring Security OAuth
Spring TX
今日のスコープ
Spring XD Spring Hadoop
[参考] 公式のスタック図
http://spring.io/docs
Spring DI x AOP
• 成熟度:★★★ version: 3.2.5.RELEASE
• Spring Ecosystemのコア
• JavaConfigサポート(@Configuration, @Bean)
• No XML hell!
• JSR-330サポート(@Inject, @Named)
JSR-330によるDI コード例
package sample;import javax.inject.Inject;!public class MyApplication { @Inject GreetingService service; public void run(String message) { System.out.println(service.hello(message)); }}
package sample;import javax.inject.Named;!@Namedpublic class GreetingService { public String hello(String message) { return "Hello " + message + "!"; }}
JSR-330によるDI コード例
デフォルトでscope=singleton になるので注意
public class EntryPoint { public static void main(String[] args) { try (GenericApplicationContext context = new AnnotationConfigApplicationContext( AppConfig.class);) { MyApplication app = context.getBean(MyApplication.class); app.run("World!"); } }}
@Configuration@ComponentScan(basePackages = "sample")public class AppConfig { @Bean MyApplication myApplication() { return new MyApplication(); }} Google Guiceよりも簡単!
Spring MVC•成熟度:★★★ version: 3.2.4.RELEASE
•アクションベースな簡易なMVC Webフレームワーク
•Strutsからの移行も容易
•アノテーションで簡単リクエストマッピング(JAX-RSとほとんど同じ)
•ControllerとViewが奇麗に分離されるので、色々な出力形式に対応
•RESTもサポート(@RequestBody, @ResponseBody)
•JavaConfigサポート(web.xmlもなくせる)
@Service @Transactionalpublic class UserServiceImpl implements UserService { @Inject UserRepository userRepository;! @Override public List<User> findAll() { return userRepository.findAll(); }! @Override public void save(User user) { userRepository.save(user); }}
@Controller@RequestMapping("users")public class UserController { @Inject UserService userService;! @RequestMapping(value = "list", method = RequestMethod.GET) public String list(Model model) { List<User> users = userService.findAll(); model.addAttribute("users", users); return "users/list"; }}
コード例
Spring MVCの Controller
コード例<bean id="viewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver"> <property name="prefix" value="/WEB-INF/views/" /> <property name="suffix" value=".jsp" /></bean>
<table> <tr> <th>Name</th><th>Email</th> </tr> <c:forEach items="${users}" var="user"> <tr> <td><c:out value="${user.name}"></c:out></td> <td><c:out value="${user.email}"></c:out></td> </tr> </c:forEach></table>
XMLの例を出したが、 JavaConfigでも書ける
コード例(REST版)@Controller @RequestMapping("users")public class UserRestController { @Inject UserService userService;! @RequestMapping(method = RequestMethod.GET) @ResponseBody public List<User> getUsers() { return userService.findAll(); }! @RequestMapping(method = RequestMethod.POST) @ResponseBody public ResponseEntity<User> postUsers(@RequestBody User user) { userService.save(user); return new ResponseEntity<User>(user, HttpStatus.CREATED); }! @RequestMapping(value = "/{id}", method = RequestMethod.GET) @ResponseBody public User getUser(@PathVariable("id") Integer id) { return userService.findOne(id); }}
実行結果
いろいろなViewに対応• Tiles, FreeMarker, Velocityなどの老舗テンプレートエンジンから最近人気のものまで各種取り揃えております。
• ThymeLeaf (ThymeLeafViewResolver)
• Mustache (MustacheViewResolver)
• Handlebars (HandlebarsViewResolver)
• Scalate (ScalateViewResolver)
ThymeLeaf
<table> <tr> <th>Name</th> <th>Email</th> </tr> <tr th:each="user : ${users}"> <td th:text="${user.name}">John</td> <td th:text="${user.email}">[email protected]</td> </tr></table>
<bean class="org.thymeleaf.spring3.view.ThymeleafViewResolver"> <property name="templateEngine" ref="templateEngine" /></bean>!<bean id="templateEngine" class="org.thymeleaf.spring3.SpringTemplateEngine"> <property name="templateResolver" ref="templateResolver" /></bean>!<bean id="templateResolver" class="org.thymeleaf.templateresolver.ServletContextTemplateResolver"> <property name="prefix" value="/WEB-INF/templates/" /> <property name="suffix" value=".html" /> <property name="templateMode" value="HTML5" /></bean>
http://www.thymeleaf.org/
Mustache
<table> <tr> <th>Name</th> <th>Email</th> </tr> {{#users}} <tr> <td>{{name}}</td> <td>{{email}}</td> </tr> {{/users}}</table>
<bean class="org.springframework.web.servlet.view.mustache.MustacheViewResolver"> <property name="prefix" value="/WEB-INF/templates/" /> <property name="suffix" value=".html" /> <property name="templateLoader"> <bean class="org.springframework.web.servlet.view.mustache.MustacheTemplateLoader" /> </property></bean>
http://mustache.github.io/
Handlebars
<bean class="com.github.jknack.handlebars.springmvc.HandlebarsViewResolver"> <property name="prefix" value="/WEB-INF/templates/" /> <property name="suffix" value=".hbs" /></bean>
http://handlebarsjs.com/
<table> <tr> <th>Name</th> <th>Email</th> </tr> {{#users}} <tr> <td>{{name}}</td> <td>{{email}}</td> </tr> {{/users}}</table>
Spring Security•成熟度:★★★ version: 3.1.4.RELEASE
•設定ファイルベースの認証・認可フレームワーク
•カスタマイズ性も高い
•Form認証、Basic認証、JAAS認証、OpenID認証、LDAP認証、CAS認証・・・
•ユーザー情報は、DB、メモリ、設定ファイル・・・から
•URL認可、アノテーションでメソッド認可、JSPタグ認可
•パスワードエンコード
•SHA-2+ソルト+ストレッチのような汎用アルゴリズムだけでなくBCryptのようなパスワード用アルゴリズムもサポート(BCrypt推奨)
•3.2からJavaConfigサポート
コード例
•割愛・・
Spring Security OAuth•成熟度:★☆☆ version: 1.0.5.RELEASE
•Spring SecurityにOAuth1, 2による認証・認可機能を追加
•OAuth Provider •grant_type=authorization_code,implicit,refresh_token,client_credentials, passwordの認証サーバーを設定ファイルのみで実現
•OAuth Client •REST Clientの拡張
コード例
• 時間がないので略・・
ドキュメント http://projects.spring.io/spring-security-oauth/docs/oauth2.htmlサンプルアプリhttps://github.com/spring-projects/spring-security-oauth/tree/
master/samples/oauth2
Spring Data•成熟度:★★☆
•データアクセスの抽象化ライブラリ
•オブジェクトマッピング、Repository、Templateを提供
•いろいろなデータストアをサポートするサブプロジェクトからなる
•Spring Data Commons •Spring Data JPA •Spring Data MongoDB, Redis, Neo4j, REST, Hadoop, HBase, Solr, ...
•各データストアにRepositoryやTemplateを提供してBoilerplateをなくす
従来のJPAプログラミング
毎回同じようなコード・・・→
@Entitypublic class Customer { @Id @GeneratedValue private Long id; private String firstname; private String lastname; // omitted…}
@Repositorypublic class CustomerRepository { @PersistenceContext EntityManager em; public Customer findOne(Long id) { return em.find(Customer.class, id); } public List<Customer> findAll(int page, int size) { TypedQuery<Customer> query = em .createQuery("SELECT x FROM Customer x", Customer.class) .setFirstResult(page * size).setMaxResults(size); return query.getResultList(); } @Transactional public Customer save(Customer customer) { if (customer.getId() == null) { em.persist(customer); return customer; } else { return em.merge(customer); } } public List<Customer> findByLastname(String lastname) { TypedQuery<Customer> query = em.createQuery( "SELECT x FROM Customer x WHERE x.lastname = :lastname", Customer.class).setParameter("lastname", lastname); return query.getResultList(); }}
Spring Data JPAを使うと・・
• たったこれだけ!
• CRUD系のメソッド、ページング・ソート処理は自動で実装される
• JPAプログラミングの簡素化!
import org.springframework.data.jpa.repository.JpaRepository;import org.springframework.data.jpa.repository.Query;import org.springframework.data.repository.query.Param;!public interface CustomerRepository extends JpaRepository<Customer, Long> { @Query("SELECT x FROM Customer x WHERE x.lastname = :lastname") public List<Customer> findByLastname(@Param("lastname") String lastname);}
Spring Data REST• 成熟度:★☆☆ version: 1.1.0.M1
• Spring DataのRepositoryをREST APIにエクスポート(@RestResource)
• 現在はSpringMVCのみサポートしていrが、将来的にはServlet非依存を目指している
• HypermediaLinkの作成
コード例Repositoryにアノテーションをつけるだけで
REST APIとしてExportされる
実行結果
Entityの情報だけでなく HypermediaLinkも出力される
Spring Boot•成熟度:☆☆☆ version: 0.5.0-M5
•Springアプリケーションを高速に開発して起動するためのプロジェクト?
•スタンドアローンでアプリケーションを起動できる(java -jar)
•サーバー組み込み。Traditionalなwar作成も可能
•Groovyも対応
•オススメ設定のautoconfigure群
•色々なpreconfiguredなJavaConfigが用意されており、特定の条件を満たすと読み込まれる
コード例import org.springframework.boot.SpringApplication;import org.springframework.boot.autoconfigure.EnableAutoConfiguration;import org.springframework.stereotype.Controller;import org.springframework.web.bind.annotation.RequestMapping;import org.springframework.web.bind.annotation.ResponseBody;!@Controller@EnableAutoConfigurationpublic class Application {! @RequestMapping("/") @ResponseBody String home() { return "HelloWorld!"; }! public static void main(String[] args) { SpringApplication.run(Application.class, args); }}
速習 Spring Boot$ brew tap pivotal/tap $ brew install springboot $ which spring /usr/local/bin/spring $ spring run app.groovy
// app.groovy@Controllerclass Application { @RequestMapping("/") @ResponseBody def String hoge() { "HelloWorld!" }}
初回のみ for Macユーザー
ソースコード全文。import文不要
Spring 4
25分経過?
4.0.0.RC1の新機能• Java 8サポート
• WebSocketサポート
• さらなるRESTサポート
Java 8サポート• Lamada式サポート
• JSR-310サポート(@DateTimeFormat)
Lambdaサポート@InjectJdbcTemplate jdbcTemplate;!public void foo() { User user = jdbcTemplate.queryForObject( "SELECT userId, userName from User", new RowMapper<User>() { public User mapRow(java.sql.ResultSet rs, int rowNum) throws java.sql.SQLException { return new User(rs.getLong(1), rs.getString(2)); } } ); }
Before
Lambdaサポート@InjectJdbcTemplate jdbcTemplate;!public void foo() { User user = jdbcTemplate.queryForObject( "SELECT userId, userName from User", new RowMapper<User>() { public User mapRow(java.sql.ResultSet rs, int rowNum) throws java.sql.SQLException { return new User(rs.getLong(1), rs.getString(2)); } } ); }
Before
After
Lambdaサポート@InjectJdbcTemplate jdbcTemplate;!public void foo() { User user = jdbcTemplate.queryForObject( "SELECT userId, userName from User", new RowMapper<User>() { public User mapRow(java.sql.ResultSet rs, int rowNum) throws java.sql.SQLException { return new User(rs.getLong(1), rs.getString(2)); } } ); }
Before
After
Lambdaサポート@InjectJdbcTemplate jdbcTemplate;!public void foo() { User user = jdbcTemplate.queryForObject( "SELECT userId, userName from User", new RowMapper<User>() { public User mapRow(java.sql.ResultSet rs, int rowNum) throws java.sql.SQLException { return new User(rs.getLong(1), rs.getString(2)); } } ); }
Before
After
SpringにはTemplateパターン+コールバックな機能が多いのでラムダ式の恩恵が大きい!
JSR-310サポート
WebSocketサポート• JSR-356
• Java EE 7に取り込まれる!
•先日Tomcat7も対応しました(7.0.47)
•今日ハンズオンもありましたね
JSR-356
import javax.websocket.OnMessage;import javax.websocket.server.ServerEndpoint;!@ServerEndpoint("/echo")public class EchoEndpoint {! @OnMessage public String echoText(String name) { return name; }}
JSR-356
import javax.websocket.OnMessage;import javax.websocket.server.ServerEndpoint;!@ServerEndpoint("/echo")public class EchoEndpoint {! @OnMessage public String echoText(String name) { return name; }} 一見簡単そう
だがしかし• Rossen Stoyanchev氏(Spring MVCのメイン開発者)曰く
• http://rstoyanchev.github.io/s2gx2013-intro-websocket-spring-framework-4/
• http://rstoyanchev.github.io/s2gx2013-websocket-browser-apps-with-spring
http://rstoyanchev.github.io/s2gx2013-intro-websocket-spring-framework-4/#29
http://rstoyanchev.github.io/s2gx2013-intro-websocket-spring-framework-4/#30
SpringによるWebSocket対応
• JSR-356だけじゃなく、Tomcat、Jetty独自実装にも対応
• WebSocketだけでなくレガシーブラウザでもfallbackできるようにSockJSに対応
• ハイレベルなメッセージング仕様のSTOMPに対応Simple Text Oriented Message Protocol
http://stomp.github.io/
Simpleな例(JSR-356版)
import javax.inject.Inject;import javax.websocket.OnMessage;import javax.websocket.server.ServerEndpoint;!import org.springframework.web.socket.server.endpoint.SpringConfigurator;!@ServerEndpoint(value = "/echo", configurator = SpringConfigurator.class)public class EchoEndpoint { @Inject EchoService echoService;! @OnMessage public String echoText(String name) { return echoService.getMessage(name); }}
Simpleな例(JSR-356版)
import javax.inject.Inject;import javax.websocket.OnMessage;import javax.websocket.server.ServerEndpoint;!import org.springframework.web.socket.server.endpoint.SpringConfigurator;!@ServerEndpoint(value = "/echo", configurator = SpringConfigurator.class)public class EchoEndpoint { @Inject EchoService echoService;! @OnMessage public String echoText(String name) { return echoService.getMessage(name); }}
JSR-356の拡張ポイント (Tomcatでも動く!)
Simpleな例(JSR-356非依存版)
import org.springframework.web.socket.TextMessage;import org.springframework.web.socket.WebSocketSession;import org.springframework.web.socket.adapter.TextWebSocketHandlerAdapter;!public class EchoWebSocketHandler extends TextWebSocketHandlerAdapter {! @Inject private EchoService echoService;! @Override public void handleTextMessage(WebSocketSession session, TextMessage message) throws Exception { String echoMessage = echoService.getMessage(message.getPayload()); session.sendMessage(new TextMessage(echoMessage)); }}
Simpleな例(JSR-356非依存版)の設定ファイル
@Configuration@EnableWebMvc@EnableWebSocketpublic class WebConfig extends WebMvcConfigurerAdapter implements WebSocketConfigurer { @Override public void registerWebSocketHandlers(WebSocketHandlerRegistry registry) { registry.addHandler(echoWebSocketHandler(), "/echo"); // ... } @Bean public WebSocketHandler echoWebSocketHandler() { return new EchoWebSocketHandler(); } // ...}
Simpleな例(JSR-356非依存版)の設定ファイル
@Configuration@EnableWebMvc@EnableWebSocketpublic class WebConfig extends WebMvcConfigurerAdapter implements WebSocketConfigurer { @Override public void registerWebSocketHandlers(WebSocketHandlerRegistry registry) { registry.addHandler(echoWebSocketHandler(), "/echo"); // ... } @Bean public WebSocketHandler echoWebSocketHandler() { return new PerConnectionWebSocketHandler(EchoWebSocketHandler.class); } // ...} Decorationパターンを使える
SockJSサポート
@Configuration@EnableWebMvc@EnableWebSocketpublic class WebConfig extends WebMvcConfigurerAdapter implements WebSocketConfigurer { @Override public void registerWebSocketHandlers(WebSocketHandlerRegistry registry) { registry.addHandler(echoWebSocketHandler(), "/echo").withSockJS(); // ... } @Bean public WebSocketHandler echoWebSocketHandler() { return new EchoWebSocketHandler(); } // ...}
ちょい足し
SockJSクライアントvar ws = new SockJS("ws://localhost:8080/echo");!ws.onopen = function (event) { // ...};!ws.onmessage = function (event) { // ...};!ws.onclose = function (event) { // ...};
STOMP• WebSocket上のメッセージングプロトコル
Destination
Body
Command
STOMP対応
import org.springframework.messaging.handler.annotation.MessageMapping;import org.springframework.messaging.handler.annotation.SendTo;import org.springframework.stereotype.Controller;!@Controllerpublic class GreetingController {! @MessageMapping("/greeting") @SendTo("/topic/greetings") public String greet(String greeting) { return "[" + new Date().getTime() + "]: " + greeting; }}
普通のHTTPからのpushできるimport javax.inject.Inject;!import org.springframework.messaging.simp.SimpMessagingTemplate;import org.springframework.stereotype.Controller;import org.springframework.web.bind.annotation.RequestMapping;import org.springframework.web.bind.annotation.RequestMethod;!@Controllerpublic class GreetingController { @Inject SimpMessagingTemplate template;! @RequestMapping(value = "/greeting", method = RequestMethod.POST) public void greet(String greeting) { String text = "[" + new Date().getTime() + "]: " + greeting; template.convertAndSend("/topic/greeting", text); }}
HTTP用処理とSTOMP用処理の共存
import org.springframework.messaging.handler.annotation.MessageMapping;import org.springframework.stereotype.Controller;import org.springframework.web.bind.annotation.RequestMapping;import org.springframework.web.bind.annotation.RequestMethod;!@Controllerpublic class GreetingController {! @RequestMapping(value = "/greeting", method = RequestMethod.POST) public void httpGreet(String text) { // HTTP用の処理 }! @MessageMapping(value = "/greeting") public void stompGreet(String text) { // STOMP用の処理 }}
HTTP用処理とSTOMP用処理の共存
import org.springframework.messaging.handler.annotation.MessageMapping;import org.springframework.stereotype.Controller;import org.springframework.web.bind.annotation.RequestMapping;import org.springframework.web.bind.annotation.RequestMethod;!@Controllerpublic class GreetingController {! @RequestMapping(value = "/greeting", method = RequestMethod.POST) public void httpGreet(String text) { // HTTP用の処理 }! @MessageMapping(value = "/greeting") public void stompGreet(String text) { // STOMP用の処理 }}
WebSocketにもSpring MVCが使える
@RequestMappingから想起しやすい
Springの良いところ
• WebSocketにもSpring MVCが使える
• → 一貫性のある設計
• @RequestMappingから想起しやすい
• → 対称性のある設計
続きはWebで!
http://rstoyanchev.github.io/s2gx2013-websocket-browser-apps-with-spring
サンプル• https://github.com/rstoyanchev/spring-websocket-
portfolio
http://assets.spring.io/wp/WebSocketBlogPost.html
さらなるRESTサポート
• @RestController
• AsyncRestTemplate
• Hypermedia Link
今後は• JMS 2.0
• JTA 1.2
• JPA 2.1
• Bean Validation 1.1
• JSR-236 Concurrency Utilities
• JSR-107 JCache
• をサポートする予定!
Spring Frameworkによる Webアプリのアーキテクチャ
35分経過?
Springによる伝統的なWebアプリ
Spring MVC
Spring Security
Browser/Client
UI & Presentation Layer
Service Layer Persistence Layer
DB
Spring (Tx) Spring Data JPA
JPA
Spring DI x AOP
Bean Validation
最近のWebアプリ
Spring MVC Spring Spring Data JPA
Spring DI x AOP
JPABean Validation
最近のWebアプリ
Spring MVC
JavaScript Framework (Backbone.js, Angular.js, Knockout.js, …)
Spring Spring Data JPAJPA
Router
View
Template
Model/Collection
REST API
Spring DI x AOP
Bean Validation
最近のWebアプリ
Spring MVC
JavaScript Framework (Backbone.js, Angular.js, Knockout.js, …)
Spring Spring Data JPAJPA
Router
View
Template
Model/Collection
REST API
Spring DI x AOP
Rich化するクライアントサイド
Bean Validation
Thin化するサーバーサイド
Webアプリの雛形を使ってQuick Start
• http://bit.ly/SpringTemplate
• STSのproject template機能でアプリの雛形生成
• Spring MVC + Spring Data JPA + Spring Security + Bootstrap3を使用したCRUDアプリが1分でできます(※ダウンロード時間除く)
STS 3.3.0まででしか動かなかった・・
• 最新のSTS 3.4.0ではTemplateを作れません
• うちに帰ってMaven Archetype作ります・・・
Spring Framework or Java EE
40分経過?
Springによる伝統的なWebアプリ
Spring MVC
Spring Security
Browser/Client
UI & Presentation Layer
Service Layer Persistence Layer
DB
Spring (Tx) Spring Data JPA
JPA
Spring DI x AOP
Bean Validation
Java EEによる伝統的なWebアプリ
JSF
Apache Shiro?
Browser/Client
UI & Presentation Layer
Service Layer Persistence Layer
DB
EJB JPA
CDI and DI (JSR 299, 330)
JAX-RS
Bean Validation
Springによる最近のWebアプリ
Spring MVC
JavaScript Framework (Backbone.js, Angular.js, Knockout.js, …)
Spring Spring Data JPAJPA
Router
View
Template
Model/Collection
REST API
Spring DI x AOP
Bean Validation
ちなみに・・・• http://blog.ik.am ぼくのブログもこのアーキテクチャ
Browser
BackBone.js
http://blog.ik.am/#/entries/193 参照
Spring MVC
REST API GET /entries/xxx
{“entry_id”:”xxx”,”content”:”Hello”}
Java EEによる最近のWebアプリ
JAX-RS
JavaScript Framework (Backbone.js, Angular.js, Knockout.js, …)
EJB JPA
Router
View
Template
Model/Collection
REST API
CDI and DI (JSR 299, 330)
Bean Validation
Java EEによる最近のWebアプリ
JAX-RS
JavaScript Framework (Backbone.js, Angular.js, Knockout.js, …)
EJB JPA
Router
View
Template
Model/Collection
REST API
CDI and DI (JSR 299, 330)
Bean Validation
Java EEでもできるんです
アーキテクチャの違い
• Spring FrameworkでもJava EEでもアーキテクチャに大きな違いはない
• アーキテクチャ的にはどちらを選んでもよい
アーキテクチャの違い
• Spring FrameworkでもJava EEでもアーキテクチャに大きな違いはない
• アーキテクチャ的にはどちらを選んでもよい → Java標準に従った方が良い?
既存Springユーザーはどうするか?
•いつJava EEに移行するの?
いつやるの?
いつやるの?
•今でじゃない
新規Javaユーザーは?
• 正直、Java EE 7で開発すれば良いかな、と思う。
新規Javaユーザーは?
• 正直、Java EE 7で開発すれば良いかな、と思う。
OracleによるGlassFish4の商用サポートは なくなったのでご注意ください!
だれがこれからSpringを使う?• すでにSpring(古いバージョン)を利用しているユーザー
• Springに関するノウハウがあれば、技術の連続性を考えて、まだSpringを使い続けると良いと思う。
ただし、Springは新しいバージョン(3.2.x)で 正しい使い方をしましょう 単なるjarのupdateだけならNG
Springの不安• Pivotalが将来Springに対する投資を縮小したとしたら、Springを支えるエンジニアが離れ、開発が停滞するかもしれない。
こういう心配のあるかたはJava EEをオススメします!
Spring FrameworkからJava EEへ
• 今後のWebアプリケーションはThin Server化し、サーバーサイドはREST APIベースになっていく?
• Spring MVCでREST APIを開発するスタイルからJAX-RSで開発するスタイルへ移行していけばよい?
Spring FrameworkからJava EEへ
• もしくはJAX-RSの拡張仕様としてアクションベースのフレームワークがSpring MVCベースで策定されれば統一されるだろう・・(Springも徐々にJSR対応している)
• Bean Validation (JSR 303)
• DI (JSR 330)
• JBatch (JSR 352)
• WebSocket (JSR 356) など・・・
Java EEの課題• 1つ1つの仕様(JSF, JAX-RS, EJB, JPA, …)が独立・完結しているため、組み合わせる際に重複する機能が多い
• 新機能が発表されてから商用利用できるまでに時間がかかる
• 組み合わせのベストプラクティスがわかりにくい→ Spring Frameworkはベストプラクティス化が進んでいる(書籍や意味のあるサンプルなど)
Spring Framework or Java EE個人的まとめ
Javaを使っている
今Springを使って
いるSpring
の将来に不安なし
新しい機能を使いたい
Java EE Spring
Spring以外のJavaフレームワークにもあてはまるフロー
だと思う
YES
NO
アーキテクチャ選定のアンチパターン• 中途半端なフレームワーク組み合わせ (Spring + JAX-RS(Jersey)など)
• コア(DI)にSpring Frameworkを採用するなら、Springで統一
• Java EEを選択するなら標準仕様で組み合わせるべき
• Bridge(連携ライブラリ)が存在すると、いくつかの問題が起こる
• 機能が制限される
• バージョンアップしづらくなる
• 学習コストが高い
まさかのSpring特需?
• 本発表で興味をもっていただけば幸いです
Springを触ってみたいけど・・
• どこから始めれば良いかわからない・・・
• 日本語情報が少ない・・・
• 業務でつかえるの・・・?
そんなあなたに耳寄りな情報!
宣伝
•近日中(あと2人月くらい・・)にSpring Frameworkのベストプラクティスガイドライン(日本語、英語)をGithubで公開予定
宣伝•業務でSpring Frameworkを使うためのノウハウを公開しちゃいます
•アプリケーションのレイヤー化と各レイヤーの実装方法
• DBアクセス
•入力チェック
•例外ハンドリング
•ロギング
•メッセージ管理
•ファイルアップロード
•・・・・ 多分公開する
まとめ
• Springはまだまだ進化中
• Bootstrap3本がでたら買ってください!