Registro de decisiones - AlbertoMunozP/Parking-Management-System-Springboot GitHub Wiki

Arquitectura del Sistema: Core y API HTTP

  • Estado: aceptada
  • Fecha: 2024-03-21

Contexto y Declaración del Problema

Se necesita diseñar una arquitectura modular para facilitar el desarrollo y mantenimiento del sistema de gestión de aparcamientos.

Factores de Decisión

  • Necesidad de una separación clara de responsabilidades
  • Facilitar el desarrollo y mantenimiento del sistema
  • Posibilidad de escalabilidad futura

Opciones Consideradas

  • Monolito
  • Microservicios
  • Arquitectura modular (Core y API HTTP)

Resultado de la Decisión

Opción elegida: "Arquitectura modular (Core y API HTTP)", porque permite una separación clara de responsabilidades y facilita el mantenimiento y la escalabilidad del sistema.

Consecuencias Positivas

  • Separación clara de responsabilidades
  • Mantenimiento más fácil
  • Posibilidad de escalabilidad futura

Consecuencias Negativas

  • Requiere una planificación inicial cuidadosa
  • Puede ser más complejo de implementar en comparación con un monolito

Pros y Contras de las Opciones

Monolito

  • Pros
    • Sencillo de implementar inicialmente
    • Menor complejidad en la configuración inicial
  • Contras
    • Dificultad para escalar
    • Mantenimiento complicado a medida que el sistema crece

Microservicios

  • Pros
    • Alta escalabilidad
    • Independencia de servicios
  • Contras
    • Mayor complejidad de implementación
    • Requiere una gestión de infraestructura más avanzada

Arquitectura modular (Core y API HTTP)

  • Pros
    • Separación clara de responsabilidades
    • Facilita el mantenimiento y la escalabilidad
  • Contras
    • Requiere una planificación inicial cuidadosa
    • Puede ser más complejo de implementar en comparación con un monolito

Nota

El equipo decidió usar una arquitectura modular para permitir una mejor separación de responsabilidades y facilitar el mantenimiento del sistema.

Gestión de Dependencias: Maven

  • Estado: aceptada
  • Fecha: 2024-03-21

Contexto y Declaración del Problema

Necesitamos gestionar dependencias y construir el proyecto de manera eficiente.

Factores de Decisión

  • Integración con Spring Boot
  • Popularidad y soporte
  • Facilidad de uso

Opciones Consideradas

  • Maven
  • Gradle
  • Ant

Resultado de la Decisión

Opción elegida: "Maven", porque se integra bien con Spring Boot, es popular y tiene un buen soporte.

Consecuencias Positivas

  • Integración con Spring Boot
  • Amplio soporte y documentación
  • Facilidad de uso

Consecuencias Negativas

  • Puede ser menos flexible en comparación con Gradle

Pros y Contras de las Opciones

Maven

  • Pros
    • Integración con Spring Boot
    • Amplio soporte y documentación
    • Facilidad de uso
  • Contras
    • Menos flexible en comparación con Gradle

Gradle

  • Pros
    • Muy flexible y potente
    • Buen rendimiento de compilación
  • Contras
    • Menos documentación y soporte en comparación con Maven
    • Curva de aprendizaje más pronunciada

Ant

  • Pros
    • Altamente configurable
  • Contras
    • Más complejo y menos automatizado
    • Menos soporte comunitario

Nota

El equipo decidió usar Maven debido a su integración con Spring Boot y su amplia aceptación en la comunidad de desarrolladores Java.

Control de Versiones: Git

  • Estado: aceptada
  • Fecha: 2024-03-21

Contexto y Declaración del Problema

Necesitamos un sistema de control de versiones para manejar el desarrollo colaborativo.

Factores de Decisión

  • Popularidad y soporte comunitario
  • Facilidad de uso y aprendizaje
  • Funcionalidades para el desarrollo colaborativo

Opciones Consideradas

  • Git
  • SVN (Subversion)
  • Mercurial

Resultado de la Decisión

Opción elegida: "Git", porque es el sistema de control de versiones más popular, con un gran soporte comunitario y funcionalidades robustas para el desarrollo colaborativo.

