Что такое маппер (Mapper) и для чего он используется с DTO?

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

Ответ

Маппер (Mapper) — это компонент, ответственный за преобразование данных между различными представлениями объектов, чаще всего между сущностью предметной области (Entity) и объектом передачи данных (DTO). Его цель — изолировать шаблонный код преобразования полей.

Зачем это нужно?

  • Изоляция слоёв: Слой контроллеров/API работает с DTO, а слой persistence — с Entity. Маппер — это «буфер» между ними.
  • Безопасность: Исключаются лишние поля (например, @OneToMany-коллекции или хэши паролей) при отправке клиенту.
  • Упрощение кода: Автоматизация ручного копирования полей через get/set.

Пример объявления маппера с использованием MapStruct:

@Mapper(componentModel = "spring") // Интеграция со Spring для инъекции
public interface UserMapper {
    // MapStruct сгенерирует реализацию на этапе компиляции
    UserDTO toDto(User entity);
    User toEntity(UserDTO dto);
    // Можно описывать кастомную логику для сложных полей
    default String fullNameToDto(UserName name) {
        return name.getFirstName() + " " + name.getLastName();
    }
}

Использование в сервисе:

@Service
public class UserService {
    @Autowired
    private UserMapper userMapper;

    public UserDTO getUser(Long id) {
        User entity = userRepository.findById(id);
        return userMapper.toDto(entity); // Преобразование Entity -> DTO
    }
}

Популярные библиотеки: MapStruct (высокая производительность, компиляция), ModelMapper (рефлексия, проще в настройке), Orika.