Profile image
Seven pecados capitales que debes evitar en tus APIs REST de Spring Boot

Seven pecados capitales que debes evitar en tus APIs REST de Spring Boot

Mon Feb 24 2025
Desarrollo

¡Hola Chiquis!👋🏻 En la película Seven, los detectives Mills y Somerset se enfrentan a un asesino que lleva a cabo crímenes basados en los siete pecados capitales. Al igual que el asesino en Seven, los errores en una API REST de Spring Boot pueden ser devastadores si no los identificamos a tiempo. Cada error puede poner en riesgo la estabilidad, seguridad y rendimiento de nuestra aplicación.

Como en la película, donde los pecados capitales llevaban a terribles consecuencias, en el desarrollo de APIs REST con Spring Boot, existen errores comunes que pueden dañar tu proyecto. Evítalos a toda costa:

La Pereza (Lazy Loading sin control) En Seven, la pereza representa la falta de acción y la procrastinación. En el mundo del desarrollo, esto se traduce en el uso sin control de lazy loading en las consultas a la base de datos, lo que puede generar problemas de rendimiento y aumentar el tiempo de respuesta de la API. Ejemplo:

@Entity
public class Product {
    @OneToMany(fetch = FetchType.LAZY)
    private List<Order> orders;
}

El uso de lazy loading sin una correcta gestión puede resultar en consultas innecesarias a la base de datos, generando el temido N+1 Query Problem. Esto ocurre cuando por cada entidad cargada se ejecuta una consulta adicional.

Solución: Utiliza fetch eager solo cuando sea necesario o, mejor aún, usa DTOs para proyectar solo los datos necesarios y evitar cargar relaciones innecesarias.

@Entity
public class Product {
    @OneToMany(fetch = FetchType.EAGER)
    private List<Order> orders;
}

La Gula (Sobrecargar los Endpoints) La gula en Seven es el deseo insaciable de más, y en el desarrollo de una API REST, esto puede reflejarse en la sobrecarga de los endpoints con demasiada lógica de negocio. Esto no solo hace que tu código sea difícil de mantener, sino que también puede introducir errores complicados. Ejemplo:

@RestController
public class ProductController {

    @GetMapping("/products")
    public List<Product> getAllProducts() {
        List<Product> products = productService.findAll(); 
        // ¡Demasiada lógica aquí!
        for (Product product : products) {
            // Lógica pesada aquí
            product.setDiscount(10); 
        }
        return products;
    }
}

Solución: Deshazte de la lógica pesada dentro del controlador y delega en los servicios o incluso en los DTOs para mantener el controlador limpio y enfocado en manejar las solicitudes.

@RestController
public class ProductController {

    @GetMapping("/products")
    public List<ProductDTO> getAllProducts() {
        return productService.findAllProductsWithDiscount();
    }
}

La Ira (Exponer Información Sensible en los Errores) La ira en Seven es un sentimiento destructivo, y exponer información sensible en los mensajes de error de una API REST puede ser igualmente destructivo. Mostrar excepciones detalladas o información confidencial en los errores expone a tu API a vulnerabilidades. Ejemplo:

@RestController
public class UserController {

    @PostMapping("/users")
    public ResponseEntity<?> createUser(@RequestBody User user) {
        try {
            userService.save(user);
            return ResponseEntity.ok(user);
        } catch (Exception e) {
            // Detalles del error expuestos
            return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR).body(e.getMessage());
        }
    }
}

Solución: Captura las excepciones adecuadamente y devuelve mensajes genéricos sin revelar detalles sensibles. Usa @ControllerAdvice para manejar errores globalmente.

@ControllerAdvice
public class GlobalExceptionHandler {

    @ExceptionHandler(Exception.class)
    public ResponseEntity<String> handleException(Exception e) {
        return new ResponseEntity<>("An unexpected error occurred.", HttpStatus.INTERNAL_SERVER_ERROR);
    }
}
seven

La Envidia (Copiar y Pegar Código) La envidia, el deseo de lo que tienen otros, se refleja en el código cuando simplemente copiamos y pegamos fragmentos de otros proyectos sin entenderlos o sin adaptarlos adecuadamente a nuestro contexto. Esto puede llevar a una deuda técnica significativa. Ejemplo:

@RestController
public class CustomerController {

