SlideShare una empresa de Scribd logo
Todo lo que me hubiera gustado saber
cuando empecé a desarrollar con Grails




Iván López - @ilopmar   “Oh finally, I can feel the power”
¿Quién soy?
●
    Iván López Martín @ilopmar

●
 Uso Grails/Groovy desde hace 3 años y Java desde hace
muchos más.

●
    Creador de www.bokzuy.com

●
    Creador de plugins de grails (ducksboard-api y slug-generator)

●
    3º en hackaton Grails48 con confspot.com

●
 Geek, Padre, Desarrollador, Sysadmin, Linuxero y
Pro-Software libre

●
    Trabajo en Kaleidos
Agenda
Si, pero esto de qué va...
Tiempo




         Google     Stack Overflow   Grails-user/   Noches sin   Trabajo
                                        Blogs        dormir      efectivo
...de esto!
Tiempo




         Google   Stack Overflow Grails-user/ Noches sin   Trabajo    Porno
                                    Blogs      dormir      efectivo
Domain
Domain

●
  Poner toda la lógica relacionada con el objeto que estamos
tratando en su clase de dominio.
●
    Modelos anémicos vs Modelos Ricos.
●
    Usar namedQueries.
●
    No utilizar booleanos nullables: crear enums.
●
    Validadores personalizados en constraints.
Controllers
Controllers

●
    No poner lógica de negocio en controllers.
●
    Responsabilidades:
     - Recibir una petición.
     - Verificar los parámetros.
     - Llamar a un servicio (o varios) para obtener los datos.
     - Renderizar una respuesta (html, xml, json) o redirect.
●
    CommandObjects para data binding complejo.
●
    Los CommandObjects pueden heredar de otros.
Servicios
Servicios

●
    Lógica de negocio no implementada en domain.
●
  Si no es necesaria transaccionalidad
static transactional = false
●
    Si es transaccional, no utilizar flush:true
●
 Tipos de los parámetros en los métodos y en valor de
retorno.
●
    No closures porque no hay transaccionalidad.
●
    src/groovy
Vistas
Vistas

●
    KISS.
●
    Templates para las partes comunes de las páginas.
●
    Templates para elementos que se repitan.
●
 No intentar reutilizar templates con if's y pequeños hacks
porque acaban siendo inmantenibles.
●
 No inyectar servicios: usar TagLib, Controller o Modelos
Ricos.
TagLibs
TagLibs

●
  Namespace específico para el proyecto o plugin
static namespace = 'myNs' --> <myNs:myMethod />

●
 Cálculos relativamente complejos para listas con
renderización común.

●
    Generar respuesta HTML con template.

●
 Un TagLib se puede llamar desde un controller con
myNs.myMethod
I18N
I18N

●
    Política de claves para messages.properties.
     Por ejemplo: pantalla.módulo.objeto-del-dominio.atributo
●
    Agrupar las claves por pantallas.
●
    ¡Respetar la política definida!
●
    ¡En serio! :-)
●
    Plurales:
my.msg = {0,choice,0#No hay resultados|1#Sólo un 
resultado|1<{0} resultados}
<g:message code='my.msg' args="[numResults]" />
URL Mappings
URL Mappings

●
    Usar namedUrls.
●
  Filtrar los métodos aceptados (GET, POST,...) en url y no en
static allowedMethods: 404 en lugar de 405.
name oneProposal: "/proposal/$proposalId" {
  controller = 'proposal'; 
  action = [GET:'showProposal', POST:'updateProposal']
}

<g:link mapping="oneProposal" params="[proposalId:entry.id]">

redirect mapping:'oneProposal',params:proposalId:proposal.id]
url = grailsLinkGenerator.link(absolute:true, 
mapping:'oneProposal', params:[proposalId:timeline.id])
Tests
Tests
●
    Hay que hacer tests, obvio ¿no? ;-)
●
    Spock.
●
    Servidor de Integración Continua: p.e. Jenkins.
●
    Plugins Fixtures y Build Test Data.
●
 Mejor Test Unitarios son más rápidos pero hay que
mockear más.
●
    Usar BD final y no H2 en Integración.
●
 Vistas difíciles de testear, aproximación en Integración con
controllers que hacen render template.
Configuración
Configuración
●
    Utilizar correctamente los entornos en Config.groovy.
●
 No subir a control de versiones archivos con configuración
personal (usuarios, contraseñas,...).
DataSource.groovy → DataSource.groovy.sample
●
 Crear archivo properties (aunque esté vacío inicialmente) para
cambiar parámetros generar un nuevo war (p.e: producción).
En Config.groovy:
grails.config.locations = ["classpath:myconfig.properties"]
●
 No ejecutar grails install-plugin xxxxx, definir la dependencia en
BuildConfig.groovy
Logs
Logs

●
    Es necesario que haya logs en la aplicación.
●
  No hay nada más frustante que una aplicación en
producción en la que falla y no tenemos información en los
logs para analizar el error.
●
    println está prohibido. Mejor log.debug, log.info,...
●
    Política de severidad de los mensajes y respetarla.
●
    Configurar por entorno el nivel mínimo de log mostrado.
Apps complejas
Apps complejas (I)

●
    La clave es Modularizar.
●
 El core en plugin común con clases de dominio y servicios
comunes.
●
    Una aplicación diferente por “funcionalidad”:
     - Página web
     - Página para dispositivos móviles
     - API
●
    En estas aplicaciones importar el plugin inline.
Apps complejas (II)

●
    Ventajas:
     - Distribuir la carga.
     - Separación clara de funcionalidades.
●
    Inconvenientes:
     - Más consumo de memoria
     - Aplicación más compleja
     - Despliegues más complejos
     - Ejecución de tests en varios proyectos
●
    ¡Aún así merece la pena!
Miscelánea
Rendimiento
●
    Relaciones xxx-to-many “automáticas” o “a mano”.
●
    Filtrar siempre que sea posible en la base de datos:
def data = User.list().find { it.name == 'pepe' } // No  
def data = User.findAllByName('pepe') // Sí
def data = User.findAllByName('pepe', [cache:true])
●
 Igual para obtener sólo el primer elemento, el último, los 3
últimos,...
def data = (Company.list() as List).first() // No
def data = Company.withCriteria { // Sí
    order('date', 'desc')
    maxResult(1)
    cache true // si queremos cachear
}
●
 Métodos específicos que hagan con count en la bd en lugar
de list.size()
Scaffolding
“Un gran poder conlleva una gran
        responsabilidad”
                                      Benjamin Parker (Tío Ben)



                        Iván López Martín

 @ilopmar                                   lopez.ivan@gmail.com

 http://lopezivan.blogspot.com              https://github.com/lmivan

Más contenido relacionado

La actualidad más candente

Symfony2: Optimización y rendimiento
Symfony2: Optimización y rendimientoSymfony2: Optimización y rendimiento
Symfony2: Optimización y rendimiento
Raul Fraile
 