Consecuencias Positivas

  • Amplia adopción y soporte
  • Funcionalidades avanzadas para el desarrollo colaborativo
  • Facilidad de uso y aprendizaje

Consecuencias Negativas

  • Puede ser complicado para usuarios no familiarizados con el control de versiones distribuidas

Pros y Contras de las Opciones

Git

  • Pros
    • Amplia adopción y soporte comunitario
    • Funcionalidades avanzadas para el desarrollo colaborativo
    • Facilidad de uso y aprendizaje
  • Contras
    • Puede ser complicado para usuarios no familiarizados con sistemas distribuidos

SVN (Subversion)

  • Pros
    • Sencillo de usar para desarrolladores individuales
    • Buen soporte para grandes repositorios
  • Contras
    • Menos popular en comparación con Git
    • Menos soporte para desarrollo distribuido

Mercurial

  • Pros
    • Buen rendimiento
    • Sistema distribuido similar a Git
  • Contras
    • Menos popular en comparación con Git
    • Menos soporte comunitario

Nota

El equipo decidió usar Git debido a su popularidad, amplio soporte comunitario y robustas funcionalidades para el desarrollo colaborativo.

Pruebas de Código: JUnit

  • Estado: aceptada
  • Fecha: 2024-03-21

Contexto y Declaración del Problema

Necesitamos asegurar la calidad del código mediante pruebas unitarias y de integración.

Factores de Decisión

  • Popularidad y soporte comunitario
  • Facilidad de uso e integración con Spring Boot
  • Herramientas y funcionalidades disponibles

Opciones Consideradas

  • JUnit
  • TestNG
  • Spock

Resultado de la Decisión

Opción elegida: "JUnit", porque es popular, fácil de usar e integra bien con Spring Boot.

Consecuencias Positivas

  • Popularidad y soporte comunitario
  • Facilidad de uso e integración con Spring Boot
  • Herramientas y funcionalidades avanzadas

Consecuencias Negativas

  • Puede requerir aprendizaje inicial para desarrolladores nuevos en pruebas

Pros y Contras de las Opciones

JUnit

  • Pros
    • Popularidad y soporte comunitario
    • Facilidad de uso e integración con Spring Boot
    • Herramientas y funcionalidades avanzadas
  • Contras
    • Puede requerir aprendizaje inicial para desarrolladores nuevos en pruebas

TestNG

  • Pros
    • Funcionalidades avanzadas de pruebas
    • Buen soporte para pruebas de integración
  • Contras
    • Menos popular en comparación con JUnit
    • Menor integración con herramientas de Spring Boot

Spock

  • Pros
    • Sintaxis de pruebas muy expresiva
    • Soporte para pruebas de comportamiento
  • Contras
    • Menos popular en comparación con JUnit
    • Menor soporte comunitario y documentación

Nota

El equipo decidió usar JUnit debido a su popularidad, facilidad de uso y fuerte integración con Spring Boot.

Framework de Desarrollo: Spring Boot

  • Estado: aceptada
  • Fecha: 2024-04-21

Contexto y Declaración del Problema

Se necesita un framework robusto y ampliamente utilizado para el desarrollo de aplicaciones Java.

Factores de Decisión

  • Popularidad y soporte comunitario
  • Facilidad de configuración
  • Integración con otras tecnologías utilizadas en el proyecto

Opciones Consideradas

  • Spring Boot
  • Java EE
  • Play Framework

Resultado de la Decisión

Opción elegida: "Spring Boot", porque ofrece facilidad de configuración, un ecosistema rico y es ampliamente utilizado en la industria.

Consecuencias Positivas

  • Facilidad de configuración
  • Amplio soporte comunitario
  • Integración con otras tecnologías

Consecuencias Negativas

  • Puede tener una curva de aprendizaje inicial para nuevos desarrolladores

Pros y Contras de las Opciones

Spring Boot

  • Pros
    • Facilidad de configuración
    • Amplio soporte comunitario
    • Integración con otras tecnologías
  • Contras
    • Curva de aprendizaje inicial para nuevos desarrolladores

Java EE

  • Pros
    • Estándar bien establecido
    • Buen soporte para aplicaciones empresariales
  • Contras
    • Puede ser más pesado y complejo de configurar
    • Menos flexible en comparación con Spring Boot

