| name | clean-structure |
| description | Architectural patterns and package organization for a clean Spring Boot backend. |
🏛️ Sysacad Next - Clean Structure
El proyecto sigue una Arquitectura en Capas (Layered Architecture) organizada por paquetes. Esta estructura es vital para la mantenibilidad y desacoplamiento del sistema académico.
📁 Organización de Paquetes (src/main/java/com/sysacad/backend/)
controller/: Entrada de peticiones REST. Validan el acceso mediante @PreAuthorize y delegan la lógica a los servicios.
service/: El núcleo de la aplicación. Contiene la lógica de negocio, validación de reglas académicas y transacciones (@Transactional).
repository/: Abstracción de base de datos usando Spring Data JPA.
modelo/: Entidades persistentes JPA. No deben salir de la capa de servicio.
dto/: Objetos para el intercambio de datos (Request/Response).
- Se recomienda agruparlos por dominio (ej.
dto.admin, dto.alumno).
mapper/: Interfaces de MapStruct para la conversión segura y eficiente entre Entidades y DTOs.
exception/: Excepciones personalizadas y el GlobalExceptionHandler (@ControllerAdvice).
config/: Configuraciones globales (Seguridad, CORS, Seeders).
⚖️ Reglas de Oro Estructurales
- DTO-First: Está terminantemente prohibido exponer entidades JPA (
modelo/) en los controladores. Toda entrada y salida debe ser un DTO.
- Lógica en Servicios: Los controladores deben ser delgados. La lógica de decisión, cálculos y validaciones de negocio pertenecen al
service.
- MapStruct Mandatory: No realices mapeos manuales
new DTO() o setX(entity.getX()). Usa los mappers definidos en mapper/.
- Separación Admin: La lógica administrativa (ABM complejo, estadísticas globales) debe residir en archivos con el prefijo
Admin* (ej. AdminCarreraController, AdminCarreraService) para diferenciarla de la lógica de usuario final.
- Inyección por Constructor: Prefiere la inyección de dependencias por constructor sobre
@Autowired en campos para facilitar el testing.