Dar lab1819
Dar lab1819Dar lab1819
Desarrollo web en Nodejs con Pillars por Chelo Quilón
Desarrollo web en Nodejs con Pillars por Chelo QuilónDesarrollo web en Nodejs con Pillars por Chelo Quilón
Desarrollo web en Nodejs con Pillars por Chelo Quilón
betabeers
 
Flujo de trabajo básico con git
Flujo de trabajo básico con gitFlujo de trabajo básico con git
Flujo de trabajo básico con git
Jan Sanchez
 
Magallanes, Herramienta de despliegue PHP sencilla y poderosa
Magallanes, Herramienta de despliegue PHP sencilla y poderosa�Magallanes, Herramienta de despliegue PHP sencilla y poderosa�
Magallanes, Herramienta de despliegue PHP sencilla y poderosa
Fco Javier Núñez Berrocoso
 
Mantener Paquetes Debian en Equipo
Mantener Paquetes Debian en EquipoMantener Paquetes Debian en Equipo
Mantener Paquetes Debian en Equipo
Alejandro Rios Peña
 
Git: flujos de trabajo y herramientas para trabajo colaborativo
Git: flujos de trabajo y herramientas para trabajo colaborativoGit: flujos de trabajo y herramientas para trabajo colaborativo
Git: flujos de trabajo y herramientas para trabajo colaborativo
Aprende Git
 
Concurrencia en Java
Concurrencia en Java Concurrencia en Java
Concurrencia en Java
Pedro Gonzalez
 
Despliegue de aplicaciones PHP
Despliegue de aplicaciones PHPDespliegue de aplicaciones PHP
Despliegue de aplicaciones PHP
AlicantePHP
 
Nodejs
NodejsNodejs
Javier.Ramirez.Rails.Hot.Or.Not.Conferenciarails2008
Javier.Ramirez.Rails.Hot.Or.Not.Conferenciarails2008Javier.Ramirez.Rails.Hot.Or.Not.Conferenciarails2008
Javier.Ramirez.Rails.Hot.Or.Not.Conferenciarails2008
javier ramirez
 
NetBeans para Java, C, C++
NetBeans para Java, C, C++NetBeans para Java, C, C++
NetBeans para Java, C, C++
Manuel Antonio
 
Django
DjangoDjango
Introduccion A Groovy
Introduccion A GroovyIntroduccion A Groovy
Introduccion A Groovy
Andres Almiray
 
Introducción a Kotlin para desarrolladores Java
Introducción a Kotlin para desarrolladores JavaIntroducción a Kotlin para desarrolladores Java
Introducción a Kotlin para desarrolladores Java
Víctor Leonel Orozco López
 
Desarrollo de aplicaciones web con PHP y symfony
Desarrollo de aplicaciones web con PHP y symfonyDesarrollo de aplicaciones web con PHP y symfony
Desarrollo de aplicaciones web con PHP y symfony
Juan Eladio Sánchez Rosas
 
Tutorial para crear_clases_genericas
Tutorial para crear_clases_genericasTutorial para crear_clases_genericas
Tutorial para crear_clases_genericas
margaritapereira
 
Curso Php
Curso PhpCurso Php
Curso Php
larasaregune
 
Curso Avanzado PHP para EHU/UPV
Curso Avanzado PHP para EHU/UPVCurso Avanzado PHP para EHU/UPV
Curso Avanzado PHP para EHU/UPV
Irontec
 
Composer: Gestionando dependencias en PHP
Composer: Gestionando dependencias en PHP Composer: Gestionando dependencias en PHP
Composer: Gestionando dependencias en PHP
Fco Javier Núñez Berrocoso
 

La actualidad más candente (20)

Symfony2: Optimización y rendimiento
Symfony2: Optimización y rendimientoSymfony2: Optimización y rendimiento
Symfony2: Optimización y rendimiento
 
Dar lab1819
Dar lab1819Dar lab1819
Dar lab1819
 
Desarrollo web en Nodejs con Pillars por Chelo Quilón
Desarrollo web en Nodejs con Pillars por Chelo QuilónDesarrollo web en Nodejs con Pillars por Chelo Quilón
Desarrollo web en Nodejs con Pillars por Chelo Quilón
 
Flujo de trabajo básico con git
Flujo de trabajo básico con gitFlujo de trabajo básico con git
Flujo de trabajo básico con git
 
Magallanes, Herramienta de despliegue PHP sencilla y poderosa
Magallanes, Herramienta de despliegue PHP sencilla y poderosa�Magallanes, Herramienta de despliegue PHP sencilla y poderosa�
Magallanes, Herramienta de despliegue PHP sencilla y poderosa
 
Mantener Paquetes Debian en Equipo
Mantener Paquetes Debian en EquipoMantener Paquetes Debian en Equipo
Mantener Paquetes Debian en Equipo
 
Git: flujos de trabajo y herramientas para trabajo colaborativo
Git: flujos de trabajo y herramientas para trabajo colaborativoGit: flujos de trabajo y herramientas para trabajo colaborativo
Git: flujos de trabajo y herramientas para trabajo colaborativo
 
Concurrencia en Java
Concurrencia en Java Concurrencia en Java
Concurrencia en Java
 
Despliegue de aplicaciones PHP
Despliegue de aplicaciones PHPDespliegue de aplicaciones PHP
Despliegue de aplicaciones PHP
 
Nodejs
NodejsNodejs
Nodejs
 
Javier.Ramirez.Rails.Hot.Or.Not.Conferenciarails2008
Javier.Ramirez.Rails.Hot.Or.Not.Conferenciarails2008Javier.Ramirez.Rails.Hot.Or.Not.Conferenciarails2008
Javier.Ramirez.Rails.Hot.Or.Not.Conferenciarails2008
 
NetBeans para Java, C, C++
NetBeans para Java, C, C++NetBeans para Java, C, C++
NetBeans para Java, C, C++
 
Django
DjangoDjango
Django
 
Introduccion A Groovy
Introduccion A GroovyIntroduccion A Groovy
Introduccion A Groovy
 
Introducción a Kotlin para desarrolladores Java
Introducción a Kotlin para desarrolladores JavaIntroducción a Kotlin para desarrolladores Java
Introducción a Kotlin para desarrolladores Java
 
Desarrollo de aplicaciones web con PHP y symfony
Desarrollo de aplicaciones web con PHP y symfonyDesarrollo de aplicaciones web con PHP y symfony
Desarrollo de aplicaciones web con PHP y symfony
 
Tutorial para crear_clases_genericas
Tutorial para crear_clases_genericasTutorial para crear_clases_genericas
Tutorial para crear_clases_genericas
 
Curso Php
Curso PhpCurso Php
Curso Php
 
Curso Avanzado PHP para EHU/UPV
Curso Avanzado PHP para EHU/UPVCurso Avanzado PHP para EHU/UPV
Curso Avanzado PHP para EHU/UPV
 
