Clean Architecture en NestJS: Guía Práctica
Cómo implementar Clean Architecture en proyectos NestJS para crear aplicaciones mantenibles y escalables.
La Clean Architecture es un patrón de diseño que nos permite crear aplicaciones con código desacoplado, testeable y fácil de mantener. En este artículo veremos cómo aplicarla en proyectos NestJS.
¿Por qué Clean Architecture?
Cuando trabajamos en proyectos que crecen con el tiempo, es común encontrarnos con código espagueti donde la lógica de negocio está mezclada con detalles de infraestructura. Clean Architecture nos ayuda a evitar esto.
Los beneficios principales son:
- Independencia de frameworks: La lógica de negocio no depende de NestJS
- Testeable: Podemos probar la lógica sin necesidad de bases de datos o APIs
- Independiente de la UI: Podemos cambiar de REST a GraphQL sin tocar el dominio
- Independiente de la base de datos: Cambiar de PostgreSQL a MongoDB es transparente
Estructura de carpetas
src/
├── modules/
│ └── users/
│ ├── domain/
│ │ ├── entities/
│ │ ├── repositories/
│ │ └── services/
│ ├── application/
│ │ └── use-cases/
│ ├── infrastructure/
│ │ ├── persistence/
│ │ └── http/
│ └── users.module.ts
Ejemplo: Caso de uso
// application/use-cases/create-user.use-case.ts
export class CreateUserUseCase {
constructor(
private readonly userRepository: UserRepository,
private readonly hashService: HashService,
) {}
async execute(input: CreateUserInput): Promise<User> {
const existingUser = await this.userRepository.findByEmail(input.email);
if (existingUser) {
throw new UserAlreadyExistsError(input.email);
}
const hashedPassword = await this.hashService.hash(input.password);
const user = User.create({
...input,
password: hashedPassword,
});
return this.userRepository.save(user);
}
}
Conclusión
Clean Architecture requiere más código inicial, pero a largo plazo el beneficio es enorme. El código es más fácil de entender, testear y modificar.
En próximos artículos profundizaremos en cada capa y veremos ejemplos más complejos.