Lo ideal es que su capa DAO 'abstraiga' el acceso a algún sistema de almacenamiento de datos (base de datos, sistema de archivos, directorio LDAP, ...). Entonces, en ese sentido, se usa solo para tareas relacionadas con el acceso a datos. Sin embargo, también podría tener una capa DAO que acceda a un servicio web u otro componente externo a su aplicación. Ese es el punto clave, proporciona acceso a algún componente externo.
La idea principal es que no hay detalles de implementación de su capa DAO que escape a las capas superiores (aislamiento). Un buen punto de partida para pensar sobre esto es: ¿qué tendría que hacer si planeo reemplazar el componente (una base de datos, por ejemplo) a la que mi capa DAO proporciona acceso? Por ejemplo, tiene algunos datos dentro de archivos XML y planea migrar los datos a una base de datos.
Supongamos que tiene todo tipo de excepciones relacionadas con XML que escapan a su capa DAO. Entonces se vuelve bastante difícil migrar su capa XML a una capa de base de datos. Sin embargo, si ha encapsulado todos los detalles de implementación de su capa DAO, será mucho más fácil.
Al final, se trata de mantener el código. Cuantas menos dependencias tenga en los detalles de implementación de una capa específica (servicios, DAO, ...), mejor será su código.
"qué necesitaría hacer si planeo reemplazar el componente (una base de datos, por ejemplo)" - si mal no recuerdo, se trataba de la capa de acceso a datos en arquitectura de 3 niveles (por Fowler). – Roman