Composer: Gestionando dependencias en PHP
Composer: Gestionando dependencias en PHP Composer: Gestionando dependencias en PHP
Composer: Gestionando dependencias en PHP
 

Destacado

Greach 2014 - Metaprogramming with groovy
Greach 2014 - Metaprogramming with groovyGreach 2014 - Metaprogramming with groovy
Greach 2014 - Metaprogramming with groovy
Iván López Martín
 
Alpenflüstern Wiesn Highlights 2009
Alpenflüstern Wiesn Highlights 2009Alpenflüstern Wiesn Highlights 2009
Alpenflüstern Wiesn Highlights 2009
Alpenflüstern
 
LLL 08
LLL 08LLL 08
LLL 08
Nina Rebele
 
Kollaboratives Arbeiten mit Cmap Tools
Kollaboratives Arbeiten mit Cmap ToolsKollaboratives Arbeiten mit Cmap Tools
Kollaboratives Arbeiten mit Cmap Tools
Martina Grosty
 
Dii K4 St1 Reflexive Verbs
Dii K4 St1 Reflexive VerbsDii K4 St1 Reflexive Verbs
Dii K4 St1 Reflexive Verbs
fraubooth
 
Content Marketing Michael Hülskötter
Content Marketing Michael HülskötterContent Marketing Michael Hülskötter
Content Marketing Michael Hülskötter
Michael Hülskötter
 
Mehr Softwarequalität: Usability
Mehr Softwarequalität: UsabilityMehr Softwarequalität: Usability
Caries
CariesCaries
Ergebnispräsentation F&E Senay
Ergebnispräsentation F&E   SenayErgebnispräsentation F&E   Senay
Ergebnispräsentation F&E Senay
DanaWI
 
H. P. Therkelsen A/S | Drehscheibe Skandinavien - die Zukunft des Kühlgutumsc...
H. P. Therkelsen A/S | Drehscheibe Skandinavien - die Zukunft des Kühlgutumsc...H. P. Therkelsen A/S | Drehscheibe Skandinavien - die Zukunft des Kühlgutumsc...
H. P. Therkelsen A/S | Drehscheibe Skandinavien - die Zukunft des Kühlgutumsc...
MBWA Public Relations GmbH | PR und Pressearbeit für Logistik
 
Trabajo karen
Trabajo karenTrabajo karen
Trabajo karen
karenmorales06
 
Alles Uber oder was?
Alles Uber oder was?Alles Uber oder was?
Alles Uber oder was?
Leonie Blume
 
INFORMATICA
INFORMATICAINFORMATICA
INFORMATICA
otto2012
 
Cenicienta
CenicientaCenicienta
Plan de negocio
Plan de negocioPlan de negocio
Plan de negocio
LeidyEnriquez
 
Finger Flick
Finger FlickFinger Flick
Finger Flick
lucymedia
 
Diadelaindependencia
DiadelaindependenciaDiadelaindependencia
Diadelaindependencia
isabelzur48
 
Ósmosis. Aspectos cualitativos de las disoluciones (III)
Ósmosis. Aspectos cualitativos de las disoluciones (III)Ósmosis. Aspectos cualitativos de las disoluciones (III)
Ósmosis. Aspectos cualitativos de las disoluciones (III)
ColgandoClases ...
 

Destacado (20)

Greach 2014 - Metaprogramming with groovy
Greach 2014 - Metaprogramming with groovyGreach 2014 - Metaprogramming with groovy
Greach 2014 - Metaprogramming with groovy
 
Alpenflüstern Wiesn Highlights 2009
Alpenflüstern Wiesn Highlights 2009Alpenflüstern Wiesn Highlights 2009
Alpenflüstern Wiesn Highlights 2009
 
LLL 08
LLL 08LLL 08
LLL 08
 
Kollaboratives Arbeiten mit Cmap Tools
Kollaboratives Arbeiten mit Cmap ToolsKollaboratives Arbeiten mit Cmap Tools
Kollaboratives Arbeiten mit Cmap Tools
 
Dii K4 St1 Reflexive Verbs
Dii K4 St1 Reflexive VerbsDii K4 St1 Reflexive Verbs
Dii K4 St1 Reflexive Verbs
 
Content Marketing Michael Hülskötter
Content Marketing Michael HülskötterContent Marketing Michael Hülskötter
Content Marketing Michael Hülskötter
 
Mehr Softwarequalität: Usability
Mehr Softwarequalität: UsabilityMehr Softwarequalität: Usability
Mehr Softwarequalität: Usability
 
Caries
CariesCaries
Caries
 
Ergebnispräsentation F&E Senay
Ergebnispräsentation F&E   SenayErgebnispräsentation F&E   Senay
Ergebnispräsentation F&E Senay
 
H. P. Therkelsen A/S | Drehscheibe Skandinavien - die Zukunft des Kühlgutumsc...
H. P. Therkelsen A/S | Drehscheibe Skandinavien - die Zukunft des Kühlgutumsc...H. P. Therkelsen A/S | Drehscheibe Skandinavien - die Zukunft des Kühlgutumsc...
H. P. Therkelsen A/S | Drehscheibe Skandinavien - die Zukunft des Kühlgutumsc...
 
Trabajo karen
Trabajo karenTrabajo karen
Trabajo karen
 
Alles Uber oder was?
Alles Uber oder was?Alles Uber oder was?
Alles Uber oder was?
 
INFORMATICA
INFORMATICAINFORMATICA
INFORMATICA
 
Erziehung sequence b1
Erziehung sequence b1Erziehung sequence b1
Erziehung sequence b1
 
Cenicienta
CenicientaCenicienta
Cenicienta
 
Frauengl Ck
Frauengl CkFrauengl Ck
Frauengl Ck
 
Plan de negocio
Plan de negocioPlan de negocio
Plan de negocio
 
Finger Flick
Finger FlickFinger Flick
Finger Flick
 
Diadelaindependencia
DiadelaindependenciaDiadelaindependencia
Diadelaindependencia
 
Ósmosis. Aspectos cualitativos de las disoluciones (III)
Ósmosis. Aspectos cualitativos de las disoluciones (III)Ósmosis. Aspectos cualitativos de las disoluciones (III)
Ósmosis. Aspectos cualitativos de las disoluciones (III)
 

Similar a Greach 2013 - Todo lo que me hubiera gustado saber cuando empecé a desarrollar con grails

Django
DjangoDjango
Django
ykro
 
MobileCONGalicia Introducción a Android
MobileCONGalicia Introducción a AndroidMobileCONGalicia Introducción a Android
MobileCONGalicia Introducción a Android
Alberto Ruibal
 
Combinación ganadora: Plone como CMS, tu framework preferido como frontend
Combinación ganadora: Plone como CMS, tu framework preferido como frontendCombinación ganadora: Plone como CMS, tu framework preferido como frontend
Combinación ganadora: Plone como CMS, tu framework preferido como frontend
menttes
 
Grails barcamp 2013
Grails barcamp 2013Grails barcamp 2013
Grails barcamp 2013
Carlos Camacho
 
