As maiores razões pelas quais eu tendo a tendência de ter uma camada de serviço são as duas razões a seguir...
-
Marcando métodos como @Transactional para que todas as solicitações DAO dentro desse método ocorram em uma única transação.
-
Posso aumentar a separação de preocupação do DAO e das funções do usuário. Eu posso marcar métodos como exigindo certas funções de usuário e, como tal, ele se encaixa muito bem com o Spring Security.
Você pode simplesmente chamar um DAO do controlador, mas isso o deixará preso se quiser expandir mais tarde. Para obter a conexão, você pode usar marcar o serviço como @Transactional e o DAO como @Repository e o Spring lidará com toda a obtenção do objeto de sessão para você e injeção etc.
Eu costumo pensar (talvez incorretamente) na camada de serviço como uma fachada que é acessada, seja de um serviço da Web ou de um controlador ou qualquer outra coisa, ela mantém a separação.