SlideShare ist ein Scribd-Unternehmen logo
1 von 32
Downloaden Sie, um offline zu lesen
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

Weitere ähnliche Inhalte

Was ist angesagt?

Symfony2: Optimización y rendimiento
Symfony2: Optimización y rendimientoSymfony2: Optimización y rendimiento
Symfony2: Optimización y rendimientoRaul Fraile
 
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ónbetabeers
 
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 gitJan 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 poderosaFco Javier Núñez Berrocoso
 
Mantener Paquetes Debian en Equipo
Mantener Paquetes Debian en EquipoMantener Paquetes Debian en Equipo
Mantener Paquetes Debian en EquipoAlejandro 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 colaborativoAprende Git
 
Despliegue de aplicaciones PHP
Despliegue de aplicaciones PHPDespliegue de aplicaciones PHP
Despliegue de aplicaciones PHPAlicantePHP
 
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.Conferenciarails2008javier ramirez
 
NetBeans para Java, C, C++
NetBeans para Java, C, C++NetBeans para Java, C, C++
NetBeans para Java, C, C++Manuel Antonio
 
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 symfonyJuan Eladio Sánchez Rosas
 
Tutorial para crear_clases_genericas
Tutorial para crear_clases_genericasTutorial para crear_clases_genericas
Tutorial para crear_clases_genericasmargaritapereira
 
Curso Avanzado PHP para EHU/UPV
Curso Avanzado PHP para EHU/UPVCurso Avanzado PHP para EHU/UPV
Curso Avanzado PHP para EHU/UPVIrontec
 

