Как называется паттерн проектирования, создающий прослойку между приложением и базой данных
Что проверяют
Знаете ли вы название и, что важнее, отличаете ли соседние паттерны доступа к данным. Следующий вопрос почти гарантирован: чем DAO отличается от Repository и нужен ли DAO, если есть Spring Data JPA.
Как отвечать
Короткий ответ: DAO, Data Access Object. Это объект, который прячет за интерфейсом всю работу с хранилищем: SQL, JDBC, маппинг строк в объекты, обработку SQLException. Бизнес-слой зовёт userDao.findById(id) и не знает, откуда пришли данные.
Дальше покажите, что знаете семейство паттернов:
- DAO: ориентирован на таблицу и операции CRUD, часто один DAO на таблицу. Классическая реализация через
JdbcTemplateили чистый JDBC; - Repository: пришёл из DDD, работает с агрегатом и выглядит как коллекция доменных объектов. В Spring это
JpaRepository, где методы вродеfindByEmailгенерируются по имени; - Data Mapper: переносит данные между объектами и таблицами, сами объекты о базе не знают. Hibernate реализует именно его;
- Active Record: объект сам умеет себя сохранять,
user.save(). В Java встречается редко; - Table Data Gateway: один объект на таблицу, возвращает сырые наборы строк.
Польза DAO: бизнес-логика тестируется с моком интерфейса, а смена технологии доступа затрагивает один слой. В Spring есть бонус: бины с @Repository получают перевод исключений драйвера в иерархию DataAccessException, и сервис не зависит от кодов ошибок конкретной СУБД.
Честно добавьте, что в современном Spring-проекте отдельный DAO поверх Spring Data обычно лишний: репозиторий уже и есть эта прослойка. Свой DAO пишут, когда нужны сложные запросы через JdbcTemplate или jOOQ.
Где спотыкаются
Называют паттерн «ORM». ORM это технология и библиотеки, а не паттерн, и внутри она сама реализует Data Mapper.
Считают DAO и Repository синонимами и не могут назвать разницу в уровне абстракции: таблица против доменного агрегата.
Обещают, что с DAO «можно поменять базу без изменения кода». Интерфейс переживёт смену драйвера, но разница в диалектах SQL, транзакциях и производительности всё равно вылезет.