Grails 2013 - PUCMM - Santiago - Sistemas
Grails 2013 - PUCMM - Santiago - SistemasGrails 2013 - PUCMM - Santiago - Sistemas
Grails 2013 - PUCMM - Santiago - Sistemas
Carlos Camacho
 
¿Grails + DDD + Eventsourcing + CQRS?
¿Grails + DDD + Eventsourcing + CQRS?¿Grails + DDD + Eventsourcing + CQRS?
¿Grails + DDD + Eventsourcing + CQRS?
Jorge Franco Leza
 
Jobsket Spring 2GX Madrid
Jobsket Spring 2GX MadridJobsket Spring 2GX Madrid
Jobsket Spring 2GX Madrid
Jobsket
 
VLCTechFest - Simplificando Controladores: Una introducción a Action-Domain ...
VLCTechFest -  Simplificando Controladores: Una introducción a Action-Domain ...VLCTechFest -  Simplificando Controladores: Una introducción a Action-Domain ...
VLCTechFest - Simplificando Controladores: Una introducción a Action-Domain ...
Miguel Ángel Sánchez Chordi
 
Intro a cakephp
Intro a cakephpIntro a cakephp
Intro a cakephp
betabeers
 
Cómo diagnosticar problemas de rendimiento en entornos LAMP
Cómo diagnosticar problemas de rendimiento en entornos LAMPCómo diagnosticar problemas de rendimiento en entornos LAMP
Cómo diagnosticar problemas de rendimiento en entornos LAMP
Javier Carranza
 
Intro a cakephp
Intro a cakephpIntro a cakephp
Intro a cakephp
Andy Dawson
 
Taller de introducción al desarrollo web con Django
Taller de introducción al desarrollo web con DjangoTaller de introducción al desarrollo web con Django
Taller de introducción al desarrollo web con Django
Juan Rodríguez
 
Programacion RPG: Conceptos ILE
Programacion RPG: Conceptos ILEProgramacion RPG: Conceptos ILE
Programacion RPG: Conceptos ILE
Giovanny Guillen
 
Los mejores trucos y prácticas para configurar drupal
Los mejores trucos y prácticas para configurar drupalLos mejores trucos y prácticas para configurar drupal
Los mejores trucos y prácticas para configurar drupal
SiteGround España
 
Drupal 7 para sitios de alto rendimiento y alta disponibilidad
Drupal 7 para sitios de alto rendimiento y alta disponibilidadDrupal 7 para sitios de alto rendimiento y alta disponibilidad
Drupal 7 para sitios de alto rendimiento y alta disponibilidad
Iván Campaña Naranjo
 
Headless Wordpress with React & GraphQL
Headless Wordpress with React & GraphQLHeadless Wordpress with React & GraphQL
Headless Wordpress with React & GraphQL
Matias Emiliano Alvarez Duran
 
Taller introduccion symfony2
Taller introduccion symfony2Taller introduccion symfony2
Taller introduccion symfony2
Mario IC
 
Integrando AngularJS y drupal
Integrando AngularJS y drupalIntegrando AngularJS y drupal
Integrando AngularJS y drupal
Iván Campaña Naranjo
 
Taller de Django betabeers
Taller de Django betabeersTaller de Django betabeers
Taller de Django betabeers
betabeers
 
No quiero vuestra basura en Android
No quiero vuestra basura en AndroidNo quiero vuestra basura en Android
No quiero vuestra basura en Android
Antonio Nicolás Pina
 

Similar a Greach 2013 - Todo lo que me hubiera gustado saber cuando empecé a desarrollar con grails (20)

Django
DjangoDjango
Django
 
MobileCONGalicia Introducción a Android
MobileCONGalicia Introducción a AndroidMobileCONGalicia Introducción a Android
MobileCONGalicia Introducción a Android
 
Combinación ganadora: Plone como CMS, tu framework preferido como frontend
Combinación ganadora: Plone como CMS, tu framework preferido como frontendCombinación ganadora: Plone como CMS, tu framework preferido como frontend
Combinación ganadora: Plone como CMS, tu framework preferido como frontend
 
Grails barcamp 2013
Grails barcamp 2013Grails barcamp 2013
Grails barcamp 2013
 
Grails 2013 - PUCMM - Santiago - Sistemas
Grails 2013 - PUCMM - Santiago - SistemasGrails 2013 - PUCMM - Santiago - Sistemas
Grails 2013 - PUCMM - Santiago - Sistemas
 
¿Grails + DDD + Eventsourcing + CQRS?
¿Grails + DDD + Eventsourcing + CQRS?¿Grails + DDD + Eventsourcing + CQRS?
¿Grails + DDD + Eventsourcing + CQRS?
 
Jobsket Spring 2GX Madrid
Jobsket Spring 2GX MadridJobsket Spring 2GX Madrid
Jobsket Spring 2GX Madrid
 
VLCTechFest - Simplificando Controladores: Una introducción a Action-Domain ...
VLCTechFest -  Simplificando Controladores: Una introducción a Action-Domain ...VLCTechFest -  Simplificando Controladores: Una introducción a Action-Domain ...
VLCTechFest - Simplificando Controladores: Una introducción a Action-Domain ...
 
Intro a cakephp
Intro a cakephpIntro a cakephp
Intro a cakephp
 
Cómo diagnosticar problemas de rendimiento en entornos LAMP
Cómo diagnosticar problemas de rendimiento en entornos LAMPCómo diagnosticar problemas de rendimiento en entornos LAMP
Cómo diagnosticar problemas de rendimiento en entornos LAMP
 
Intro a cakephp
Intro a cakephpIntro a cakephp
Intro a cakephp
 
Taller de introducción al desarrollo web con Django
Taller de introducción al desarrollo web con DjangoTaller de introducción al desarrollo web con Django
Taller de introducción al desarrollo web con Django
 
Programacion RPG: Conceptos ILE
Programacion RPG: Conceptos ILEProgramacion RPG: Conceptos ILE
Programacion RPG: Conceptos ILE
 
Los mejores trucos y prácticas para configurar drupal
Los mejores trucos y prácticas para configurar drupalLos mejores trucos y prácticas para configurar drupal
Los mejores trucos y prácticas para configurar drupal
 
Drupal 7 para sitios de alto rendimiento y alta disponibilidad
Drupal 7 para sitios de alto rendimiento y alta disponibilidadDrupal 7 para sitios de alto rendimiento y alta disponibilidad
Drupal 7 para sitios de alto rendimiento y alta disponibilidad
 
Headless Wordpress with React & GraphQL
Headless Wordpress with React & GraphQLHeadless Wordpress with React & GraphQL
Headless Wordpress with React & GraphQL
 
Taller introduccion symfony2
Taller introduccion symfony2Taller introduccion symfony2
Taller introduccion symfony2
 
Integrando AngularJS y drupal
Integrando AngularJS y drupalIntegrando AngularJS y drupal
Integrando AngularJS y drupal
 
