API REST para gestión de usuarios y autenticación implementada con Clean Architecture Multi-Módulo 100% PURA, Spring Boot 3.5.5+ y Java 21+.
El proyecto sigue el patrón de Clean Architecture con 4 módulos Maven separados:
domain: Entidades puras, enums y repositorios (reglas de negocio) - 🔒 COMPLETAMENTE INDEPENDIENTEapplication: DTOs, servicios, queries y commands (casos de uso) - ✅ PURE POJOs - Solo depende de domaininfrastructure: Seguridad, persistencia y configuración (adaptadores) - 🔧 Implementa interfaces de domainpresentation: Controladores REST y endpoints (interfaz) - 🌐 Depende solo de application
┌─────────────────┐
│ PRESENTATION │ ← Controladores REST
└─────────┬───────┘
│ ✅ Depende solo de
▼
┌─────────────────┐ ┌─────────────────┐
│ INFRASTRUCTURE │ │ APPLICATION │ ← POJOs puros
│ │ │ │
│ • Spring Config │ │ • DTOs │
│ • JPA Entities │ │ • Services │
│ • Security │ │ • Commands │
│ • Repositories │ │ • Queries │
└─────────┬───────┘ └─────────┬───────┘
│ │ ✅ Solo depende de
│ ✅ Implementa │
│ interfaces ▼
└─────────────────→ ┌─────────────────┐
│ DOMAIN │ ← Núcleo independiente
│ │
│ • Entities │
│ • Enums │
│ • Interfaces │
│ • Business Logic│
└─────────────────┘
- ✅ Dependency Inversion: Interfaces definidas en Domain, implementadas en Infrastructure
- ✅ Separation of Concerns: Cada capa tiene responsabilidades específicas y claras
- ✅ Domain Independence: Domain sin dependencias de frameworks (solo Lombok)
- ✅ Interface Segregation: Interfaces específicas por servicio y repositorio
- ✅ Framework Independence: Application layer sin dependencias de Spring
- ✅ Single Responsibility: Cada clase y módulo tiene una única razón para cambiar
- ✅ Autenticación JWT con Spring Security
- ✅ Registro e inicio de sesión de usuarios
- ✅ Gestión de roles (USER, ADMIN)
- ✅ Validación de datos con Bean Validation
- ✅ Documentación API con Swagger/OpenAPI
- ✅ Múltiples perfiles (dev, test, staging, prod)
- ✅ Base de datos H2 (desarrollo) y PostgreSQL (producción)
- ✅ CORS configurado para desarrollo y producción
- ✅ Logging estructurado con diferentes niveles por perfil
- ✅ MapStruct para mapeo entre entidades de dominio y JPA
- ✅ Interfaces de servicios para inversión de dependencias
- ✅ Entidades de dominio puras sin anotaciones JPA
- ✅ Repositorios de dominio sin dependencias Spring
GET /api/public/welcome- Mensaje de bienvenidaGET /api/public/health- Estado de la APIGET /api/public/info- Información completa de la API
POST /api/auth/signup- Registro de usuarioPOST /api/auth/login- Inicio de sesiónPOST /api/auth/validate- Validar token JWTPOST /api/auth/refresh- Refrescar token JWT
GET /api/user/profile- Perfil del usuario autenticadoGET /api/user/info- Información básica del usuarioGET /api/user/has-role/{role}- Verificar rol específico
GET /swagger-ui.html- Interfaz de Swagger UIGET /v3/api-docs- Especificación OpenAPI
- Java 21+
- Spring Boot 3.5.5+
- Spring Security 6+
- Spring Data JPA
- JWT (jjwt 0.12.3)
- H2 Database (desarrollo)
- PostgreSQL (producción)
- Swagger/OpenAPI 3
- Lombok
- MapStruct 1.5.5 (mapeo entre capas)
- Maven Multi-Module
- Java 21+
- Maven 3.6+
- PostgreSQL (solo para producción)
git clone git@github.com:aruponse/java_clean_architecture.git
cd java_clean_architecture# Copiar archivo de ejemplo
cp env.example .env
# Editar variables según tu entorno
nano .envmvn spring-boot:run -Dspring-boot.run.profiles=devmvn spring-boot:run -Dspring-boot.run.profiles=prod- Swagger UI: http://localhost:8080/swagger-ui.html
- H2 Console (dev): http://localhost:8080/h2-console
- Base de datos: H2 (memoria)
- Logging: DEBUG
- H2 Console: Habilitada
- Swagger: Habilitado
- Base de datos: H2 (memoria)
- Logging: INFO/WARN
- H2 Console: Deshabilitada
- Base de datos: Configurable por variables de entorno
- Logging: INFO
- Swagger: Habilitado
- Base de datos: PostgreSQL
- Logging: WARN
- Swagger: Deshabilitado (configurable)
| Variable | Descripción | Valor por defecto |
|---|---|---|
SERVER_PORT |
Puerto del servidor | 8080 |
JWT_SECRET |
Clave secreta para JWT | (requerido en prod) |
JWT_EXPIRATION |
Expiración del token (ms) | 86400000 |
DB_URL |
URL de la base de datos | jdbc:h2:mem:testdb |
DB_USERNAME |
Usuario de la base de datos | sa |
DB_PASSWORD |
Contraseña de la base de datos | (vacío) |
CORS_ALLOWED_ORIGINS |
Orígenes CORS permitidos | * |
Adicional a la suite de test swagger implementada en el proyecto se agrega una suite de pruebas para importarse en Postman lista para ejecutar.
curl -X POST http://localhost:8080/api/auth/signup \
-H "Content-Type: application/json" \
-d '{
"username": "usuario",
"email": "usuario@example.com",
"password": "password123",
"firstName": "Juan",
"lastName": "Pérez"
}'curl -X POST http://localhost:8080/api/auth/login \
-H "Content-Type: application/json" \
-d '{
"usernameOrEmail": "usuario",
"password": "password123"
}'curl -X GET http://localhost:8080/api/user/profile \
-H "Authorization: Bearer <tu-token-jwt>"# Ejecutar todas las pruebas
mvn test
# Ejecutar pruebas con perfil específico
mvn test -Dspring.profiles.active=testclean_architecture/
├── pom.xml # POM padre con módulos
├── domain/ # Módulo de dominio (INDEPENDIENTE)
│ ├── pom.xml
│ └── src/main/java/com/api/cleanarch/domain/
│ ├── enums/ # Enumeraciones puras
│ ├── model/ # Entidades puras (sin JPA)
│ ├── repository/ # Interfaces de repositorio (sin Spring)
│ └── service/ # Interfaces de servicios
├── application/ # Módulo de aplicación
│ ├── pom.xml
│ └── src/main/java/com/api/cleanarch/application/
│ ├── dto/ # DTOs
│ ├── mappers/ # Mappers (MapStruct)
│ ├── service/ # Servicios e interfaces
│ ├── queries/ # Consultas (CQRS)
│ └── commands/ # Comandos (CQRS)
├── infrastructure/ # Módulo de infraestructura
│ ├── pom.xml
│ ├── src/main/java/com/api/cleanarch/infrastructure/
│ │ ├── security/ # Configuración de seguridad
│ │ ├── persistence/ # Implementación de repositorios
│ │ │ ├── entity/ # Entidades JPA
│ │ │ ├── mapper/ # Mappers MapStruct
│ │ │ └── *RepositoryImpl.java # Implementaciones
│ │ └── config/ # Configuraciones
│ └── src/main/resources/
│ ├── application.properties
│ ├── application-dev.properties
│ ├── application-test.properties
│ ├── application-staging.properties
│ └── application-prod.properties
├── presentation/ # Módulo de presentación
│ ├── pom.xml
│ ├── src/main/java/com/api/cleanarch/presentation/
│ │ ├── controller/ # Controladores REST
│ │ └── ApiApplication.java # Clase principal
│ └── src/test/java/com/api/cleanarch/presentation/
│ └── controller/ # Pruebas unitarias
├── env.example # Variables de entorno de ejemplo
└── Clean_Architecture_API_Postman_Collection.json # Colección Postman para pruebas de la API (Lista para importar)
# Compilar todos los módulos
mvn clean compile
# Ejecutar la aplicación (desde el módulo presentation)
mvn spring-boot:run -pl presentation
# Ejecutar pruebas
mvn test
# Compilar e instalar en repositorio local
mvn clean install