Grails 2.0 - Nouveautés et retours d'expériences

| Manuel Boillod (Zenika) | Zenika |

Moins attendu que Spring 3.1, mais pourtant tellement lié, Grails 2.0 est sorti le 15 décembre 2011.

Mon équipe et moi-même étions impatients, car la sortie de cette version majeure était planifiée depuis plusieurs mois, mais sans cesse retardée pour attendre la release finale (GA) de spring 3.1. Cela fait en effet déjà deux mois que je travaille sur la bêta, puis les releases candidates, mais sortir un produit basé sur une RC, ce n’est pas sérieux.

Développeur Grails depuis trois ans, je vais vous détailler les nouveautés les plus marquantes de Grails 2.0 et de son écosystème en essayant d'aller un peu plus loin que ce qu'on peut trouver habituellement dans les RELEASES NOTES.

Pour réagir au contenu de cet article, un espace de dialogue vous est proposé sur le forum Commentez . ♪

- Titre : Grails 2.0 - Nouveautés et retours d'expériences

- Auteurs : Manuel Boillod (Zenika), Zenika

- Parution : 22 décembre 2011

- Licence : Copyright ® 2011 Manuel Boillod. Aucune reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents, images, etc. sans l'autorisation expresse de l'auteur. Sinon vous encourez selon la loi jusqu'à trois ans de prison et jusqu'à 300 000 € de dommages et intérêts.

Sommaire

- I. Upgrade des bibliothèques

- II. Vers le développement continu

- III. Du nouveau dans les ressources

- III-A. Utilisation de jquery

- III-B. Nouveau plugin resource inclus dans Grails

- IV. Du choix au niveau de la persistance

- IV-A. H2 à la place de HSQL

- IV-B. Des solutions avec GORM

- IV-C. Multidatasource

- V. La face cachée de l'iceberg

- VI. Les plugins !

- VI-A. Grails Market

- VI-B. Cloud Ready

- VII. L'IDE

- VIII. Mais encore

- IX. Finalement

- X. Remerciements

I - Upgrade des bibliothèques

On n'y échappe pas, c'est le cas à chaque version de Grails, les bibliothèques utilisées sont toujours mises à jour et on a le droit maintenant à Groovy 1.8, Spring 3.1 (ça on sait), Hibernate 3.6, Serlvet 3.0…

II - Vers le développement continu

Pour ce qui est du développement, Grails 2.0 propose un meilleur rechargement à chaud de nos modifications et permet donc de travailler plus longtemps sans redémarrer l'application.

Concrètement, les principales causes de redémarrage sont liées à des modifications des objets du domaine (le modèle de données), car même si elles sont généralement prises en compte à chaud, la reconstruction de la base de données vide les tables des données de test qui sont généralement ajoutées au lancement de l'application via la classe Boostrap.groovy.

Petit astuce au passage, le plugin fixture permet de gérer de façon élégante les données de tests, que ce soit pour votre application en mode développement ou pour vos tests (unitaire, intégration, fonctionnel) – http://grails.org/plugin/fixtures.

III - Du nouveau dans les ressources

III-A - Utilisation de jquery

Un des faits marquants de la version 2.0 est l'intégration par défaut de jquery à la place de prototype, mais derrière tout cela se cache une refonte complète de la gestion des ressources.

Le plugin jquery-ui complète d'ailleurs très bien l'intégration de jquery dans votre application.

III-B - Nouveau plugin resource inclus dans Grails

Grails vient avec de nouvelles balises <r:> qui optimisent la gestion des ressources (images, css, js…) en évitant les chargements multiples ou facilite la gestion du code JavaScript propre à chaque page.

Par exemple la balise <r:script> ajoute par défaut le contenu JavaScript en fin de page HTML pour améliorer le temps de chargement dans les navigateurs.

Note : c'est d'ailleurs un principe qu'on retrouve partout dans Grails, souvent sans s'en rendre compte, celui de mettre en place les meilleures pratiques à tous les niveaux de l'application.

Pour finir sur les ressources, ce nouveau système ouvre la voie à de nombreuses fonctionnalités telles que la compression des ressources, la gestion de bundle, etc.

IV - Du choix au niveau de la persistance

IV-A - H2 à la place de HSQL

Petit changement, mais qui a son importance, avec H2 embarquée, une application Grails en mode développement permet d'accéder automatiquement à la console d'administration de la base h2 (affichage des tables, requêtes SQL…) en accédant simplement à l'URL http://localhost:8080/application/dbconsole (prêt à l'emploi !).

IV-B - Des solutions avec GORM

Grails 2.0 (et son architecture interne basée elle-même sur des plugins) permet de remplacer la solution de persistance classique (Hibernate) par d'autres solutions, telles que JPA, MyBatis et le monde NoSQL est loin d'être oublié avec Redis, MongoDb, Gemfire et bien d'autres.

Et beaucoup de ces plugins sont supportés par SpringSource ce qui est un gage de qualité certain. En effet Graeme Rocher, le tech leader de Grails est responsable également d'un projet ambitieux concernant le support de très nombreuses solutions de gestion de données. Parce que la liste est trop longue et que je vous laisse la découvrir par vous-même, je ne vais pas vous la détailler, mais vous pouvez la consulter directement le github du projet https://github.com/SpringSource/grails-data-mapping.