Taller de Django betabeers
Taller de Django betabeersTaller de Django betabeers
Taller de Django betabeers
 
No quiero vuestra basura en Android
No quiero vuestra basura en AndroidNo quiero vuestra basura en Android
No quiero vuestra basura en Android
 

Más de Iván López Martín

SalmorejoTech 2024 - Spring Boot <3 Testcontainers
SalmorejoTech 2024 - Spring Boot <3 TestcontainersSalmorejoTech 2024 - Spring Boot <3 Testcontainers
SalmorejoTech 2024 - Spring Boot <3 Testcontainers
Iván López Martín
 
CommitConf 2024 - Spring Boot <3 Testcontainers
CommitConf 2024 - Spring Boot <3 TestcontainersCommitConf 2024 - Spring Boot <3 Testcontainers
CommitConf 2024 - Spring Boot <3 Testcontainers
Iván López Martín
 
Voxxed Days CERN 2024 - Spring Boot <3 Testcontainers.pdf
Voxxed Days CERN 2024 - Spring Boot <3 Testcontainers.pdfVoxxed Days CERN 2024 - Spring Boot <3 Testcontainers.pdf
Voxxed Days CERN 2024 - Spring Boot <3 Testcontainers.pdf
Iván López Martín
 
VMware - Testcontainers y Spring Boot
VMware - Testcontainers y Spring BootVMware - Testcontainers y Spring Boot
VMware - Testcontainers y Spring Boot
Iván López Martín
 
Spring IO 2023 - Dynamic OpenAPIs with Spring Cloud Gateway
Spring IO 2023 - Dynamic OpenAPIs with Spring Cloud GatewaySpring IO 2023 - Dynamic OpenAPIs with Spring Cloud Gateway
Spring IO 2023 - Dynamic OpenAPIs with Spring Cloud Gateway
Iván López Martín
 
Codemotion Madrid 2023 - Testcontainers y Spring Boot
Codemotion Madrid 2023 - Testcontainers y Spring BootCodemotion Madrid 2023 - Testcontainers y Spring Boot
Codemotion Madrid 2023 - Testcontainers y Spring Boot
Iván López Martín
 
CommitConf 2023 - Spring Framework 6 y Spring Boot 3
CommitConf 2023 - Spring Framework 6 y Spring Boot 3CommitConf 2023 - Spring Framework 6 y Spring Boot 3
CommitConf 2023 - Spring Framework 6 y Spring Boot 3
Iván López Martín
 
Construyendo un API REST con Spring Boot y GraalVM
Construyendo un API REST con Spring Boot y GraalVMConstruyendo un API REST con Spring Boot y GraalVM
Construyendo un API REST con Spring Boot y GraalVM
Iván López Martín
 
jLove 2020 - Micronaut and graalvm: The power of AoT
jLove 2020 - Micronaut and graalvm: The power of AoTjLove 2020 - Micronaut and graalvm: The power of AoT
jLove 2020 - Micronaut and graalvm: The power of AoT
Iván López Martín
 
Codemotion Madrid 2020 - Serverless con Micronaut
Codemotion Madrid 2020 - Serverless con MicronautCodemotion Madrid 2020 - Serverless con Micronaut
Codemotion Madrid 2020 - Serverless con Micronaut
Iván López Martín
 
JConf Perú 2020 - ¡Micronaut en acción!
JConf Perú 2020 - ¡Micronaut en acción!JConf Perú 2020 - ¡Micronaut en acción!
JConf Perú 2020 - ¡Micronaut en acción!
Iván López Martín
 
JConf Perú 2020 - Micronaut + GraalVM = <3
JConf Perú 2020 - Micronaut + GraalVM = <3JConf Perú 2020 - Micronaut + GraalVM = <3
JConf Perú 2020 - Micronaut + GraalVM = <3
Iván López Martín
 
JConf México 2020 - Micronaut + GraalVM = <3
JConf México 2020 - Micronaut + GraalVM = <3JConf México 2020 - Micronaut + GraalVM = <3
JConf México 2020 - Micronaut + GraalVM = <3
Iván López Martín
 
Developing Micronaut Applications With IntelliJ IDEA
Developing Micronaut Applications With IntelliJ IDEADeveloping Micronaut Applications With IntelliJ IDEA
Developing Micronaut Applications With IntelliJ IDEA
Iván López Martín
 
CommitConf 2019 - Micronaut y GraalVm: La combinación perfecta
CommitConf 2019 - Micronaut y GraalVm: La combinación perfectaCommitConf 2019 - Micronaut y GraalVm: La combinación perfecta
CommitConf 2019 - Micronaut y GraalVm: La combinación perfecta
Iván López Martín
 
Codemotion Madrid 2019 - ¡GraalVM y Micronaut: compañeros perfectos!
Codemotion Madrid 2019 - ¡GraalVM y Micronaut: compañeros perfectos!Codemotion Madrid 2019 - ¡GraalVM y Micronaut: compañeros perfectos!
Codemotion Madrid 2019 - ¡GraalVM y Micronaut: compañeros perfectos!
Iván López Martín
 
Greach 2019 - Creating Micronaut Configurations
Greach 2019 - Creating Micronaut ConfigurationsGreach 2019 - Creating Micronaut Configurations
Greach 2019 - Creating Micronaut Configurations
Iván López Martín
 
VoxxedDays Bucharest 2019 - Alexa, nice to meet you
VoxxedDays Bucharest 2019 - Alexa, nice to meet youVoxxedDays Bucharest 2019 - Alexa, nice to meet you
VoxxedDays Bucharest 2019 - Alexa, nice to meet you
Iván López Martín
 
JavaDay Lviv 2019 - Micronaut in action!
JavaDay Lviv 2019 - Micronaut in action!JavaDay Lviv 2019 - Micronaut in action!
JavaDay Lviv 2019 - Micronaut in action!
Iván López Martín
 
CrossDvlup Madrid 2019 - Alexa, encantado de conocerte
CrossDvlup Madrid 2019 - Alexa, encantado de conocerteCrossDvlup Madrid 2019 - Alexa, encantado de conocerte
CrossDvlup Madrid 2019 - Alexa, encantado de conocerte
Iván López Martín
 

Más de Iván López Martín (20)

SalmorejoTech 2024 - Spring Boot <3 Testcontainers
SalmorejoTech 2024 - Spring Boot <3 TestcontainersSalmorejoTech 2024 - Spring Boot <3 Testcontainers
SalmorejoTech 2024 - Spring Boot <3 Testcontainers
 
CommitConf 2024 - Spring Boot <3 Testcontainers
CommitConf 2024 - Spring Boot <3 TestcontainersCommitConf 2024 - Spring Boot <3 Testcontainers
CommitConf 2024 - Spring Boot <3 Testcontainers
 
Voxxed Days CERN 2024 - Spring Boot <3 Testcontainers.pdf
Voxxed Days CERN 2024 - Spring Boot <3 Testcontainers.pdfVoxxed Days CERN 2024 - Spring Boot <3 Testcontainers.pdf
Voxxed Days CERN 2024 - Spring Boot <3 Testcontainers.pdf
 