Was ist angesagt? (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
 

Andere mochten auch

Andere mochten auch (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)
 

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

Django
DjangoDjango
Djangoykro
 
MobileCONGalicia Introducción a Android
MobileCONGalicia Introducción a AndroidMobileCONGalicia Introducción a Android
MobileCONGalicia Introducción a AndroidAlberto 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 frontendmenttes
 
Grails 2013 - PUCMM - Santiago - Sistemas
Grails 2013 - PUCMM - Santiago - SistemasGrails 2013 - PUCMM - Santiago - Sistemas
Grails 2013 - PUCMM - Santiago - SistemasCarlos 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 MadridJobsket
 
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 cakephpbetabeers
 
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 LAMPJavier Carranza
 
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 DjangoJuan Rodríguez
 
Programacion RPG: Conceptos ILE
Programacion RPG: Conceptos ILEProgramacion RPG: Conceptos ILE
Programacion RPG: Conceptos ILEGiovanny 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 drupalSiteGround 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 disponibilidadIván Campaña Naranjo
 
Taller introduccion symfony2
Taller introduccion symfony2Taller introduccion symfony2
Taller introduccion symfony2Mario IC
 
Taller de Django betabeers
Taller de Django betabeersTaller de Django betabeers
Taller de Django betabeersbetabeers
 

Ähnlich wie 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
 

Mehr von 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 TestcontainersIvá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 TestcontainersIvá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.pdfIván López Martín
 
VMware - Testcontainers y Spring Boot
VMware - Testcontainers y Spring BootVMware - Testcontainers y Spring Boot
VMware - Testcontainers y Spring BootIvá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 GatewayIvá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 BootIvá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 3Ivá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 GraalVMIvá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 AoTIvá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 MicronautIvá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 = <3Ivá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 = <3Ivá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 IDEAIvá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 perfectaIvá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 ConfigurationsIvá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 youIvá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 conocerteIván López Martín
 

Mehr von 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
 

Kürzlich hochgeladen

Excel (1) tecnologia.pdf trabajo Excel taller
Excel  (1) tecnologia.pdf trabajo Excel tallerExcel  (1) tecnologia.pdf trabajo Excel taller
Excel (1) tecnologia.pdf trabajo Excel tallerValentinaTabares11
 
TEMA 2 PROTOCOLO DE EXTRACCION VEHICULAR.ppt
TEMA 2 PROTOCOLO DE EXTRACCION VEHICULAR.pptTEMA 2 PROTOCOLO DE EXTRACCION VEHICULAR.ppt
TEMA 2 PROTOCOLO DE EXTRACCION VEHICULAR.pptJavierHerrera662252
 
Hernandez_Hernandez_Practica web de la sesion 11.pptx
Hernandez_Hernandez_Practica web de la sesion 11.pptxHernandez_Hernandez_Practica web de la sesion 11.pptx
Hernandez_Hernandez_Practica web de la sesion 11.pptxJOSEMANUELHERNANDEZH11
 
Explorando la historia y funcionamiento de la memoria ram
Explorando la historia y funcionamiento de la memoria ramExplorando la historia y funcionamiento de la memoria ram
Explorando la historia y funcionamiento de la memoria ramDIDIERFERNANDOGUERRE
 
El_Blog_como_herramienta_de_publicacion_y_consulta_de_investigacion.pptx
El_Blog_como_herramienta_de_publicacion_y_consulta_de_investigacion.pptxEl_Blog_como_herramienta_de_publicacion_y_consulta_de_investigacion.pptx
El_Blog_como_herramienta_de_publicacion_y_consulta_de_investigacion.pptxAlexander López
 
PARTES DE UN OSCILOSCOPIO ANALOGICO .pdf
PARTES DE UN OSCILOSCOPIO ANALOGICO .pdfPARTES DE UN OSCILOSCOPIO ANALOGICO .pdf
PARTES DE UN OSCILOSCOPIO ANALOGICO .pdfSergioMendoza354770
 
definicion segun autores de matemáticas educativa
definicion segun autores de matemáticas  educativadefinicion segun autores de matemáticas  educativa
definicion segun autores de matemáticas educativaAdrianaMartnez618894
 
Google-Meet-como-herramienta-para-realizar-reuniones-virtuales.pptx
Google-Meet-como-herramienta-para-realizar-reuniones-virtuales.pptxGoogle-Meet-como-herramienta-para-realizar-reuniones-virtuales.pptx
Google-Meet-como-herramienta-para-realizar-reuniones-virtuales.pptxAlexander López
 
El uso de las tic en la vida ,lo importante que son
El uso de las tic en la vida ,lo importante  que sonEl uso de las tic en la vida ,lo importante  que son
El uso de las tic en la vida ,lo importante que son241514984
 
El uso de las TIC's en la vida cotidiana.
El uso de las TIC's en la vida cotidiana.El uso de las TIC's en la vida cotidiana.
El uso de las TIC's en la vida cotidiana.241514949
 
LUXOMETRO EN SALUD OCUPACIONAL(FINAL).ppt
LUXOMETRO EN SALUD OCUPACIONAL(FINAL).pptLUXOMETRO EN SALUD OCUPACIONAL(FINAL).ppt
LUXOMETRO EN SALUD OCUPACIONAL(FINAL).pptchaverriemily794
 
Crear un recurso multimedia. Maricela_Ponce_DomingoM1S3AI6-1.pptx
Crear un recurso multimedia. Maricela_Ponce_DomingoM1S3AI6-1.pptxCrear un recurso multimedia. Maricela_Ponce_DomingoM1S3AI6-1.pptx
Crear un recurso multimedia. Maricela_Ponce_DomingoM1S3AI6-1.pptxNombre Apellidos
 
Mapa-conceptual-del-Origen-del-Universo-3.pptx
Mapa-conceptual-del-Origen-del-Universo-3.pptxMapa-conceptual-del-Origen-del-Universo-3.pptx
Mapa-conceptual-del-Origen-del-Universo-3.pptxMidwarHenryLOZAFLORE
 
Segunda ley de la termodinámica TERMODINAMICA.pptx
Segunda ley de la termodinámica TERMODINAMICA.pptxSegunda ley de la termodinámica TERMODINAMICA.pptx
Segunda ley de la termodinámica TERMODINAMICA.pptxMariaBurgos55
 
GonzalezGonzalez_Karina_M1S3AI6... .pptx
GonzalezGonzalez_Karina_M1S3AI6... .pptxGonzalezGonzalez_Karina_M1S3AI6... .pptx
GonzalezGonzalez_Karina_M1S3AI6... .pptx241523733
 
Medidas de formas, coeficiente de asimetría y coeficiente de curtosis.pptx
Medidas de formas, coeficiente de asimetría y coeficiente de curtosis.pptxMedidas de formas, coeficiente de asimetría y coeficiente de curtosis.pptx
Medidas de formas, coeficiente de asimetría y coeficiente de curtosis.pptxaylincamaho
 
La Electricidad Y La Electrónica Trabajo Tecnología.pdf
La Electricidad Y La Electrónica Trabajo Tecnología.pdfLa Electricidad Y La Electrónica Trabajo Tecnología.pdf
La Electricidad Y La Electrónica Trabajo Tecnología.pdfjeondanny1997
 
tics en la vida cotidiana prepa en linea modulo 1.pptx
tics en la vida cotidiana prepa en linea modulo 1.pptxtics en la vida cotidiana prepa en linea modulo 1.pptx
tics en la vida cotidiana prepa en linea modulo 1.pptxazmysanros90
 
Arenas Camacho-Practica tarea Sesión 12.pptx
Arenas Camacho-Practica tarea Sesión 12.pptxArenas Camacho-Practica tarea Sesión 12.pptx
Arenas Camacho-Practica tarea Sesión 12.pptxJOSEFERNANDOARENASCA
 
AREA TECNOLOGIA E INFORMATICA TRABAJO EN EQUIPO
AREA TECNOLOGIA E INFORMATICA TRABAJO EN EQUIPOAREA TECNOLOGIA E INFORMATICA TRABAJO EN EQUIPO
AREA TECNOLOGIA E INFORMATICA TRABAJO EN EQUIPOnarvaezisabella21
 

Kürzlich hochgeladen (20)

Excel (1) tecnologia.pdf trabajo Excel taller
Excel  (1) tecnologia.pdf trabajo Excel tallerExcel  (1) tecnologia.pdf trabajo Excel taller
Excel (1) tecnologia.pdf trabajo Excel taller
 
TEMA 2 PROTOCOLO DE EXTRACCION VEHICULAR.ppt
TEMA 2 PROTOCOLO DE EXTRACCION VEHICULAR.pptTEMA 2 PROTOCOLO DE EXTRACCION VEHICULAR.ppt
TEMA 2 PROTOCOLO DE EXTRACCION VEHICULAR.ppt
 
Hernandez_Hernandez_Practica web de la sesion 11.pptx
Hernandez_Hernandez_Practica web de la sesion 11.pptxHernandez_Hernandez_Practica web de la sesion 11.pptx
Hernandez_Hernandez_Practica web de la sesion 11.pptx
 
Explorando la historia y funcionamiento de la memoria ram
Explorando la historia y funcionamiento de la memoria ramExplorando la historia y funcionamiento de la memoria ram
Explorando la historia y funcionamiento de la memoria ram
 
El_Blog_como_herramienta_de_publicacion_y_consulta_de_investigacion.pptx
El_Blog_como_herramienta_de_publicacion_y_consulta_de_investigacion.pptxEl_Blog_como_herramienta_de_publicacion_y_consulta_de_investigacion.pptx
El_Blog_como_herramienta_de_publicacion_y_consulta_de_investigacion.pptx
 
PARTES DE UN OSCILOSCOPIO ANALOGICO .pdf
PARTES DE UN OSCILOSCOPIO ANALOGICO .pdfPARTES DE UN OSCILOSCOPIO ANALOGICO .pdf
PARTES DE UN OSCILOSCOPIO ANALOGICO .pdf
 
definicion segun autores de matemáticas educativa
definicion segun autores de matemáticas  educativadefinicion segun autores de matemáticas  educativa
definicion segun autores de matemáticas educativa
 
Google-Meet-como-herramienta-para-realizar-reuniones-virtuales.pptx
Google-Meet-como-herramienta-para-realizar-reuniones-virtuales.pptxGoogle-Meet-como-herramienta-para-realizar-reuniones-virtuales.pptx
Google-Meet-como-herramienta-para-realizar-reuniones-virtuales.pptx
 
El uso de las tic en la vida ,lo importante que son
El uso de las tic en la vida ,lo importante  que sonEl uso de las tic en la vida ,lo importante  que son
El uso de las tic en la vida ,lo importante que son
 
El uso de las TIC's en la vida cotidiana.
El uso de las TIC's en la vida cotidiana.El uso de las TIC's en la vida cotidiana.
El uso de las TIC's en la vida cotidiana.
 
LUXOMETRO EN SALUD OCUPACIONAL(FINAL).ppt
LUXOMETRO EN SALUD OCUPACIONAL(FINAL).pptLUXOMETRO EN SALUD OCUPACIONAL(FINAL).ppt
LUXOMETRO EN SALUD OCUPACIONAL(FINAL).ppt
 
Crear un recurso multimedia. Maricela_Ponce_DomingoM1S3AI6-1.pptx
Crear un recurso multimedia. Maricela_Ponce_DomingoM1S3AI6-1.pptxCrear un recurso multimedia. Maricela_Ponce_DomingoM1S3AI6-1.pptx
Crear un recurso multimedia. Maricela_Ponce_DomingoM1S3AI6-1.pptx
 
Mapa-conceptual-del-Origen-del-Universo-3.pptx
Mapa-conceptual-del-Origen-del-Universo-3.pptxMapa-conceptual-del-Origen-del-Universo-3.pptx
Mapa-conceptual-del-Origen-del-Universo-3.pptx
 
Segunda ley de la termodinámica TERMODINAMICA.pptx
Segunda ley de la termodinámica TERMODINAMICA.pptxSegunda ley de la termodinámica TERMODINAMICA.pptx
Segunda ley de la termodinámica TERMODINAMICA.pptx
 
GonzalezGonzalez_Karina_M1S3AI6... .pptx
GonzalezGonzalez_Karina_M1S3AI6... .pptxGonzalezGonzalez_Karina_M1S3AI6... .pptx
GonzalezGonzalez_Karina_M1S3AI6... .pptx
 
Medidas de formas, coeficiente de asimetría y coeficiente de curtosis.pptx
Medidas de formas, coeficiente de asimetría y coeficiente de curtosis.pptxMedidas de formas, coeficiente de asimetría y coeficiente de curtosis.pptx
Medidas de formas, coeficiente de asimetría y coeficiente de curtosis.pptx
 
La Electricidad Y La Electrónica Trabajo Tecnología.pdf
La Electricidad Y La Electrónica Trabajo Tecnología.pdfLa Electricidad Y La Electrónica Trabajo Tecnología.pdf
La Electricidad Y La Electrónica Trabajo Tecnología.pdf
 
tics en la vida cotidiana prepa en linea modulo 1.pptx
tics en la vida cotidiana prepa en linea modulo 1.pptxtics en la vida cotidiana prepa en linea modulo 1.pptx
tics en la vida cotidiana prepa en linea modulo 1.pptx
 
Arenas Camacho-Practica tarea Sesión 12.pptx
Arenas Camacho-Practica tarea Sesión 12.pptxArenas Camacho-Practica tarea Sesión 12.pptx
Arenas Camacho-Practica tarea Sesión 12.pptx
 
AREA TECNOLOGIA E INFORMATICA TRABAJO EN EQUIPO
AREA TECNOLOGIA E INFORMATICA TRABAJO EN EQUIPOAREA TECNOLOGIA E INFORMATICA TRABAJO EN EQUIPO
AREA TECNOLOGIA E INFORMATICA TRABAJO EN EQUIPO
 

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