Spring Frameworkの今 (2013年版) #jjug_ccc #ccc_r17 #springframework

13,327 views
13,034 views

Published on

Published in: Technology, Education
1 Comment
44 Likes
Statistics
Notes
No Downloads
Views
Total views
13,327
On SlideShare
0
From Embeds
0
Number of Embeds
13
Actions
Shares
0
Downloads
119
Comments
1
Likes
44
Embeds 0
No embeds

No notes for slide

Spring Frameworkの今 (2013年版) #jjug_ccc #ccc_r17 #springframework

  1. 1. R1-7 [BOF] Spring Frameworkの今 (2013年版) JJUG CCC Fall 2013 2013/11/09 槙 俊明 (@making)
  2. 2. 自己紹介 • @making • 大手SIerでR&D • JJUG幹事 • 金魚本(http://amzn.to/JavaEE6)を一部翻訳 • http://blog.ik.am • 公私ともにSpringユーザー
  3. 3. [宣伝] はじめてのBootstrap • なぜか畑違いのBootstrap3入門の本書きました • 11月末 工学社より出版(1900円)
  4. 4. Java EEも好きです! http://www.slideshare.net/makingx
  5. 5. 今日のコンテンツ • Spring Frameworkとは • 最近のSpring Ecosystemを紹介 • Spring 4の紹介 • Spring FrameworkによるWebアプリ のアーキテクチャ • Spring Framework or Java EE ?
  6. 6. 今日のコンテンツ 前半:最新動向の話 • Spring Frameworkとは • 最近のSpring Ecosystemを紹介 • Spring 4の紹介 • Spring FrameworkによるWebアプリ 後半:エンタープライズ寄りな話? のアーキテクチャ • Spring Framework or Java EE ?
  7. 7. Spring Frameworkとは
  8. 8. Spring Frameworkとは • Javaでエンタープライズ開発するためのオープン ソースのフルスタックフレームワーク • 2013年 開発元VMWare → Pivotalにスピンアウト • 2013年 Springの象徴であるRob Jonsonが退社 →TypeSafeへ • 安定バージョンは現在3.2.5
  9. 9. Spring Frameworkとは • DI x AOPで注目され、重厚なJ2EEのアンチテー ゼとして2004年に登場 ! ! • Web(MVC), DataAccess, Security, Batch, Integration, Mobile, … • サブプロジェクトが増え、Java EEより肥大化?
  10. 10. Spring Frameworkとは • (基本的な)後方互換性 • 一貫性、対称性のある設計ポリシー これ重要!
  11. 11. そしてVersion 4へ • 現在Spring4開発中 • 4.0.0.RC1公開 • Java8, Java EE 7サポート (WebSocket等)
  12. 12. Springは今も進化中
  13. 13. Pivotalとは • 割愛
  14. 14. http://spring.io 公式サイトが リニューアル!
  15. 15. http://spring.io/guides サンプルアプリ 学習コンテンツ 多数 (40件)!
  16. 16. STSから簡単にサンプルを試せる
  17. 17. 基本的な内容は書籍で http://bit.ly/Spring3Book
  18. 18. Spring Ecosystemの紹介
  19. 19. Spring Ecosystem IDE Spring Tool Suite (STS) RAD Starter Spring Roo Web Spring XD Spring WebFlow Spring Security OAuth Spring MVC Spring Security Social Big Data Security Spring Data Rest Spring Mobile Spring Boot DataAccess Spring Hadoop Batch Spring Data MongoDB Spring Data JPA Spring Batch Enterprise Integration Spring Integration Core Spring DI Spring AOP Spring TX Spring Social Github Spring Social Facebook Spring Social Twitter
  20. 20. Spring Ecosystem 今日のスコープ IDE Spring Tool Suite (STS) RAD Starter Spring Boot Spring Roo Web Spring XD Spring Data Rest Spring WebFlow Spring Security OAuth Spring MVC Spring Security Spring Mobile Social Big Data Security DataAccess Spring Hadoop Batch Spring Data MongoDB Spring Data JPA Spring Batch Enterprise Integration Spring Integration Core Spring DI Spring AOP Spring TX Spring Social Github Spring Social Facebook Spring Social Twitter
  21. 21. [参考] 公式のスタック図
  22. 22. http://spring.io/docs
  23. 23. Spring DI x AOP • 成熟度:★★★ version: 3.2.5.RELEASE • Spring Ecosystemのコア • JavaConfigサポート(@Configuration, @Bean) • • No XML hell! JSR-330サポート(@Inject, @Named)
  24. 24. JSR-330によるDI コード例 package sample; import javax.inject.Named; ! @Named public class GreetingService { public String hello(String message) { return "Hello " + message + "!"; } } package sample; import javax.inject.Inject; ! public class MyApplication { @Inject GreetingService service; public void run(String message) { System.out.println(service.hello(message)); } }
  25. 25. JSR-330によるDI コード例 @Configuration @ComponentScan(basePackages = "sample") public class AppConfig { @Bean MyApplication myApplication() { return new MyApplication(); } } デフォルトでscope=singleton になるので注意 Google Guiceよりも簡単! 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!"); } } }
  26. 26. Spring MVC • 成熟度:★★★ version: 3.2.4.RELEASE • アクションベースな簡易なMVC Webフレームワーク • Strutsからの移行も容易 • アノテーションで簡単リクエストマッピング(JAX-RSとほとんど同 じ) • ControllerとViewが奇麗に分離されるので、色々な出力形式に対応 • RESTもサポート(@RequestBody, @ResponseBody) • JavaConfigサポート(web.xmlもなくせる)
  27. 27. コード例 @Controller @RequestMapping("users") public class UserController { @Inject UserService userService; ! } Spring MVCの Controller @RequestMapping(value = "list", method = RequestMethod.GET) public String list(Model model) { List<User> users = userService.findAll(); model.addAttribute("users", users); return "users/list"; } @Service @Transactional public class UserServiceImpl implements UserService { @Inject UserRepository userRepository; ! @Override public List<User> findAll() { return userRepository.findAll(); } } @Override public void save(User user) { userRepository.save(user); } !
  28. 28. コード例 <bean id="viewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver"> <property name="prefix" value="/WEB-INF/views/" /> <property name="suffix" value=".jsp" /> </bean> XMLの例を出したが、 <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> JavaConfigでも書ける
  29. 29. コード例(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); }
  30. 30. 実行結果
  31. 31. いろいろなViewに対応 • Tiles, FreeMarker, Velocityなどの老舗テンプレートエン ジンから最近人気のものまで各種取り • ThymeLeaf (ThymeLeafViewResolver) • Mustache (MustacheViewResolver) • Handlebars (HandlebarsViewResolver) • Scalate (ScalateViewResolver) えております。
  32. 32. http://www.thymeleaf.org/ ThymeLeaf <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> <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}">hoge@example.com</td> </tr> </table>
  33. 33. http://mustache.github.io/ Mustache <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> <table> <tr> <th>Name</th> <th>Email</th> </tr> {{#users}} <tr> <td>{{name}}</td> <td>{{email}}</td> </tr> {{/users}} </table>
  34. 34. http://handlebarsjs.com/ Handlebars <bean class="com.github.jknack.handlebars.springmvc.HandlebarsViewResolver"> <property name="prefix" value="/WEB-INF/templates/" /> <property name="suffix" value=".hbs" /> </bean> <table> <tr> <th>Name</th> <th>Email</th> </tr> {{#users}} <tr> <td>{{name}}</td> <td>{{email}}</td> </tr> {{/users}} </table>
  35. 35. Spring Security • 成熟度:★★★ version: 3.1.4.RELEASE • 設定ファイルベースの認証・認可フレームワーク • カスタマイズ性も高い • Form認証、Basic認証、JAAS認証、OpenID認証、LDAP認証、CAS認証・・・ • ユーザー情報は、DB、メモリ、設定ファイル・・・から • URL認可、アノテーションでメソッド認可、JSPタグ認可 • パスワードエンコード • SHA-2+ソルト+ストレッチのような汎用アルゴリズムだけでなくBCryptのよ うなパスワード用アルゴリズムもサポート(BCrypt推奨) • 3.2からJavaConfigサポート
  36. 36. コード例 • 割愛・・
  37. 37. 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の拡張
  38. 38. コード例 • 時間がないので略・・ ドキュメント http://projects.spring.io/spring-security-oauth/docs/oauth2.html サンプルアプリhttps://github.com/spring-projects/spring-security-oauth/tree/ master/samples/oauth2
  39. 39. Spring Data • 成熟度:★★☆ • データアクセスの抽象化ライブラリ • オブジェクトマッピング、Repository、Templateを提供 • いろいろなデータストアをサポートするサブプロジェクトからなる • Spring Data Commons • Spring Data JPA • Spring Data MongoDB, Redis, Neo4j, REST, Hadoop, HBase, Solr, ... • 各データストアにRepositoryやTemplateを提供してBoilerplateをな くす
  40. 40. 従来のJPAプログラミング @Entity public class Customer { @Id @GeneratedValue private Long id; private String firstname; private String lastname; // omitted… } 毎回同じような コード・・・→ @Repository public 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(); } }
  41. 41. Spring Data 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); } • たったこれだけ! • CRUD系のメソッド、ページング・ソート処理は自動で 実装される • JPAプログラミングの簡素化!
  42. 42. Spring Data REST • 成熟度:★☆☆ version: 1.1.0.M1 • Spring DataのRepositoryをREST APIにエクス ポート(@RestResource) • 現在はSpringMVCのみサポートしていrが、将 来的にはServlet非依存を目指している • HypermediaLinkの作成
  43. 43. コード例 Repositoryにアノテーションをつけるだけで REST APIとしてExportされる
  44. 44. 実行結果 Entityの情報だけでなく HypermediaLinkも出力される
  45. 45. Spring Boot •成熟度:☆☆☆ version: 0.5.0-M5 •Springアプリケーションを高速に開発して起動するためのプロ ジェクト? •スタンドアローンでアプリケーションを起動できる(java -jar) •サーバー組み込み。Traditionalなwar作成も可能 •Groovyも対応 •オススメ設定のautoconfigure群 •色々なpreconfiguredなJavaConfigが用意されており、特定の 条件を満たすと読み込まれる
  46. 46. コード例 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 @EnableAutoConfiguration public class Application { ! @RequestMapping("/") @ResponseBody String home() { return "HelloWorld!"; } ! } public static void main(String[] args) { SpringApplication.run(Application.class, args); }
  47. 47. 速習 Spring Boot $ brew tap pivotal/tap $ brew install springboot $ which spring /usr/local/bin/spring $ spring run app.groovy // app.groovy @Controller class Application { @RequestMapping("/") @ResponseBody def String hoge() { "HelloWorld!" } } 初回のみ for Macユーザー ソースコード全文。import文不要
  48. 48. 25分経過? Spring 4
  49. 49. 4.0.0.RC1の新機能 • Java 8サポート • WebSocketサポート • さらなるRESTサポート
  50. 50. Java 8サポート • Lamada式サポート • JSR-310サポート(@DateTimeFormat)
  51. 51. Lambdaサポート @Inject JdbcTemplate jdbcTemplate; ! Before 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)); } } ); }
  52. 52. Lambdaサポート @Inject JdbcTemplate jdbcTemplate; ! Before 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)); } } ); } After
  53. 53. Lambdaサポート @Inject JdbcTemplate jdbcTemplate; ! Before 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)); } } ); } After
  54. 54. Lambdaサポート @Inject JdbcTemplate jdbcTemplate; ! Before 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)); } } ); } SpringにはTemplateパターン+ コールバックな機能が多いので ラムダ式の恩恵が大きい! After
  55. 55. JSR-310サポート
  56. 56. WebSocketサポート • JSR-356 • Java EE 7に取り込まれる! • 先日Tomcat7も対応しました(7.0.47) • 今日ハンズオンもありましたね
  57. 57. JSR-356 import javax.websocket.OnMessage; import javax.websocket.server.ServerEndpoint; ! @ServerEndpoint("/echo") public class EchoEndpoint { ! } @OnMessage public String echoText(String name) { return name; }
  58. 58. JSR-356 import javax.websocket.OnMessage; import javax.websocket.server.ServerEndpoint; ! @ServerEndpoint("/echo") public class EchoEndpoint { ! } @OnMessage public String echoText(String name) { return name; } 一見簡単そう
  59. 59. だがしかし • Rossen Stoyanchev氏(Spring MVCのメイン開発者)曰く • http://rstoyanchev.github.io/s2gx2013-introwebsocket-spring-framework-4/ • http://rstoyanchev.github.io/s2gx2013-websocketbrowser-apps-with-spring
  60. 60. http://rstoyanchev.github.io/s2gx2013intro-websocket-spring-framework-4/#29
  61. 61. http://rstoyanchev.github.io/s2gx2013intro-websocket-spring-framework-4/#30
  62. 62. SpringによるWebSocket対応 • JSR-356だけじゃなく、Tomcat、Jetty独自実装にも対応 • WebSocketだけでなくレガシーブラウザでもfallbackでき るようにSockJSに対応 • ハイレベルなメッセージング仕様のSTOMPに対応 Simple Text Oriented Message Protocol http://stomp.github.io/
  63. 63. 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); }
  64. 64. 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; JSR-356の拡張ポイント ! } @OnMessage public String echoText(String name) { return echoService.getMessage(name); } (Tomcatでも動く!)
  65. 65. 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)); }
  66. 66. Simpleな例(JSR-356非依存版)の 設定ファイル @Configuration @EnableWebMvc @EnableWebSocket public class WebConfig extends WebMvcConfigurerAdapter implements WebSocketConfigurer { @Override public void registerWebSocketHandlers(WebSocketHandlerRegistry registry) { registry.addHandler(echoWebSocketHandler(), "/echo"); // ... } @Bean public WebSocketHandler echoWebSocketHandler() { return new EchoWebSocketHandler(); } // ... }
  67. 67. Simpleな例(JSR-356非依存版)の 設定ファイル @Configuration @EnableWebMvc @EnableWebSocket public 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パターンを使える
  68. 68. SockJSサポート @Configuration @EnableWebMvc @EnableWebSocket public class WebConfig extends WebMvcConfigurerAdapter implements WebSocketConfigurer { @Override public void registerWebSocketHandlers(WebSocketHandlerRegistry registry) { registry.addHandler(echoWebSocketHandler(), "/echo").withSockJS(); // ... } @Bean public WebSocketHandler echoWebSocketHandler() { return new EchoWebSocketHandler(); } // ... } ちょい足し
  69. 69. SockJSクライアント var ws = new SockJS("ws://localhost:8080/echo"); ! ws.onopen = function (event) { // ... }; ! ws.onmessage = function (event) { // ... }; ! ws.onclose = function (event) { // ... };
  70. 70. STOMP • WebSocket上のメッセージングプロトコル Command Destination Body
  71. 71. STOMP対応 import org.springframework.messaging.handler.annotation.MessageMapping; import org.springframework.messaging.handler.annotation.SendTo; import org.springframework.stereotype.Controller; ! @Controller public class GreetingController { ! } @MessageMapping("/greeting") @SendTo("/topic/greetings") public String greet(String greeting) { return "[" + new Date().getTime() + "]: " + greeting; }
  72. 72. 普通のHTTPからのpushできる import javax.inject.Inject; ! import import import import org.springframework.messaging.simp.SimpMessagingTemplate; org.springframework.stereotype.Controller; org.springframework.web.bind.annotation.RequestMapping; org.springframework.web.bind.annotation.RequestMethod; ! @Controller public 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); }
  73. 73. HTTP用処理とSTOMP用処理の共存 import import import import org.springframework.messaging.handler.annotation.MessageMapping; org.springframework.stereotype.Controller; org.springframework.web.bind.annotation.RequestMapping; org.springframework.web.bind.annotation.RequestMethod; ! @Controller public class GreetingController { ! @RequestMapping(value = "/greeting", method = RequestMethod.POST) public void httpGreet(String text) { // HTTP用の処理 } ! @MessageMapping(value = "/greeting") public void stompGreet(String text) { // STOMP用の処理 } }
  74. 74. HTTP用処理とSTOMP用処理の共存 import import import import org.springframework.messaging.handler.annotation.MessageMapping; WebSocketにもSpring MVCが使える org.springframework.stereotype.Controller; org.springframework.web.bind.annotation.RequestMapping; org.springframework.web.bind.annotation.RequestMethod; ! @Controller public class GreetingController { ! @RequestMapping(value = "/greeting", method = RequestMethod.POST) public void httpGreet(String text) { // HTTP用の処理 } ! @MessageMapping(value = "/greeting") public void stompGreet(String text) { // STOMP用の処理 } } @RequestMappingから想起しやすい
  75. 75. Springの良いところ • WebSocketにもSpring MVCが使える • • → 一貫性のある設計 @RequestMappingから想起しやすい • → 対称性のある設計
  76. 76. 続きはWebで! http://rstoyanchev.github.io/s2gx2013-websocketbrowser-apps-with-spring
  77. 77. サンプル • https://github.com/rstoyanchev/spring-websocketportfolio http://assets.spring.io/wp/WebSocketBlogPost.html
  78. 78. さらなるRESTサポート • @RestController • AsyncRestTemplate • Hypermedia Link
  79. 79. 今後は • JMS 2.0 • JTA 1.2 • JPA 2.1 • Bean Validation 1.1 • JSR-236 Concurrency Utilities • JSR-107 JCache • をサポートする予定!
  80. 80. 35分経過? Spring Frameworkによる Webアプリのアーキテクチャ
  81. 81. Springによる伝統的なWebアプリ UI & Presentation Layer Service Layer Persistence Layer Spring DI x AOP Spring MVC Bean Validation Spring (Tx) Spring Data JPA JPA Spring Security DB Browser/Client
  82. 82. 最近のWebアプリ Spring DI x AOP Spring MVC Bean Validation Spring Spring Data JPA JPA
  83. 83. 最近のWebアプリ Spring DI x AOP Spring MVC Bean Validation Router Spring REST API Model/ Collection View Template JavaScript Framework (Backbone.js, Angular.js, Knockout.js, …) Spring Data JPA JPA
  84. 84. 最近のWebアプリ Spring DI x AOP Spring MVC Bean Validation Spring REST API Spring Data JPA JPA Thin化するサーバーサイド Router Model/ Collection View Template JavaScript Framework (Backbone.js, Angular.js, Knockout.js, …) Rich化するクライアントサイド
  85. 85. Webアプリの雛形を使ってQuick Start • http://bit.ly/SpringTemplate • STSのproject template機能でアプリの雛形生成 • Spring MVC + Spring Data JPA + Spring Security + Bootstrap3を使用したCRUDアプリが1分でできます
 (※ダウンロード時間除く)
  86. 86. STS 3.3.0まででしか動かなかった・・ • 最新のSTS 3.4.0ではTemplateを作れません • うちに帰ってMaven Archetype作ります・・・
  87. 87. 40分経過? Spring Framework or Java EE
  88. 88. Springによる伝統的なWebアプリ UI & Presentation Layer Service Layer Persistence Layer Spring DI x AOP Spring MVC Bean Validation Spring (Tx) Spring Data JPA JPA Spring Security DB Browser/Client
  89. 89. Java EEによる伝統的なWebアプリ UI & Presentation Layer Service Layer Persistence Layer CDI and DI (JSR 299, 330) JAX-RS JSF EJB JPA Bean Validation Apache Shiro? DB Browser/Client
  90. 90. Springによる最近のWebアプリ Spring DI x AOP Spring MVC Bean Validation Router Spring REST API Model/ Collection View Template JavaScript Framework (Backbone.js, Angular.js, Knockout.js, …) Spring Data JPA JPA
  91. 91. ちなみに・・・ • http://blog.ik.am ぼくのブログもこのアーキテクチャ REST API GET /entries/xxx BackBone.js Spring MVC Browser {“entry_id”:”xxx”,”content”:”Hello”} http://blog.ik.am/#/entries/193 参照
  92. 92. Java EEによる最近のWebアプリ CDI and DI (JSR 299, 330) JAX-RS Bean Validation Router EJB REST API Model/ Collection View Template JavaScript Framework (Backbone.js, Angular.js, Knockout.js, …) JPA
  93. 93. Java EEによる最近のWebアプリ CDI and DI (JSR 299, 330) JAX-RS Bean Validation Router EJB JPA REST API Model/ Collection View Template JavaScript Framework (Backbone.js, Angular.js, Knockout.js, …) Java EEでもできるんです
  94. 94. アーキテクチャの違い • Spring FrameworkでもJava EEでもアー キテクチャに大きな違いはない • アーキテクチャ的にはどちらを選んでも よい
  95. 95. アーキテクチャの違い • Spring FrameworkでもJava EEでもアー キテクチャに大きな違いはない • アーキテクチャ的にはどちらを選んでも よい → Java標準に従った方が良い?
  96. 96. 既存Springユーザーはどうするか? • いつJava EEに移行するの?
  97. 97. いつやるの?
  98. 98. いつやるの? •今でじゃない
  99. 99. 新規Javaユーザーは? • 正直、Java EE 7で開発すれば良いかな、と思う。
  100. 100. 新規Javaユーザーは? • 正直、Java EE 7で開発すれば良いかな、と思う。 OracleによるGlassFish4の商用サポートは なくなったのでご注意ください!
  101. 101. だれがこれからSpringを使う? • すでにSpring(古いバージョン)を利用しているユーザー • Springに関するノウハウがあれば、技術の連続性を考え て、まだSpringを使い続けると良いと思う。 ただし、Springは新しいバージョン(3.2.x)で 正しい使い方をしましょう 単なるjarのupdateだけならNG
  102. 102. Springの不安 • Pivotalが将来Springに対する投資を縮小したと したら、Springを支えるエンジニアが離れ、開発 が停滞するかもしれない。 こういう心配のあるかたはJava EEをオススメします!
  103. 103. Spring FrameworkからJava EEへ • 今後のWebアプリケーションはThin Server化し、サーバーサイドはREST API ベースになっていく? • Spring MVCでREST APIを開発するスタ イルからJAX-RSで開発するスタイルへ移 行していけばよい?
  104. 104. Spring FrameworkからJava EEへ • もしくはJAX-RSの拡張仕様としてアクションベースの フレームワークがSpring MVCベースで策定されれば統 一されるだろう・・(Springも徐々にJSR対応している) • Bean Validation (JSR 303) • DI (JSR 330) • JBatch (JSR 352) • WebSocket (JSR 356) など・・・
  105. 105. Java EEの課題 • 1つ1つの仕様(JSF, JAX-RS, EJB, JPA, …)が独立・完結 しているため、組み合わせる際に重複する機能が多い • 新機能が発表されてから商用利用できるまでに時間がか かる • 組み合わせのベストプラクティスがわかりにくい
 → Spring Frameworkはベストプラクティス化が進んで いる(書籍や意味のあるサンプルなど)
  106. 106. Spring Framework or Java EE個人的まとめ Javaを YES Spring以外のJavaフレーム ワークにもあてはまるフロー 使っている だと思う 今 NO Springを使って いる Spring の将来に不安な し 新しい機能 を使いたい Java EE Spring
  107. 107. アーキテクチャ選定のアンチパターン • 中途半端なフレームワーク組み合わせ (Spring + JAX-RS(Jersey)など) • • • コア(DI)にSpring Frameworkを採用するなら、Springで統一 Java EEを選択するなら標準仕様で組み合わせるべき Bridge(連携ライブラリ)が存在すると、いくつかの問題が起こる • 機能が制限される • バージョンアップしづらくなる • 学習コストが高い
  108. 108. まさかのSpring特需? • 本発表で興味をもっていただけば幸いです
  109. 109. Springを触ってみたいけど・・ • どこから始めれば良いかわからない・・・ • 日本語情報が少ない・・・ • 業務でつかえるの・・・?
  110. 110. そんなあなたに耳寄りな情報!
  111. 111. 宣伝 • 近日中(あと2人月くらい・・)に Spring Frameworkのベストプラク ティスガイドライン(日本語、英語) をGithubで公開予定
  112. 112. 宣伝 • 業務でSpring Frameworkを使うためのノウハウを公開しちゃいます • アプリケーションのレイヤー化と各レイヤーの実装方法 • DBアクセス • 入力チェック • 例外ハンドリング • ロギング • メッセージ管理 • ファイルアップロード • ・・・・ 多分公開する
  113. 113. まとめ • Springはまだまだ進化中 • Bootstrap3本がでたら買ってください!

×