VMware - Testcontainers y Spring Boot
VMware - Testcontainers y Spring BootVMware - Testcontainers y Spring Boot
VMware - Testcontainers y Spring Boot
 
Spring IO 2023 - Dynamic OpenAPIs with Spring Cloud Gateway
Spring IO 2023 - Dynamic OpenAPIs with Spring Cloud GatewaySpring IO 2023 - Dynamic OpenAPIs with Spring Cloud Gateway
Spring IO 2023 - Dynamic OpenAPIs with Spring Cloud Gateway
 
Codemotion Madrid 2023 - Testcontainers y Spring Boot
Codemotion Madrid 2023 - Testcontainers y Spring BootCodemotion Madrid 2023 - Testcontainers y Spring Boot
Codemotion Madrid 2023 - Testcontainers y Spring Boot
 
CommitConf 2023 - Spring Framework 6 y Spring Boot 3
CommitConf 2023 - Spring Framework 6 y Spring Boot 3CommitConf 2023 - Spring Framework 6 y Spring Boot 3
CommitConf 2023 - Spring Framework 6 y Spring Boot 3
 
Construyendo un API REST con Spring Boot y GraalVM
Construyendo un API REST con Spring Boot y GraalVMConstruyendo un API REST con Spring Boot y GraalVM
Construyendo un API REST con Spring Boot y GraalVM
 
jLove 2020 - Micronaut and graalvm: The power of AoT
jLove 2020 - Micronaut and graalvm: The power of AoTjLove 2020 - Micronaut and graalvm: The power of AoT
jLove 2020 - Micronaut and graalvm: The power of AoT
 
Codemotion Madrid 2020 - Serverless con Micronaut
Codemotion Madrid 2020 - Serverless con MicronautCodemotion Madrid 2020 - Serverless con Micronaut
Codemotion Madrid 2020 - Serverless con Micronaut
 
JConf Perú 2020 - ¡Micronaut en acción!
JConf Perú 2020 - ¡Micronaut en acción!JConf Perú 2020 - ¡Micronaut en acción!
JConf Perú 2020 - ¡Micronaut en acción!
 
JConf Perú 2020 - Micronaut + GraalVM = <3
JConf Perú 2020 - Micronaut + GraalVM = <3JConf Perú 2020 - Micronaut + GraalVM = <3
JConf Perú 2020 - Micronaut + GraalVM = <3
 
JConf México 2020 - Micronaut + GraalVM = <3
JConf México 2020 - Micronaut + GraalVM = <3JConf México 2020 - Micronaut + GraalVM = <3
JConf México 2020 - Micronaut + GraalVM = <3
 
Developing Micronaut Applications With IntelliJ IDEA
Developing Micronaut Applications With IntelliJ IDEADeveloping Micronaut Applications With IntelliJ IDEA
Developing Micronaut Applications With IntelliJ IDEA
 
CommitConf 2019 - Micronaut y GraalVm: La combinación perfecta
CommitConf 2019 - Micronaut y GraalVm: La combinación perfectaCommitConf 2019 - Micronaut y GraalVm: La combinación perfecta
CommitConf 2019 - Micronaut y GraalVm: La combinación perfecta
 
Codemotion Madrid 2019 - ¡GraalVM y Micronaut: compañeros perfectos!
Codemotion Madrid 2019 - ¡GraalVM y Micronaut: compañeros perfectos!Codemotion Madrid 2019 - ¡GraalVM y Micronaut: compañeros perfectos!
Codemotion Madrid 2019 - ¡GraalVM y Micronaut: compañeros perfectos!
 
Greach 2019 - Creating Micronaut Configurations
Greach 2019 - Creating Micronaut ConfigurationsGreach 2019 - Creating Micronaut Configurations
Greach 2019 - Creating Micronaut Configurations
 
VoxxedDays Bucharest 2019 - Alexa, nice to meet you
VoxxedDays Bucharest 2019 - Alexa, nice to meet youVoxxedDays Bucharest 2019 - Alexa, nice to meet you
VoxxedDays Bucharest 2019 - Alexa, nice to meet you
 
JavaDay Lviv 2019 - Micronaut in action!
JavaDay Lviv 2019 - Micronaut in action!JavaDay Lviv 2019 - Micronaut in action!
JavaDay Lviv 2019 - Micronaut in action!
 
CrossDvlup Madrid 2019 - Alexa, encantado de conocerte
CrossDvlup Madrid 2019 - Alexa, encantado de conocerteCrossDvlup Madrid 2019 - Alexa, encantado de conocerte
CrossDvlup Madrid 2019 - Alexa, encantado de conocerte
 

Último

Conceptos y definiciones de Antenas y propagación
Conceptos y definiciones de Antenas y propagaciónConceptos y definiciones de Antenas y propagación
Conceptos y definiciones de Antenas y propagación
edgarcalle8
 
"El uso de las TIC en la vida cotidiana". SantanaMartinez_Alejandra
"El uso de las TIC en la vida cotidiana". SantanaMartinez_Alejandra"El uso de las TIC en la vida cotidiana". SantanaMartinez_Alejandra
"El uso de las TIC en la vida cotidiana". SantanaMartinez_Alejandra
241578066
 
SEGUNDA GENERACIÓN xxxxxxxxxxxxxxxx.docx
SEGUNDA GENERACIÓN xxxxxxxxxxxxxxxx.docxSEGUNDA GENERACIÓN xxxxxxxxxxxxxxxx.docx
SEGUNDA GENERACIÓN xxxxxxxxxxxxxxxx.docx
Eddy Nathaly Jaimes Villamizar
 
11. Legislación Aplicada a la Informática.pdf
11. Legislación Aplicada a la Informática.pdf11. Legislación Aplicada a la Informática.pdf
11. Legislación Aplicada a la Informática.pdf
PanchoChangue
 
PROTOCOLO DE NANOPOROS Kit de códigos de barras 16S (SQK-RAB204)
PROTOCOLO DE NANOPOROS Kit de códigos de barras 16S (SQK-RAB204)PROTOCOLO DE NANOPOROS Kit de códigos de barras 16S (SQK-RAB204)
PROTOCOLO DE NANOPOROS Kit de códigos de barras 16S (SQK-RAB204)
ADELAIDA90
 
Índice del libro "Metaverso y mundos virtuales: Tecnologías, Retos y Oportuni...
Índice del libro "Metaverso y mundos virtuales: Tecnologías, Retos y Oportuni...Índice del libro "Metaverso y mundos virtuales: Tecnologías, Retos y Oportuni...
Índice del libro "Metaverso y mundos virtuales: Tecnologías, Retos y Oportuni...
Telefónica
 
