SlideShare una empresa de Scribd logo
1 de 32
Descargar para leer sin conexión
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 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
 

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 (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
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
 

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

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

CLASE DE TECNOLOGIA E INFORMATICA PRIMARIA
CLASE  DE TECNOLOGIA E INFORMATICA PRIMARIACLASE  DE TECNOLOGIA E INFORMATICA PRIMARIA
CLASE DE TECNOLOGIA E INFORMATICA PRIMARIAWilbisVega
 
Herramientas de corte de alta velocidad.pptx
Herramientas de corte de alta velocidad.pptxHerramientas de corte de alta velocidad.pptx
Herramientas de corte de alta velocidad.pptxRogerPrieto3
 
KELA Presentacion Costa Rica 2024 - evento Protégeles
KELA Presentacion Costa Rica 2024 - evento ProtégelesKELA Presentacion Costa Rica 2024 - evento Protégeles
KELA Presentacion Costa Rica 2024 - evento ProtégelesFundación YOD YOD
 
Global Azure Lima 2024 - Integración de Datos con Microsoft Fabric
Global Azure Lima 2024 - Integración de Datos con Microsoft FabricGlobal Azure Lima 2024 - Integración de Datos con Microsoft Fabric
Global Azure Lima 2024 - Integración de Datos con Microsoft FabricKeyla Dolores Méndez
 
guía de registro de slideshare por Brayan Joseph
guía de registro de slideshare por Brayan Josephguía de registro de slideshare por Brayan Joseph
guía de registro de slideshare por Brayan JosephBRAYANJOSEPHPEREZGOM
 
POWER POINT YUCRAElabore una PRESENTACIÓN CORTA sobre el video película: La C...
POWER POINT YUCRAElabore una PRESENTACIÓN CORTA sobre el video película: La C...POWER POINT YUCRAElabore una PRESENTACIÓN CORTA sobre el video película: La C...
POWER POINT YUCRAElabore una PRESENTACIÓN CORTA sobre el video película: La C...silviayucra2
 
EPA-pdf resultado da prova presencial Uninove
EPA-pdf resultado da prova presencial UninoveEPA-pdf resultado da prova presencial Uninove
EPA-pdf resultado da prova presencial UninoveFagnerLisboa3
 
Presentación guía sencilla en Microsoft Excel.pptx
Presentación guía sencilla en Microsoft Excel.pptxPresentación guía sencilla en Microsoft Excel.pptx
Presentación guía sencilla en Microsoft Excel.pptxLolaBunny11
 
trabajotecologiaisabella-240424003133-8f126965.pdf
trabajotecologiaisabella-240424003133-8f126965.pdftrabajotecologiaisabella-240424003133-8f126965.pdf
trabajotecologiaisabella-240424003133-8f126965.pdfIsabellaMontaomurill
 
9egb-lengua y Literatura.pdf_texto del estudiante
9egb-lengua y Literatura.pdf_texto del estudiante9egb-lengua y Literatura.pdf_texto del estudiante
9egb-lengua y Literatura.pdf_texto del estudianteAndreaHuertas24
 
Trabajo Mas Completo De Excel en clase tecnología
Trabajo Mas Completo De Excel en clase tecnologíaTrabajo Mas Completo De Excel en clase tecnología
Trabajo Mas Completo De Excel en clase tecnologíassuserf18419
 
Proyecto integrador. Las TIC en la sociedad S4.pptx
Proyecto integrador. Las TIC en la sociedad S4.pptxProyecto integrador. Las TIC en la sociedad S4.pptx
Proyecto integrador. Las TIC en la sociedad S4.pptx241521559
 
pruebas unitarias unitarias en java con JUNIT
pruebas unitarias unitarias en java con JUNITpruebas unitarias unitarias en java con JUNIT
pruebas unitarias unitarias en java con JUNITMaricarmen Sánchez Ruiz
 
Redes direccionamiento y subredes ipv4 2024 .pdf
Redes direccionamiento y subredes ipv4 2024 .pdfRedes direccionamiento y subredes ipv4 2024 .pdf
Redes direccionamiento y subredes ipv4 2024 .pdfsoporteupcology
 
International Women's Day Sucre 2024 (IWD)
International Women's Day Sucre 2024 (IWD)International Women's Day Sucre 2024 (IWD)
International Women's Day Sucre 2024 (IWD)GDGSucre
 

Último (15)

CLASE DE TECNOLOGIA E INFORMATICA PRIMARIA
CLASE  DE TECNOLOGIA E INFORMATICA PRIMARIACLASE  DE TECNOLOGIA E INFORMATICA PRIMARIA
CLASE DE TECNOLOGIA E INFORMATICA PRIMARIA
 
Herramientas de corte de alta velocidad.pptx
Herramientas de corte de alta velocidad.pptxHerramientas de corte de alta velocidad.pptx
Herramientas de corte de alta velocidad.pptx
 
KELA Presentacion Costa Rica 2024 - evento Protégeles
KELA Presentacion Costa Rica 2024 - evento ProtégelesKELA Presentacion Costa Rica 2024 - evento Protégeles
KELA Presentacion Costa Rica 2024 - evento Protégeles
 
Global Azure Lima 2024 - Integración de Datos con Microsoft Fabric
Global Azure Lima 2024 - Integración de Datos con Microsoft FabricGlobal Azure Lima 2024 - Integración de Datos con Microsoft Fabric
Global Azure Lima 2024 - Integración de Datos con Microsoft Fabric
 
guía de registro de slideshare por Brayan Joseph
guía de registro de slideshare por Brayan Josephguía de registro de slideshare por Brayan Joseph
guía de registro de slideshare por Brayan Joseph
 
POWER POINT YUCRAElabore una PRESENTACIÓN CORTA sobre el video película: La C...
POWER POINT YUCRAElabore una PRESENTACIÓN CORTA sobre el video película: La C...POWER POINT YUCRAElabore una PRESENTACIÓN CORTA sobre el video película: La C...
POWER POINT YUCRAElabore una PRESENTACIÓN CORTA sobre el video película: La C...
 
EPA-pdf resultado da prova presencial Uninove
EPA-pdf resultado da prova presencial UninoveEPA-pdf resultado da prova presencial Uninove
EPA-pdf resultado da prova presencial Uninove
 
Presentación guía sencilla en Microsoft Excel.pptx
Presentación guía sencilla en Microsoft Excel.pptxPresentación guía sencilla en Microsoft Excel.pptx
Presentación guía sencilla en Microsoft Excel.pptx
 
trabajotecologiaisabella-240424003133-8f126965.pdf
trabajotecologiaisabella-240424003133-8f126965.pdftrabajotecologiaisabella-240424003133-8f126965.pdf
trabajotecologiaisabella-240424003133-8f126965.pdf
 
9egb-lengua y Literatura.pdf_texto del estudiante
9egb-lengua y Literatura.pdf_texto del estudiante9egb-lengua y Literatura.pdf_texto del estudiante
9egb-lengua y Literatura.pdf_texto del estudiante
 
Trabajo Mas Completo De Excel en clase tecnología
Trabajo Mas Completo De Excel en clase tecnologíaTrabajo Mas Completo De Excel en clase tecnología
Trabajo Mas Completo De Excel en clase tecnología
 
Proyecto integrador. Las TIC en la sociedad S4.pptx
Proyecto integrador. Las TIC en la sociedad S4.pptxProyecto integrador. Las TIC en la sociedad S4.pptx
Proyecto integrador. Las TIC en la sociedad S4.pptx
 
pruebas unitarias unitarias en java con JUNIT
pruebas unitarias unitarias en java con JUNITpruebas unitarias unitarias en java con JUNIT
pruebas unitarias unitarias en java con JUNIT
 
Redes direccionamiento y subredes ipv4 2024 .pdf
Redes direccionamiento y subredes ipv4 2024 .pdfRedes direccionamiento y subredes ipv4 2024 .pdf
Redes direccionamiento y subredes ipv4 2024 .pdf
 
International Women's Day Sucre 2024 (IWD)
International Women's Day Sucre 2024 (IWD)International Women's Day Sucre 2024 (IWD)
International Women's Day Sucre 2024 (IWD)
 

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