В каких случаях использование DTO (Data Transfer Object) не рекомендуется?

«В каких случаях использование DTO (Data Transfer Object) не рекомендуется?» — вопрос из категории Архитектура, который задают на 10% собеседований Java Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Использование DTO добавляет избыточную сложность и оверхед в следующих сценариях:

  • Простые CRUD-операции без трансформации данных. Если сущность возвращается или принимается "как есть", прямое использование доменной модели проще.
  • Внутренние вызовы в пределах одного слоя или сервиса. DTO предназначены для передачи данных через границы (сети, слои).
  • Микросервисы, использующие общие контракты (например, через shared library). В этом случае можно использовать одни и те же классы моделей.

Пример избыточного DTO (Java/Spring):

// Излишне: создание UserDTO только для передачи всех полей User
@GetMapping("/users/{id}")
public UserDTO getUser(@PathVariable Long id) {
    User user = userRepository.findById(id).orElseThrow();
    return new UserDTO(user.getId(), user.getName()); // Нет маскировки или агрегации
}

Когда DTO необходимы:

  1. Маскировка данных: чтобы не раскрывать внутреннюю структуру или чувствительные поля доменной модели.
  2. Агрегация данных: объединение информации из нескольких сущностей или источников в один объект для клиента.
  3. Оптимизация нагрузки: исключение циклических зависимостей или тяжёлых полей (например, коллекций) из ответа API.