    @PostMapping("/customers")
    public ResponseEntity<Customer> createCustomer(@RequestBody Customer customer) {
        // Copiar y pegar sin entender
        customerService.save(customer);
        return ResponseEntity.status(HttpStatus.CREATED).body(customer);
    }
}

Solución: Refactoriza tu código. Si encuentras fragmentos repetidos, crea funciones reutilizables en los servicios o en los controladores para evitar la duplicación y mejorar la mantenibilidad.

@RestController
public class CustomerController {

    @PostMapping("/customers")
    public ResponseEntity<Customer> createCustomer(@RequestBody Customer customer) {
        return createEntity(customer, customerService::save);
    }
    
    private <T> ResponseEntity<T> createEntity(T entity, Consumer<T> saveFunction) {
        saveFunction.accept(entity);
        return ResponseEntity.status(HttpStatus.CREATED).body(entity);
    }
}

La Lujuria (Mal Uso de la Autenticación y Autorización) La lujuria en Seven representa el deseo incontrolado. En términos de una API REST, esto puede referirse al mal manejo de la autenticación y autorización, lo que podría permitir el acceso no autorizado a recursos sensibles. Ejemplo:

@GetMapping("/admin")
public ResponseEntity<String> getAdminDashboard() {
    // Acceso sin validación adecuada
    return ResponseEntity.ok("Welcome to the Admin Dashboard!");
}

Solución: Usa Spring Security para garantizar que los usuarios sean correctamente autenticados y autorizados antes de acceder a recursos sensibles.

@RestController
public class AdminController {

    @PreAuthorize("hasRole('ADMIN')")
    @GetMapping("/admin")
    public ResponseEntity<String> getAdminDashboard() {
        return ResponseEntity.ok("Welcome to the Admin Dashboard!");
    }
}

La Soberbia (Desestimar Buenas Prácticas de Diseño de API) La soberbia es el orgullo excesivo, y en el desarrollo de APIs REST, esto se manifiesta cuando ignoramos las buenas prácticas de diseño, como no seguir las convenciones HTTP o no utilizar los códigos de estado apropiados. Ejemplo:

@GetMapping("/getData")
public ResponseEntity<String> getData() {
    // Mala práctica: verbos en los endpoints
    return ResponseEntity.ok("Data fetched successfully");
}

Solución: Sigue las convenciones RESTful. Usa nombres de recursos sustantivos y métodos HTTP apropiados.

@GetMapping("/data")
public ResponseEntity<String> getData() {
    return ResponseEntity.ok("Data fetched successfully");
}

La Avaricia (No Escalar ni Optimizar la API) La avaricia es el deseo insaciable de más, y no optimizar ni escalar tu API puede llevar a un consumo excesivo de recursos y a un rendimiento deficiente. Si no te preocupas por la eficiencia desde el principio, tu API podría convertirse en un cuello de botella. Ejemplo:

@GetMapping("/products")
public List<Product> getAllProducts() {
    return productRepository.findAll(); // Puede ser ineficiente con grandes volúmenes de datos
}

Solución: Implementa paginación, filtros y cachés para mejorar el rendimiento.

@GetMapping("/products")
public Page<Product> getAllProducts(Pageable pageable) {
    return productRepository.findAll(pageable);
}

Recuerda: Al igual que en Seven, donde cada pecado tenía consecuencias nefastas, estos errores en tus APIs REST pueden llevar a problemas graves. Evítalos a toda costa para construir APIs robustas, seguras y fáciles de usar.

Conclusión Cada uno de estos errores puede poner en peligro la estabilidad, seguridad y escalabilidad de tu aplicación. Evítalos, y tu API se convertirá en una obra maestra: eficiente, segura y fácil de mantener. No dejes que la pereza, la gula, la ira, la envidia, la lujuria, la soberbia y la avaricia te consuman. ¡Haz que tu código sea puro!

¡Gracias por leer! 👇🏻 🚀 ¿Te ha gustado? Comparte tu opinión. Artículo completo, visita: https://community.aws/@orlidun https://lnkd.in/ewtCN2Mn https://lnkd.in/eAjM_Smy 👩💻 https://lnkd.in/eKvu-BHe https://dev.to/orlidev https://lnkd.in/ecHHabTD https://pin.it/2BuZ9N4n8 https://linktr.ee/orlidevs ¡No te lo pierdas!

Referencias: Imágenes creadas con: Copilot ( microsoft.com )

#PorUnMillóndeAmigos #MakeYourselfVisible

img218