Grails from scratch to prod - MixIT 2010

519 views

Published on

Slides of my talk at the Mix-IT

Published in: Technology
  • Be the first to comment

  • Be the first to like this

Grails from scratch to prod - MixIT 2010

  1. 1. Grails, from scratch to prod<br />… plus vite !<br />MAURY Aurélien<br />Consultant Xebia<br />Email : amaury@xebia.fr<br />Twitter : @aurelienmaury<br />LinkedIn : http://fr.linkedin.com/in/aurelienmaury<br />Blog : http://blog.xebia.fr<br />
  2. 2.
  3. 3. Qu'est-ce que Grails ?<br />
  4. 4. Qu'est-ce que Grails ?<br />Framework d'application web complet<br />MVC, basé sur le langage Groovy<br />Inspiré de RoR, Django, TurboGears<br />Adapté à la culture Java<br />Bâti sur le roc<br />Stack éprouvée : Spring, Hibernate, Tomcat<br />
  5. 5. Buts<br />Pile application web Java standard<br />Fournir un niveau d'abstraction en plus<br />Réduire la complexité<br />En outillant l'existant<br />Augmenter la productivité<br />En scriptant les tâches répétitives<br />
  6. 6. Approche<br />Convention over configuration<br />Principe de "défaut raisonnable"<br />Don'trepeatyourself<br />Structure imposée pour réduire les duplications<br />Plateforme complète<br />Méthodologie et approche fournies<br />
  7. 7. Histoire<br />Janvier 2007<br />Sortie de Groovy 1.0<br />Février 2008<br />Sortie de Grails 1.0<br />Novembre 2008<br />SpringSource rachète G2One<br />
  8. 8. Rock Stars<br />Guillaume Laforge(@glaforge)<br />Leader Groovy chez SpringSource<br />Graeme Rocher (@graemerocher)<br />Leader Grails chez SpringSource<br />
  9. 9. Comment ça marche ?<br />
  10. 10. Plateforme complète<br />
  11. 11. Simplifié par Groovy<br />Syntaxe allégée<br />Accessible à tous les développeurs Java<br />Closures, Collections, Gpars, …<br />L'essayer c'est l'adopter<br />Scripts de génération de code<br />Facilement extensible<br />
  12. 12. Développement rapide<br />Test<br />Code<br />Fix<br />create<br />run<br />war<br />
  13. 13. Support IDE<br />Intellij IDEA<br />Eclipse STS<br />Netbeans<br />
  14. 14. $ grailscreate-appbookstore<br />
  15. 15. Structure d'un projet<br />bookstore<br />|_grails-app<br />| |_conf => BootStraping, Datasources, UrlMappings<br />| |_controllers<br />| |_domain<br />| |_i18n => messages.properties internationalisés<br />| |_services<br />| |_taglib<br />| |_utils<br />| |_views => Groovy Server Pages<br />|_lib => Dépendances Java<br />|_scripts<br />|_src<br />| |_groovy<br />| |_java<br />|_test<br />|_web-app => Ressources statiques: images, JS, CSS, etc<br />
  16. 16. Scaffolding<br />Génération de CRUD à partir des entités<br />Economie de temps<br />Popularisé par Ruby on Rails<br />Orienté schéma base de données<br />Adopté par Grails<br />Orienté domaine<br />
  17. 17. Scaffolding<br />grailscreate-domain-class<br />grailscreate-controller<br />grailscreate-service<br />grailsgenerate-all<br />
  18. 18. Scaffolding<br />
  19. 19. Scaffolding<br />grailsgenerate-allorg.bookstore.Book<br />BookController<br />BookControllerTest<br />grails-app/views/book/list.gsp<br />grails-app/views/book/show.gsp<br />grails-app/views/book/edit.gsp<br />grails-app/views/book/create.gsp<br />
  20. 20. Scaffolding dynamique<br />class BookController {<br />def index = {…}<br />deflist = {…}<br />defcreate = {…}<br />defsave = {…}<br />def show = {…}<br />defedit = {…}<br />def update = {…}<br />defdelete = {…}<br />}<br />class BookController {<br />defscaffold = true<br />}<br />
  21. 21. GORM : Mapping<br />class Book {<br /> String title<br />staticbelongsTo = [author: Author]<br />statichasMany = [chapters: Chapters]<br />staticconstraints = {<br />titlenullable:false<br /> }<br />}<br />
  22. 22. GORM : Requêtage<br />Book.list(sort: 'title', order: 'asc')<br />Book.getAll(37, 41, 43)<br />Book.findByTitleLike("Harry P%")<br />Book.withCriteria {<br />eq('title', 'Harry Potter') <br />author {<br />like('Rowli%')<br /> }<br />}<br />
  23. 23. GORM : Requêtage<br />class Book {<br />staticnamedQueries = {<br />withPotterInTitle {<br />like 'title', '%Potter%'<br /> }<br /> }<br />}<br />Book.withPotterInTitle.list()<br />
  24. 24. Vues<br />Groovy Server Pages<br />HTML + Taglibgroovy<br />Assemblage par Sitemesh<br />Commandé par tags GSP<br />Taglib Grails (Prototype pour le JS)<br />Formulaires, AJAX<br />
  25. 25. Vues : exemples<br /><g:formRemotename="myForm" <br /> on404="alert('not found!')" <br /> update="updateMe" // onSuccess="jsFunc"<br /> url="[action:'show']"> <br />Login: <input name="login" type="text"></input><br /></g:formRemote><br /><div id="updateMe">thisdivisupdated by the form</div><br />fieldRemote, remoteFunction<br />
  26. 26. Vues : exemples<br /><g:each var="book" in="${books}"> <br /> <p>Title: ${book.title}</p> <br /> <p>Author: ${book.author}</p><br /></g:each><br />if, else, formatDate, sortableColumn, datePicker, … <br />
  27. 27. Contrôleurs<br />grailscreate-controllerorg.bookstore.Book<br />Génère un contrôlleur coquille<br />Injection de dépendance<br />defleNomDeMonServiceen attribut de classe<br />Helpers<br />render as JSON, render as XML<br />
  28. 28. Contrôleurs : exemple<br />class AuthorController {<br />defspringSecurityService<br />deflist = {<br /> [ authorInstanceList: Author.list(), authorInstanceTotal: Author.count() ]<br /> }<br />}<br />
  29. 29. Configuration : dépendances<br />grails.project.dependency.resolution = {<br />repositories {<br />grailsPlugins()<br />grailsHome()<br />grailsCentral()<br />mavenLocal()<br />mavenCentral()<br />mavenRepo "http://snapshots.repository.codehaus.org"<br /> }<br />dependencies {<br />runtime 'mysql:mysql-connector-java:5.1.13'<br /> }<br />}<br />
  30. 30. Configuration : environnements<br />environments {<br />development {<br />dataSource {<br />dbCreate = "create-drop"<br /> url = "jdbc:hsqldb:mem:devDB" } }<br /> test { dataSource { … } }<br /> production { dataSource { … } }<br />}<br />
  31. 31. Environnements<br />grailsrun-app => dev<br />grails test run-app => test<br />grailstest-app => test<br />grailswar => production<br />
  32. 32. Extensible<br />Dépôt de plugins centralisé<br />grailsinstall-plugin …<br />spring-security-core<br />spring-security-ui<br />quartz<br />codenarc<br />mongodb<br />spock<br />…<br />
  33. 33. Très extensible<br />app-engine(GORM en mode JPA)<br />groovy-plus-plus<br />jquery<br />searchable<br />gwt<br />feeds<br />birt-report<br />…<br />ou : grailscreate-pluginmonPlugin<br />
  34. 34. Extensible<br />Plugin Grails == Application Grails<br />
  35. 35. Questions fréquemment posées<br />
  36. 36. Intégration continue ?<br />
  37. 37. Est-ce performant ?<br />Overhead Groovy : x5-7<br />Utilisez Groovy++ (x3-5)<br />Productivité contre vitesse d'exécution<br />Pas de compile check ? Pas grave.<br />Optimisations Java<br />"src/java" ou librairies<br />
  38. 38. Et la courbe d'apprentissage ?<br />Groovy s'apprend vite<br />Bases ~ 2 jours, Courant ~ 1 mois<br />Pièges, GORM Gotchas<br />Dans l'ensemble, rien ne bloque longtemps<br />Au delà de la carrosserie<br />Sur le Tao de Grails, la stack tu maîtriseras<br />
  39. 39. La communauté est-elle active ?<br />7 versions mineures en 1 an<br />~ 60 Users Group sur la planète<br />~ 800 repositoryGitHub autour de Grails<br />~ 2500 mails par mois sur les ML<br />
  40. 40. Y a-t-il du support ?<br />
  41. 41. Dans quels cas utiliser Grails ?<br />Minimum Viable Product rapide<br />Du prototype au produit en douceur<br />Reprise d'une application existante<br />IHM Web rapide, intégration existant en librairie<br />Tout nouveau projet d'appli web<br />En toute simplicité <br />
  42. 42. Success stories<br />
  43. 43. Bibliothèque<br />
  44. 44. Linkothèque<br />Groovy home<br />http://groovy.codehaus.org/<br />Grails home<br />http://www.grails.org<br />Grails plugins<br />http://www.grails.org/plugins/<br />An army of solipsists (thisweek in Grails)<br />http://burtbeckwith.com/blog/<br />
  45. 45. Questions ?<br />
  46. 46. Merci à touset bon appétit<br />

×