Súper interesante y util, hay muy pocos que sean recientes y en español respecto a este tema. Sólo una recomendación, las redes sociales apareciendo en la esquina izquierda abajo (constantemente) a mí me distraen muchísimo y me cuesta concentrarme en lo que estás diciendo. No sé si a otros les pasa pero quizás podrían aparecer ocasionalmente o con mucha menos frecuencia. De todos modos es sólo un detalle, gracias por la info y por este canal 🙆♂✌💯
¡Gracias por tu comentario! Puede ser que tengas razón, echaré un vistazo a ver cómo podría hacerlo de otra forma. Un placer de que mis vídeos te ayuden 😄✌️
Como siempre magnifico, tengo una duda si podrias hacer un video haciendo inyeccion de dependencias por constructor pero masiva donde se manejen de unas 10 dependencias en adelante, esto haciendo referencia que un proyecto ya estaba construido de esa manera con pura etiqueta AUTOWIRED y simplemente quisiera cambiar de una mejor manera la estructuracion, gracias.
¡Muchas gracias por tu comentario de ánimo! Sobre el problema que describes, no existe de por sí una solución, el problema que veo es que el proyecto no está bien pensado en forma de arquitectura y tienes una clase que se dedica a realizar diferentes tipos de lógica de negocio en vez de tenerlas separadas de forma que se delegue a cada servicio su función específica. La solución que veo es tener que refactorizar la clase y delegar funcionalidades. Espero que se haya entendido cómo lo he explicado, si no házmelo saber. ¡Un saludo! 😉
Hola, excelente explicación, para el aspecto de guardar los datos en BD, igual primero caen lo datos en UsuarioDTO luego pasa a DTO para guardar? o se crea otro dto especial para guardar los datos.
¡Hola! No sé si te he entendido correctamente pero creo que estás confundiendo “DTO” con “Entity”, Entity es la class que representa una entidad (tabla) en la base de datos, un DTO es una representación de la información que quieres pasar entre capas de tu proyecto. ¿Quizás así es más claro? Dime si te sirve :)
Tengo una duda, bueno, más bien quiero una opinión. Para mí proyecto de grado me pidieron hacer un sistema bancario. Mi base de datos ya estaba construida y funcionando y tenía mis clases entidades de las tablas. Supuse que la seguridad de los datos era lo más importante y que esos registros de la base de datos no salgan de la capa de datos así que dentro de la capa de datos tenia varios métodos que encriptaban los datos mas sensibles como números de tarjetas o contraseñas. El objeto encriptado contenía todos los campos del registro y pasaba a la capa de negocio donde hacia todo lo que tenía que hacer. Decidí dejar intactos los datos de menor importancia como el nombre y apellido para presentarlos tranquilamente en la capa de visualización. Creo que sin ser consciente aplicaba el patrón dto pero, este planteamiento de usar un registro completo encriptado es lo correcto? Tome la decisión de encriptarlo porque en caso de hacer operaciones de bajo nivel como actualizar contraseñas o consultar ahorros me facilitarian mucho la tarea de tener hacer estas operaciones sin tener que volcer a consultar a la base de datos. Esto que hago está bien?
Está bastante bien pensado y es como debería ser ya que como explicas no quieres que otras capas “sepan” de algún tipo de información y puedes utilizar la encapsulación para poder modificar esos datos como también comentas. Si quieres una opinión, para un proyecto de cara a un negocio es mejor que deleges el guardado de las contraseñas o datos sensibles ya que si quisieras tú añadir la seguridad puede ser un tema bastante delicado. ¡Espero que sigas así! Si necesitas algo más, no dudes en comentar 😎✌️
Hay alguna diferencia entre modelo y entidad? por ejemplo yo en javascript/typescript, al usar prisma o mongoose, primero creo un modelo, que luego se crea en la base de datos y la entidad es de como se va a "comportar" en mi backend, ya sea agregando mas cosas para algo en concreto... y mi dto por ejemplo al registrar un usuario solo tiene, nombre, email, password.... asi tambien pasa en spring boot? ya que en el video sale entidad y se relaciona con las columnas de una base de datos.
Buena pregunta, es posible que se use de forma sinónima, pero el modelo es más en concreto a lo que es el diseño de la base de datos y la entidad es la tabla en sí. En Spring Boot no hace falta crear ningún tipo de "modelo" cómo en prisma, al crear las clases de entidades Spring ya es capaz de crear el modelo de la base de datos. En prisma se crea un "modelo" con archivos ya que es un frameworks diseñado para poder ser usado por diferentes lenguajes de programación y te generan las entidades según el modelo creado, en Spring Boot no. ¡Un saludo! 😎
¡Hola, gracias por el comentario! Desgraciadamente no existe una ruta, pero existe un curso gratuito de Java que puedes encontrar en el primer comentario :). Un saludo
Hola Ricardo! Gracias por tan buenos videos! estoy siguiendo el tema viendo los records y mappers, creo son imprecindibles para usarse con el patron de diseño DTO. Tengo una duda relacionada aunque no corresponde al video: Cual es la convención para los paquetes del patrón Controller-Service-Repository: Se ubican las clases en los mismos según la entidad (y sus clases relacionadas)? o se generan paquetes según la capa (com.aaa.controller / com.aaa.repo) y se ponen las clases correspondientes, priorizando la función de la clase más que la entidad en la que se enfonca. Ojalá se haya entendido y puedas absolver mi duda. Mil gracias!!!
¡Hola! Es una buena pregunta existen diferente forma de estructurar tu proyecto, por norma general existen dos formas de estructurar nuestro proyecto Package By Feature y Package By Layer, como indicaste. La decisión depende de ti como programador o arquitecto, pero para mí, si el proyecto va a ser monolito o va a contener bastantes funcionalidades suelo preferir "by feature" si es pequeño, "by layer" creo que es suficiente. ¡Espero te ayude la respuesta! 🫡
Exacto, en los DTO deberíamos de tener los datos que necesitamos, hay que tener cuidado de exponer aquellos que pueden traer problemas de seguridad, como las claves primarias o FK, como mencionas 😉🤘
¡Hey gracias por tu comentario! ¿A qué te refieres exactamente cuándo retorna varios registros? Si es hacer dos consultas a la base de datos, es posible crear un DTO que contenga ambos ambos en una sola clase 😉
@@programando_en_java dentro de un DTO tengo los atributos de la clase(esta contiene un clase relacionada.tmb) y tmb quiero mostrar los datos de la clase relacionada , pero solo para mostrar informacion solo get , sin persistir en la base de datos, esto es un Dto tambien? ,
@@leonardohuaca7146 ¡Hola! Creo que no he entendido exactamente tu pregunta, creo que estas hablando de Entidades y lo estás mezclando con un DTO, pero realmente no he entendido tu mensaje, ¿podrías volver a explicarlo, por favor?
@@programando_en_java Hola , si entendi , pero como se puede retornar un objeto vacio en vez de un null cuando este no se encuentre en la database (intente con los empty pero igual sale null ) Optional userById= user.findById(id); -respuesta json , quiero q me salga asi {} en vez del null { dataUsuario : null } { dataUsuario : {} }
@@leonardohuaca7146 ¡Ya veo! Te explico, Java es un lenguaje fuertemente en la orientación a objectos, eso quiere decir que no es tan flexible cómo puede ser javascript para enviar objectos vacíos. La única forma de enviar un objecto vacío, es decir '{}' tienes que tener una clase sin ningún atributo o indicar a través de anotaciones, cómo por ejemplo si usas Jackson, la anotación @JsonIgnore, otra forma es crear el JSON en formato String por ti mismo y enviarlo de vuelta. No sé exactamente cómo lo estas haciendo, pero entiendo que puedes estar usando Spring Boot para devolver un Json. Si tienes más dudas, házmelo saber ;)
Hola, muy buena explicacion felicidades. He visto videos donde explican esto de los DTO, pero veo que crean un interfaz le llaman wrapper creo, donde transforman las entidades en dto. En este ejemplo que nos explics no lo usaste de esa manera. Porque? Es mejor manejarlo con una interfaz para transformar las entidades a dto o viceversa?
Los DAO son clases que se encargan del manejo y acceso de la base de datos, los DTO se encarga de el envío de información entre capas de nuestro proyecto. No sé si se entenderá pero si no házmelo saber 😉
@@programando_en_java El concepto esta claro pero no me queda claro como se integra en una API Es decir usaría objetos DTO en la clase Controller y objetos DAO en la clase de servicios o como seria?
@aamb_c133 las clases DAO son clases con lógica para la base de datos, los DTO son clases con estructura de información sin lógica, los DTO se usan tanto en los controllers como en los servicios, los DAO para la capa de persistencia donde se usa las clases de entidades 🙏😄
Bastante claro el video, tengo dos preguntas, ¿en que paquete deberían estar los DTOs, service o controller? Y algo más si supongamos quiero de la misma entidad exponer de dos maneras diferentes sus datos ¿Es correcto crear 2 DTOs para esa entidad ó lo suyo sería usar los getters de un único DTO?
¡Buenas preguntas! Puedes crear un paquete nuevo que sea “dtos” o si son solamente unos cuantos puedes almacenarlos en el paquete “service” aquellos que están relacionados con los “services” y en “controller” aquellos relacionados con los “controllers”. ¡Claro que es correcto! Si crees que es necesario y tiene sentido tener 2 DTOs para no mostrar a otra capa información adicional, no veo por qué estaría mal 😉✌️
🔔 ¡Ayúdame a llegar a 50.000 subs! 👉 2ly.link/20Hmi
🎉 APÓYAME 👉 2ly.link/20HnV
📩 NEWSLETTER SEMANAL 👉 2ly.link/21fmf
🎯 MENTORIA 👉 2ly.link/20FqN
🎁 CURSO GRATUITO de JAVA 👉 2ly.link/20Hme
🎁 CURSO GRATUITO de SPRING BOOT 👉 2ly.link/20HmM
📱Redes Sociales 👉 2ly.link/20Hmg
Gracias por la explicación sobre el patrón DTO en Java. Me ayudó mucho a entender el tema. ¡Buen trabajo!
¡Un gran placer!
carnal , no manches me encantan tus videos estoy aprendiendo mas ahorita estos conceptos que cuando inicie hace 10 años
Súper interesante y util, hay muy pocos que sean recientes y en español respecto a este tema. Sólo una recomendación, las redes sociales apareciendo en la esquina izquierda abajo (constantemente) a mí me distraen muchísimo y me cuesta concentrarme en lo que estás diciendo. No sé si a otros les pasa pero quizás podrían aparecer ocasionalmente o con mucha menos frecuencia. De todos modos es sólo un detalle, gracias por la info y por este canal 🙆♂✌💯
¡Gracias por tu comentario! Puede ser que tengas razón, echaré un vistazo a ver cómo podría hacerlo de otra forma. Un placer de que mis vídeos te ayuden 😄✌️
Muy interesante, muchas gracias!
¡Gracias a ti por seguir por aquí y darme ánimos! 😉
Que buena explicación, muchas gracias!
Gracias muy clara tu explicación. Saludos
¡Muchas gracias, me alegro que te haya servido! :)
Excelente amigo!!!
Como siempre magnifico, tengo una duda si podrias hacer un video haciendo inyeccion de dependencias por constructor pero masiva donde se manejen de unas 10 dependencias en adelante, esto haciendo referencia que un proyecto ya estaba construido de esa manera con pura etiqueta AUTOWIRED y simplemente quisiera cambiar de una mejor manera la estructuracion, gracias.
¡Muchas gracias por tu comentario de ánimo! Sobre el problema que describes, no existe de por sí una solución, el problema que veo es que el proyecto no está bien pensado en forma de arquitectura y tienes una clase que se dedica a realizar diferentes tipos de lógica de negocio en vez de tenerlas separadas de forma que se delegue a cada servicio su función específica. La solución que veo es tener que refactorizar la clase y delegar funcionalidades.
Espero que se haya entendido cómo lo he explicado, si no házmelo saber. ¡Un saludo! 😉
Hola, excelente explicación, para el aspecto de guardar los datos en BD, igual primero caen lo datos en UsuarioDTO luego pasa a DTO para guardar? o se crea otro dto especial para guardar los datos.
¡Hola! No sé si te he entendido correctamente pero creo que estás confundiendo “DTO” con “Entity”, Entity es la class que representa una entidad (tabla) en la base de datos, un DTO es una representación de la información que quieres pasar entre capas de tu proyecto.
¿Quizás así es más claro? Dime si te sirve :)
Tengo una duda, bueno, más bien quiero una opinión. Para mí proyecto de grado me pidieron hacer un sistema bancario. Mi base de datos ya estaba construida y funcionando y tenía mis clases entidades de las tablas. Supuse que la seguridad de los datos era lo más importante y que esos registros de la base de datos no salgan de la capa de datos así que dentro de la capa de datos tenia varios métodos que encriptaban los datos mas sensibles como números de tarjetas o contraseñas. El objeto encriptado contenía todos los campos del registro y pasaba a la capa de negocio donde hacia todo lo que tenía que hacer. Decidí dejar intactos los datos de menor importancia como el nombre y apellido para presentarlos tranquilamente en la capa de visualización. Creo que sin ser consciente aplicaba el patrón dto pero, este planteamiento de usar un registro completo encriptado es lo correcto? Tome la decisión de encriptarlo porque en caso de hacer operaciones de bajo nivel como actualizar contraseñas o consultar ahorros me facilitarian mucho la tarea de tener hacer estas operaciones sin tener que volcer a consultar a la base de datos. Esto que hago está bien?
Está bastante bien pensado y es como debería ser ya que como explicas no quieres que otras capas “sepan” de algún tipo de información y puedes utilizar la encapsulación para poder modificar esos datos como también comentas.
Si quieres una opinión, para un proyecto de cara a un negocio es mejor que deleges el guardado de las contraseñas o datos sensibles ya que si quisieras tú añadir la seguridad puede ser un tema bastante delicado.
¡Espero que sigas así! Si necesitas algo más, no dudes en comentar 😎✌️
Hay alguna diferencia entre modelo y entidad? por ejemplo yo en javascript/typescript, al usar prisma o mongoose, primero creo un modelo, que luego se crea en la base de datos y la entidad es de como se va a "comportar" en mi backend, ya sea agregando mas cosas para algo en concreto... y mi dto por ejemplo al registrar un usuario solo tiene, nombre, email, password.... asi tambien pasa en spring boot? ya que en el video sale entidad y se relaciona con las columnas de una base de datos.
Buena pregunta, es posible que se use de forma sinónima, pero el modelo es más en concreto a lo que es el diseño de la base de datos y la entidad es la tabla en sí. En Spring Boot no hace falta crear ningún tipo de "modelo" cómo en prisma, al crear las clases de entidades Spring ya es capaz de crear el modelo de la base de datos.
En prisma se crea un "modelo" con archivos ya que es un frameworks diseñado para poder ser usado por diferentes lenguajes de programación y te generan las entidades según el modelo creado, en Spring Boot no.
¡Un saludo! 😎
@@programando_en_java genial, muchas gracias 😁
Una pregunta tienen una hoja de ruta de los videos para aprender java hasta spring boot
¡Hola, gracias por el comentario! Desgraciadamente no existe una ruta, pero existe un curso gratuito de Java que puedes encontrar en el primer comentario :).
Un saludo
Hola Ricardo! Gracias por tan buenos videos! estoy siguiendo el tema viendo los records y mappers, creo son imprecindibles para usarse con el patron de diseño DTO.
Tengo una duda relacionada aunque no corresponde al video: Cual es la convención para los paquetes del patrón Controller-Service-Repository: Se ubican las clases en los mismos según la entidad (y sus clases relacionadas)? o se generan paquetes según la capa (com.aaa.controller / com.aaa.repo) y se ponen las clases correspondientes, priorizando la función de la clase más que la entidad en la que se enfonca. Ojalá se haya entendido y puedas absolver mi duda. Mil gracias!!!
¡Hola! Es una buena pregunta existen diferente forma de estructurar tu proyecto, por norma general existen dos formas de estructurar nuestro proyecto Package By Feature y Package By Layer, como indicaste. La decisión depende de ti como programador o arquitecto, pero para mí, si el proyecto va a ser monolito o va a contener bastantes funcionalidades suelo preferir "by feature" si es pequeño, "by layer" creo que es suficiente.
¡Espero te ayude la respuesta! 🫡
No es necesario tener todos los atributos de la entity en la DTO, en especial a las FK, no?
Exacto, en los DTO deberíamos de tener los datos que necesitamos, hay que tener cuidado de exponer aquellos que pueden traer problemas de seguridad, como las claves primarias o FK, como mencionas 😉🤘
hola genial la explicacion mas claro que el agua ajajaja. cambiando de tema que fuente estas usando?
¡Gracias a ti! Pues sinceramente no lo sé, es la que viene por defecto con el IDE jaja :)
Buena explicacion,, como manejas el DTO cuando retorna varios registros?
¡Hey gracias por tu comentario! ¿A qué te refieres exactamente cuándo retorna varios registros? Si es hacer dos consultas a la base de datos, es posible crear un DTO que contenga ambos ambos en una sola clase 😉
@@programando_en_java dentro de un DTO tengo los atributos de la clase(esta contiene un clase relacionada.tmb) y tmb quiero mostrar los datos de la clase relacionada , pero solo para mostrar informacion solo get , sin persistir en la base de datos, esto es un Dto tambien? ,
@@leonardohuaca7146 ¡Hola! Creo que no he entendido exactamente tu pregunta, creo que estas hablando de Entidades y lo estás mezclando con un DTO, pero realmente no he entendido tu mensaje, ¿podrías volver a explicarlo, por favor?
@@programando_en_java Hola , si entendi , pero como se puede retornar un objeto vacio en vez de un null cuando este no se encuentre en la database (intente con los empty pero igual sale null ) Optional userById= user.findById(id);
-respuesta json , quiero q me salga asi {} en vez del null
{
dataUsuario : null
}
{
dataUsuario : {}
}
@@leonardohuaca7146 ¡Ya veo! Te explico, Java es un lenguaje fuertemente en la orientación a objectos, eso quiere decir que no es tan flexible cómo puede ser javascript para enviar objectos vacíos.
La única forma de enviar un objecto vacío, es decir '{}' tienes que tener una clase sin ningún atributo o indicar a través de anotaciones, cómo por ejemplo si usas Jackson, la anotación @JsonIgnore, otra forma es crear el JSON en formato String por ti mismo y enviarlo de vuelta.
No sé exactamente cómo lo estas haciendo, pero entiendo que puedes estar usando Spring Boot para devolver un Json.
Si tienes más dudas, házmelo saber ;)
Hola, muy buena explicacion felicidades. He visto videos donde explican esto de los DTO, pero veo que crean un interfaz le llaman wrapper creo, donde transforman las entidades en dto. En este ejemplo que nos explics no lo usaste de esa manera. Porque? Es mejor manejarlo con una interfaz para transformar las entidades a dto o viceversa?
¡Hola! Ahora mismo no sé cómo sería, ¿tienes algún ejemplo? Así podría ver por qué usan una interfaz en el DTO y Entity
Yo suelo utilizar mapStructs para el mapeo de entidades a dto y viceversa, es muy fácil de utilizar
buenas cual es la diferencia con el patrón de diseño DAO?
Los DAO son clases que se encargan del manejo y acceso de la base de datos, los DTO se encarga de el envío de información entre capas de nuestro proyecto.
No sé si se entenderá pero si no házmelo saber 😉
@@programando_en_java El concepto esta claro pero no me queda claro como se integra en una API
Es decir usaría objetos DTO en la clase Controller y objetos DAO en la clase de servicios
o como seria?
@aamb_c133 las clases DAO son clases con lógica para la base de datos, los DTO son clases con estructura de información sin lógica, los DTO se usan tanto en los controllers como en los servicios, los DAO para la capa de persistencia donde se usa las clases de entidades 🙏😄
@@programando_en_java Osea que DAO los usaría para no tener que trabajar directamente con las entidades
@aamb_c133 ¿directamente? Los DAO trabajan con las entidades :)
Hola! Gracias por tu contenido!! Tengo una duda: por qué siempre usas final en lugar de private en los atributos?
Utilizo final para definir que los atributos de la clase sean inmutables, también puedes marcarlos como private :)
Bastante claro el video, tengo dos preguntas, ¿en que paquete deberían estar los DTOs, service o controller?
Y algo más si supongamos quiero de la misma entidad exponer de dos maneras diferentes sus datos ¿Es correcto crear 2 DTOs para esa entidad ó lo suyo sería usar los getters de un único DTO?
¡Buenas preguntas! Puedes crear un paquete nuevo que sea “dtos” o si son solamente unos cuantos puedes almacenarlos en el paquete “service” aquellos que están relacionados con los “services” y en “controller” aquellos relacionados con los “controllers”.
¡Claro que es correcto! Si crees que es necesario y tiene sentido tener 2 DTOs para no mostrar a otra capa información adicional, no veo por qué estaría mal 😉✌️
@@programando_en_java Muchas gracias por tu respuesta, me gustó tu canal, suscrito.
@@TheMiguel18 Yo las coloco en service en unc carpeta dto
Porque le llaman patron si solo es un puente entre la entidad y el service?