En general, el DAO es lo más liviano posible y existe únicamente para proporcionar una conexión a la base de datos, a veces abstraído, por lo que se pueden utilizar diferentes backends de base de datos.
La capa de servicio está ahí para proporcionar lógica para operar con los datos enviados desde y hacia el DAO y el cliente. Muy a menudo, estas 2 piezas se agruparán en el mismo módulo y, ocasionalmente, en el mismo código, pero aún las verá como entidades lógicas distintas.
Otra razón es la seguridad: si proporciona una capa de servicio que no tiene relación con la base de datos, entonces es más difícil obtener acceso a la base de datos desde el cliente, excepto a través del servicio. Si no se puede acceder directamente a la base de datos desde el cliente (y no hay un módulo DAO trivial que actúe como servicio), entonces todo lo que un atacante que ha tomado sobre el cliente puede hacer es intentar piratear la capa de servicio también antes de que obtenga todo menos el El acceso más higiénico a sus datos.