IV-C - Multidatasource

Mieux encore, GORM, l'ORM de Grails permet maintenant d'utiliser plusieurs datasources très facilement. Il suffit de déclarer une ou plusieurs datasource supplémentaires dans le fichier DataSource.groovy et de préciser au niveau des domaines quel datasource utiliser :

class Comment {
String author
String comment

static mapping = {
datasource 'social'
}
}

On peut ainsi utiliser deux bases relationnelles ou mixer une base relationnelle avec une base NoSQL ou toute autre configuration.

V - La face cachée de l'iceberg

Comme beaucoup de développeurs passionnés, j'aime regarder ce qu'il se passe à l'intérieur d'un framework pour comprendre comment cela fonctionne ou mieux, trouver des fonctionnalités non documentées.

En regardant les classes de Grails, on remarque qu'il y a eu énormément de travail de refactoring depuis la version 1.3. Les raisons sont nombreuses, mais en voici quelques-unes en vrac :

- améliorer l'architecture interne en plugin ;

- permettre de remplacer plus facilement un plugin par un autre et notamment tout ce qui concerne la persistance ;

- séparer clairement les responsabilités (binding, validation, persistance…) ;

- faciliter l'intégration dans les IDE ;

- parce que le refactoring c'est essentiel quand un projet grossit.

Un exemple qui caractérise bien cela est la classe org.codehaus.groovy.grails.plugins.web.api.ControllersApi qui regroupe toutes les méthodes ajoutées par Grails au niveau des contrôleurs MVC.

VI - Les plugins !

VI-A - Grails Market

On est encore loin des markets Android ou Apple, mais Grails dispose aujourd'hui de plus de 700 plugins disponibles dans le repository officiel, et on peut en trouver bien d'autres sur github notamment.

Bonne nouvelle, les plugins officiellement maintenus par SpringSource sont déjà compatibles avec la version 2.0 de Grails. On retrouve donc le plugin spring-security-core et ses dépendances (ui, acl, OpenID, LDAP…), mais aussi les plugins de persistance cités ci-dessus (JPA, MongoDB, Redis…) et des plugins plus anciens, mais toujours utiles (Quartz, WebService, Mail).

VI-B - Cloud Ready

Grails n'est pas resté à l'écart de cette mouvance et les plugins Cloud Foundry Integration ou App Engine permettent de les déployer en un clic !

Heroku vient d'ailleurs d'annoncer le support de Grails sur sa plateforme http://blog.heroku.com/archives/2011/12/15/grails/.

VII - L'IDE

« Que serait un bon framework sans un bon IDE ? » Personnellement, je pense que cet adage se rapproche beaucoup de celui-ci : « Que serait un bon langage sans compilateur ? »

Utilisateur depuis des années d'Eclipse, je ne vous parlerai que de STS, mais Grails est supporté également par IntelliJ et Netbeans.

Depuis maintenant plus de trois ans, Springsource fournit beaucoup d'efforts pour améliorer sans cesse le support de Groovy et de Grails dans son IDE, SpringSource Tools Suite (STS).

Outre le support de groovy, STS intègre des wizards pour l'utilisation des commandes Grails ou la gestion des plugins (installation, désinstallation, mise à niveau), Toujours plus étonnant, STS supporte également la complétion sur les fameux dynamicFinder de Grails qui permettent d'exécuter des requêtes SQL uniquement à partir du nom de la méthode. En voici un exemple issu de la doc officielle :

def results = Book.findAllByTitleIlike("%Hobbit%")

STS supporte également les DSL groovy et la complétion des tags Grails dans les GSP. Cette dernière fonctionnalité, basée sur une convention de nommage des commentaires au niveau des tags Groovy est extrêmement pratique et je vous encourage fortement à l'utiliser sur tous les tags que vous créerez dans vos projets ou plugins.

VIII - Mais encore

Au niveau des autres améliorations majeures, on trouve également :

- le support HTML 5 au niveau du scaffolding ;

- une nouvelle console pour l'exécution des commandes Grails ;

- une meilleure gestion des erreurs affichées dans le navigateur avec des informations de debug au niveau des GSP, contrôleur, exception… ;

- une solution pour gérer les montées de version de la base de données (que je ne préfère pas utiliser au profit d'un vrai outil de modélisation) ;

- des tests unitaires et d'intégration plus avancés et plusieurs solutions de tests fonctionnels ;

- une amélioration continue de la documentation, utile par exemple lorsqu'il s'agit d'installer un repository d'entreprise pour déployer et gérer vos plugins Grails.

IX - Finalement

Certes, il est impossible d'être complet tant il y a de nouveautés. Je dirai plutôt d'améliorations, car venant de Grails 1.2 ou 1.3, on n'est pas dépaysé, tout est dans la continuité, et on en découvre un peu plus tous les jours.

J'espère que cet aperçu vous a donné envie d'aller voir plus loin ce qui se cache derrière Grails 2.0.

Vous trouverez plus de détails sur l'annonce officielle de sortie sur le blog de springsource et également dans la documentation officielle de Grails.

Bon développement.

X - Remerciements

Cet article a été publié avec l'aimable autorisation de la société Zenika, le billet original peut être trouvé sur le blog de Zenika.

Nous tenons à remercier mlny84 et Mickael Baron pour la mise au gabarit du billet original.