Play Framework

  • Pros
    • Buen rendimiento
    • Arquitectura reactiva
  • Contras
    • Menos popular en comparación con Spring Boot
    • Menor soporte comunitario

Nota

El equipo decidió usar Spring Boot debido a su facilidad de configuración, amplio soporte comunitario y rica integración con otras tecnologías.

Documentación de la API: Swagger/OpenAPI

  • Estado: aceptada
  • Fecha: 2024-04-21

Contexto y Declaración del Problema

Necesitamos documentar la API HTTP para facilitar su uso y mantenimiento.

Factores de Decisión

  • Necesidad de documentación clara y accesible
  • Integración con Spring Boot
  • Popularidad y soporte comunitario

Opciones Consideradas

  • Swagger/OpenAPI
  • RAML
  • API Blueprint

Resultado de la Decisión

Opción elegida: "Swagger/OpenAPI", porque proporciona una documentación clara y accesible, y se integra bien con Spring Boot.

Consecuencias Positivas

  • Documentación clara y accesible
  • Amplio soporte y popularidad
  • Integración con Spring Boot

Consecuencias Negativas

  • Puede requerir configuración adicional

Pros y Contras de las Opciones

Swagger/OpenAPI

  • Pros
    • Documentación clara y accesible
    • Amplio soporte y popularidad
    • Integración con Spring Boot
  • Contras
    • Puede requerir configuración adicional

RAML

  • Pros
    • Buenas herramientas de desarrollo
    • Estructura modular
  • Contras
    • Menos popular en comparación con Swagger
    • Menor soporte comunitario

API Blueprint

  • Pros
    • Sintaxis simple y fácil de aprender
  • Contras
    • Menos popular en comparación con Swagger
    • Menor soporte comunitario y herramientas

Nota

El equipo decidió usar Swagger/OpenAPI debido a su capacidad para generar documentación clara y su integración con Spring Boot.

Usar MySQL para la Persistencia de Datos

  • Estado: aceptada
  • Fecha: 2024-05-01

Contexto y Declaración del Problema

Necesitamos elegir un sistema de gestión de bases de datos (DBMS) para persistir datos relacionados con vehículos, estancias en el aparcamiento, pagos y otras entidades. El DBMS debe proporcionar fiabilidad, escalabilidad y facilidad de integración con nuestra aplicación basada en Java.

Factores de Decisión

  • Requisito de una base de datos relacional fiable y bien soportada
  • Compatibilidad con Java y Spring Boot
  • Disponibilidad de soporte comunitario y documentación

Opciones Consideradas

  • MySQL
  • PostgreSQL
  • SQLite

Resultado de la Decisión

Opción elegida: "MySQL", porque ofrece un buen equilibrio entre fiabilidad, rendimiento y soporte comunitario. Además, se integra bien con Spring Boot a través de JPA/Hibernate.

Consecuencias Positivas

  • Alta fiabilidad y cumplimiento de ACID
  • Buen rendimiento para nuestra carga de trabajo esperada
  • Gran comunidad y documentación exhaustiva

Consecuencias Negativas

  • Características ligeramente menos avanzadas en comparación con PostgreSQL
  • Requiere más recursos en comparación con bases de datos más ligeras como SQLite

Pros y Contras de las Opciones

MySQL

  • Pros
    • Fiable y ampliamente utilizado
    • Buen rendimiento y escalabilidad
    • Fuerte soporte comunitario y documentación
  • Contras
    • Características ligeramente menos avanzadas en comparación con PostgreSQL

PostgreSQL

  • Pros
    • Características avanzadas y extensiones
    • Fuerte soporte para consultas y transacciones complejas
  • Contras
    • Mayor uso de recursos
    • Curva de aprendizaje más pronunciada

SQLite

  • Pros
    • Ligero y fácil de configurar
    • Uso mínimo de recursos
  • Contras
    • No adecuado para entornos de alta concurrencia
    • Características limitadas en comparación con MySQL y PostgreSQL

Nota

El equipo decidió usar MySQL después de evaluar las opciones y considerar la carga de trabajo esperada y los requisitos de integración con Spring Boot.