Что такое DTO (Data Transfer Object)?

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

Ответ

DTO (Data Transfer Object) — это шаблон проектирования, представляющий собой простой контейнер для передачи данных между подсистемами приложения (например, из слоя контроллера в сервис или через сетевой интерфейс).

Основные характеристики:

  • Только данные: Содержит поля, геттеры и сеттеры, но не содержит бизнес-логики.
  • Сериализуемость: Часто реализует интерфейсы для сериализации (например, Serializable).
  • Иммутабельность: Рекомендуется делать DTO неизменяемыми (immutable) для безопасности потоков и предсказуемости.

Пример иммутабельного DTO в Java:

public final class UserDto {
    private final String username;
    private final String email;

    public UserDto(String username, String email) {
        this.username = username;
        this.email = email;
    }

    // Только геттеры, без сеттеров
    public String getUsername() { return username; }
    public String getEmail() { return email; }
}

Зачем использовать DTO?

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