Diapositiva sobre Tecnologia de la Información y Telecomunicaciones.pptx
Diapositiva sobre Tecnologia de la Información y Telecomunicaciones.pptxDiapositiva sobre Tecnologia de la Información y Telecomunicaciones.pptx
Diapositiva sobre Tecnologia de la Información y Telecomunicaciones.pptx
GnesisOrtegaDeLen
 
_Manejo de Riesgos en el Laboratorio.pdf
_Manejo de Riesgos en el Laboratorio.pdf_Manejo de Riesgos en el Laboratorio.pdf
_Manejo de Riesgos en el Laboratorio.pdf
correodetareas
 
Evolución, características, aplicación, ventajas y desventajas de las TIC
Evolución, características, aplicación, ventajas y desventajas de las TICEvolución, características, aplicación, ventajas y desventajas de las TIC
Evolución, características, aplicación, ventajas y desventajas de las TIC
Henry W. Zavala
 
Informe_mc_bombas_Warman_001-WEIR vulco.pdf
Informe_mc_bombas_Warman_001-WEIR vulco.pdfInforme_mc_bombas_Warman_001-WEIR vulco.pdf
Informe_mc_bombas_Warman_001-WEIR vulco.pdf
Rubén Cortes Zavala
 
Generaciones de Computadoras .
Generaciones de Computadoras                 .Generaciones de Computadoras                 .
Generaciones de Computadoras .
gregory760891
 
¿Cómo funciona el seguimiento por GPS y cómo puede ayudar al transporte y la ...
¿Cómo funciona el seguimiento por GPS y cómo puede ayudar al transporte y la ...¿Cómo funciona el seguimiento por GPS y cómo puede ayudar al transporte y la ...
¿Cómo funciona el seguimiento por GPS y cómo puede ayudar al transporte y la ...
Navsat
 
400816850-Mantenimiento-de-Equipos-de-Espesamiento-pdf.pdf
400816850-Mantenimiento-de-Equipos-de-Espesamiento-pdf.pdf400816850-Mantenimiento-de-Equipos-de-Espesamiento-pdf.pdf
400816850-Mantenimiento-de-Equipos-de-Espesamiento-pdf.pdf
Rubén Cortes Zavala
 
bomba-koomey -Todo sobre sus istema y conexiones
bomba-koomey -Todo sobre sus istema y conexionesbomba-koomey -Todo sobre sus istema y conexiones
bomba-koomey -Todo sobre sus istema y conexiones
JessAdrinGonzlezCade
 
DE LO HUMANO Y LO COMUNITARIO PROYECTO INTEGRADOR (2).docx
DE LO HUMANO Y LO COMUNITARIO PROYECTO INTEGRADOR (2).docxDE LO HUMANO Y LO COMUNITARIO PROYECTO INTEGRADOR (2).docx
DE LO HUMANO Y LO COMUNITARIO PROYECTO INTEGRADOR (2).docx
lourdesuribe6
 
UiPath Community Data Service presentation
UiPath Community Data Service presentationUiPath Community Data Service presentation
UiPath Community Data Service presentation
DianaGray10
 

Último (16)

Conceptos y definiciones de Antenas y propagación
Conceptos y definiciones de Antenas y propagaciónConceptos y definiciones de Antenas y propagación
Conceptos y definiciones de Antenas y propagación
 
"El uso de las TIC en la vida cotidiana". SantanaMartinez_Alejandra
"El uso de las TIC en la vida cotidiana". SantanaMartinez_Alejandra"El uso de las TIC en la vida cotidiana". SantanaMartinez_Alejandra
"El uso de las TIC en la vida cotidiana". SantanaMartinez_Alejandra
 
SEGUNDA GENERACIÓN xxxxxxxxxxxxxxxx.docx
SEGUNDA GENERACIÓN xxxxxxxxxxxxxxxx.docxSEGUNDA GENERACIÓN xxxxxxxxxxxxxxxx.docx
SEGUNDA GENERACIÓN xxxxxxxxxxxxxxxx.docx
 
11. Legislación Aplicada a la Informática.pdf
11. Legislación Aplicada a la Informática.pdf11. Legislación Aplicada a la Informática.pdf
11. Legislación Aplicada a la Informática.pdf
 
PROTOCOLO DE NANOPOROS Kit de códigos de barras 16S (SQK-RAB204)
PROTOCOLO DE NANOPOROS Kit de códigos de barras 16S (SQK-RAB204)PROTOCOLO DE NANOPOROS Kit de códigos de barras 16S (SQK-RAB204)
PROTOCOLO DE NANOPOROS Kit de códigos de barras 16S (SQK-RAB204)
 
Índice del libro "Metaverso y mundos virtuales: Tecnologías, Retos y Oportuni...
Índice del libro "Metaverso y mundos virtuales: Tecnologías, Retos y Oportuni...Índice del libro "Metaverso y mundos virtuales: Tecnologías, Retos y Oportuni...
Índice del libro "Metaverso y mundos virtuales: Tecnologías, Retos y Oportuni...
 
Diapositiva sobre Tecnologia de la Información y Telecomunicaciones.pptx
Diapositiva sobre Tecnologia de la Información y Telecomunicaciones.pptxDiapositiva sobre Tecnologia de la Información y Telecomunicaciones.pptx
Diapositiva sobre Tecnologia de la Información y Telecomunicaciones.pptx
 
_Manejo de Riesgos en el Laboratorio.pdf
_Manejo de Riesgos en el Laboratorio.pdf_Manejo de Riesgos en el Laboratorio.pdf
_Manejo de Riesgos en el Laboratorio.pdf
 
Evolución, características, aplicación, ventajas y desventajas de las TIC
Evolución, características, aplicación, ventajas y desventajas de las TICEvolución, características, aplicación, ventajas y desventajas de las TIC
Evolución, características, aplicación, ventajas y desventajas de las TIC
 
Informe_mc_bombas_Warman_001-WEIR vulco.pdf
Informe_mc_bombas_Warman_001-WEIR vulco.pdfInforme_mc_bombas_Warman_001-WEIR vulco.pdf
Informe_mc_bombas_Warman_001-WEIR vulco.pdf
 
Generaciones de Computadoras .
Generaciones de Computadoras                 .Generaciones de Computadoras                 .
Generaciones de Computadoras .
 
¿Cómo funciona el seguimiento por GPS y cómo puede ayudar al transporte y la ...
¿Cómo funciona el seguimiento por GPS y cómo puede ayudar al transporte y la ...¿Cómo funciona el seguimiento por GPS y cómo puede ayudar al transporte y la ...
¿Cómo funciona el seguimiento por GPS y cómo puede ayudar al transporte y la ...
 
400816850-Mantenimiento-de-Equipos-de-Espesamiento-pdf.pdf
400816850-Mantenimiento-de-Equipos-de-Espesamiento-pdf.pdf400816850-Mantenimiento-de-Equipos-de-Espesamiento-pdf.pdf
400816850-Mantenimiento-de-Equipos-de-Espesamiento-pdf.pdf
 
