В идеале, ваш уровень DAO «абстрагирует» доступ к некоторой системе хранения данных (база данных, файловая система, каталог LDAP, ...). Таким образом, в этом смысле он используется только для задач, связанных с доступом к данным. Однако у вас также может быть слой DAO, который обращается к веб-службе или к другому компоненту, внешнему по отношению к вашему приложению. Это ключевой момент, он обеспечивает доступ к некоторому внешнему компоненту.
Основная идея заключается в том, что нет деталей реализации вашего уровня DAO, которые бы выходили на более высокие уровни (изоляция). Хорошая отправная точка для размышления об этом: что мне нужно сделать, если я планирую заменить компонент (например, базу данных), к которому мой уровень DAO предоставляет доступ? Например, у вас есть некоторые данные в файлах XML, и вы планируете перенести данные в базу данных.
Предположим, у вас есть все виды исключений, связанных с XML, которые выходят из вашего уровня DAO. Тогда становится довольно сложно перенести ваш уровень XML на уровень базы данных. Однако, если вы инкапсулировали все детали реализации вашего уровня DAO, это станет намного проще.
В конце концов, речь идет о возможности сопровождения вашего кода. Чем меньше у вас зависимостей от деталей реализации определенного уровня (сервисы, DAO, ...), тем лучше обслуживаемый код.