bomba-koomey -Todo sobre sus istema y conexiones
bomba-koomey -Todo sobre sus istema y conexionesbomba-koomey -Todo sobre sus istema y conexiones
bomba-koomey -Todo sobre sus istema y conexiones
 
DE LO HUMANO Y LO COMUNITARIO PROYECTO INTEGRADOR (2).docx
DE LO HUMANO Y LO COMUNITARIO PROYECTO INTEGRADOR (2).docxDE LO HUMANO Y LO COMUNITARIO PROYECTO INTEGRADOR (2).docx
DE LO HUMANO Y LO COMUNITARIO PROYECTO INTEGRADOR (2).docx
 
UiPath Community Data Service presentation
UiPath Community Data Service presentationUiPath Community Data Service presentation
UiPath Community Data Service presentation
 

Greach 2013 - Todo lo que me hubiera gustado saber cuando empecé a desarrollar con grails

  • 1. Todo lo que me hubiera gustado saber cuando empecé a desarrollar con Grails Iván López - @ilopmar “Oh finally, I can feel the power”
  • 2. ¿Quién soy? ● Iván López Martín @ilopmar ● Uso Grails/Groovy desde hace 3 años y Java desde hace muchos más. ● Creador de www.bokzuy.com ● Creador de plugins de grails (ducksboard-api y slug-generator) ● 3º en hackaton Grails48 con confspot.com ● Geek, Padre, Desarrollador, Sysadmin, Linuxero y Pro-Software libre ● Trabajo en Kaleidos
  • 4. Si, pero esto de qué va... Tiempo Google Stack Overflow Grails-user/ Noches sin Trabajo Blogs dormir efectivo
  • 5. ...de esto! Tiempo Google Stack Overflow Grails-user/ Noches sin Trabajo Porno Blogs dormir efectivo
  • 7. Domain ● Poner toda la lógica relacionada con el objeto que estamos tratando en su clase de dominio. ● Modelos anémicos vs Modelos Ricos. ● Usar namedQueries. ● No utilizar booleanos nullables: crear enums. ● Validadores personalizados en constraints.
  • 9. Controllers ● No poner lógica de negocio en controllers. ● Responsabilidades: - Recibir una petición. - Verificar los parámetros. - Llamar a un servicio (o varios) para obtener los datos. - Renderizar una respuesta (html, xml, json) o redirect. ● CommandObjects para data binding complejo. ● Los CommandObjects pueden heredar de otros.
  • 11. Servicios ● Lógica de negocio no implementada en domain. ● Si no es necesaria transaccionalidad static transactional = false ● Si es transaccional, no utilizar flush:true ● Tipos de los parámetros en los métodos y en valor de retorno. ● No closures porque no hay transaccionalidad. ● src/groovy
  • 13. Vistas ● KISS. ● Templates para las partes comunes de las páginas. ● Templates para elementos que se repitan. ● No intentar reutilizar templates con if's y pequeños hacks porque acaban siendo inmantenibles. ● No inyectar servicios: usar TagLib, Controller o Modelos Ricos.
  • 15. TagLibs ● Namespace específico para el proyecto o plugin static namespace = 'myNs' --> <myNs:myMethod /> ● Cálculos relativamente complejos para listas con renderización común. ● Generar respuesta HTML con template. ● Un TagLib se puede llamar desde un controller con myNs.myMethod
  • 16. I18N
  • 17. I18N ● Política de claves para messages.properties. Por ejemplo: pantalla.módulo.objeto-del-dominio.atributo ● Agrupar las claves por pantallas. ● ¡Respetar la política definida! ● ¡En serio! :-) ● Plurales: my.msg = {0,choice,0#No hay resultados|1#Sólo un  resultado|1<{0} resultados} <g:message code='my.msg' args="[numResults]" />
  • 19. URL Mappings ● Usar namedUrls. ● Filtrar los métodos aceptados (GET, POST,...) en url y no en static allowedMethods: 404 en lugar de 405. name oneProposal: "/proposal/$proposalId" {   controller = 'proposal';    action = [GET:'showProposal', POST:'updateProposal'] } <g:link mapping="oneProposal" params="[proposalId:entry.id]"> redirect mapping:'oneProposal',params:proposalId:proposal.id] url = grailsLinkGenerator.link(absolute:true,  mapping:'oneProposal', params:[proposalId:timeline.id])
  • 20. Tests
  • 21. Tests ● Hay que hacer tests, obvio ¿no? ;-) ● Spock. ● Servidor de Integración Continua: p.e. Jenkins. ● Plugins Fixtures y Build Test Data. ● Mejor Test Unitarios son más rápidos pero hay que mockear más. ● Usar BD final y no H2 en Integración. ● Vistas difíciles de testear, aproximación en Integración con controllers que hacen render template.
  • 23. Configuración ● Utilizar correctamente los entornos en Config.groovy. ● No subir a control de versiones archivos con configuración personal (usuarios, contraseñas,...). DataSource.groovy → DataSource.groovy.sample ● Crear archivo properties (aunque esté vacío inicialmente) para cambiar parámetros generar un nuevo war (p.e: producción). En Config.groovy: grails.config.locations = ["classpath:myconfig.properties"] ● No ejecutar grails install-plugin xxxxx, definir la dependencia en BuildConfig.groovy
  • 24. Logs
  • 25. Logs ● Es necesario que haya logs en la aplicación. ● No hay nada más frustante que una aplicación en producción en la que falla y no tenemos información en los logs para analizar el error. ● println está prohibido. Mejor log.debug, log.info,... ● Política de severidad de los mensajes y respetarla. ● Configurar por entorno el nivel mínimo de log mostrado.
  • 27. Apps complejas (I) ● La clave es Modularizar. ● El core en plugin común con clases de dominio y servicios comunes. ● Una aplicación diferente por “funcionalidad”: - Página web - Página para dispositivos móviles - API ● En estas aplicaciones importar el plugin inline.
  • 28. Apps complejas (II) ● Ventajas: - Distribuir la carga. - Separación clara de funcionalidades. ● Inconvenientes: - Más consumo de memoria - Aplicación más compleja - Despliegues más complejos - Ejecución de tests en varios proyectos ● ¡Aún así merece la pena!
  • 30. Rendimiento ● Relaciones xxx-to-many “automáticas” o “a mano”. ● Filtrar siempre que sea posible en la base de datos: def data = User.list().find { it.name == 'pepe' } // No   def data = User.findAllByName('pepe') // Sí def data = User.findAllByName('pepe', [cache:true]) ● Igual para obtener sólo el primer elemento, el último, los 3 últimos,... def data = (Company.list() as List).first() // No def data = Company.withCriteria { // Sí     order('date', 'desc')     maxResult(1)     cache true // si queremos cachear } ● Métodos específicos que hagan con count en la bd en lugar de list.size()
  • 32. “Un gran poder conlleva una gran responsabilidad” Benjamin Parker (Tío Ben) Iván López Martín @ilopmar lopez.ivan@gmail.com http://lopezivan.blogspot.com https://github.com/lmivan