Camada de serviço vs DAO - Por que ambos?

64

Eu tenho trabalhado com SpringMVC, Hibernate e alguns bancos de dados em um exemplo de aplicativo da web java.

Existem alguns diferentes que fazem isso, mas este tutorial de integração do Spring 3 e hibernação, por exemplo, tem uma classe model, view (em jsp) e classes service e dao para o controlador.

Minha pergunta é: as classes service e DAO não fazem a mesma coisa? Por que você precisaria dos dois?

Este foi o tutorial que eu estava realmente usando: http://fruzenshtein.com/spring-mvc-security-mysql-hibernate/

Jeff
fonte

Respostas:

60

Geralmente, o DAO é o mais leve possível e existe apenas para fornecer uma conexão com o banco de dados, às vezes abstraído para que diferentes recursos de banco de dados possam ser usados.

A camada de serviço existe para fornecer lógica para operar nos dados enviados para e do DAO e do cliente. Muitas vezes, essas duas partes são agrupadas no mesmo módulo e, ocasionalmente, no mesmo código, mas você ainda as verá como entidades lógicas distintas.

Outro motivo é a segurança - se você fornecer uma camada de serviço que não tem relação com o banco de dados, será mais difícil obter acesso ao banco de dados pelo cliente, exceto por meio do serviço. Se o banco de dados não puder ser acessado diretamente do cliente (e não houver módulo trivial do DAO atuando como serviço), todo invasor que assumiu o controle do cliente poderá tentar invadir a camada de serviço também antes que ele obtenha tudo, menos o acesso mais higienizado aos seus dados.

gbjbaanb
fonte
11
Concordo com a separação das camadas de serviço e dao e sua camada de serviço que contém sua lógica de negócios.
Peter Delaney
sem mencionar que um serviço pode chamar vários DAOs; por exemplo, ao salvar um usuário, você pode conversar com o UserDao, UserOrdersDao, etc. Ou devemos criar um serviço para cada um? E então quem poderia ligar para todos esses serviços?
Fermin Silva
40

Eu sou o escritor do post em questão. Eu tenho o meu quinhão trabalhando em diferentes tecnologias e arquiteturas. Com base no exposto, posso dizer com segurança que ter uma camada de serviço e uma dao é sempre uma boa idéia. O DAO deve ser limitado a apenas adicionar / atualizar / inserir / selecionar objetos de entidade no / do banco de dados e isso é tudo. Se você quiser fazer algo extra em termos de lógica, adicione-o à camada de serviço. Isso ajudará a tornar o código modular e facilmente substituível quando o banco de dados for substituído (para parte de dados). Isso é especialmente aplicável em aplicativos que envolvem relatórios com lógicas pesadas, mesmo após a busca de dados do banco de dados.

Além disso, na primavera, a segurança é aplicada na camada de serviço idealmente. Você não gostaria de mudar dessa maneira.

lokesh
fonte
5
Ei, muito obrigado por responder à minha pergunta; isso é dedicação ao seu blog! Obrigado pelo ótimo exemplo, continue escrevendo.
26414 Jeff Jeff
Isso estava incomodando minha mente por algum tempo e acho que a experiência ajuda mais nessas situações. Obrigado.
Utku Özdemir
Concordo com a separação das camadas de serviço e dao e sua camada de serviço que contém sua lógica de negócios e só chamaria métodos de Dao. Que tal quando um dos meus métodos de serviço precisa chamar outro método de serviço. Devo ter outra abstração acima da camada de serviço que chama vários métodos de serviço?
Peter Delaney
Não. As classes na camada de serviço podem ter referência uma da outra (conforme necessário) e podem chamar os métodos necessários.
lokesh
11

Adam Bien aponta em seu livro o fato de que o JPA EntityManager é uma boa implementação universal do DAO:

http://realworldpatterns.com/

No mundo Java EE, quase nunca é necessário escrever seu próprio DAO, porque as implementações de JPA incluem uma. Você só precisa escrever a camada de serviço.

A implementação de sua própria camada DAO é realmente uma ressaca da muito pobre arquitetura J2EE de 15 anos atrás, mas muitas pessoas ainda se sentem compelidas a fazê-lo. Essas camadas DAO personalizadas geralmente fornecem nada além de funções de encaminhamento que chamam o método correspondente no EntityManager.

Portanto, para responder à sua pergunta, sim, você precisa de uma camada de serviço e de um DAO, mas precisa apenas escrever a camada de serviço.

Dean Schulze
fonte
2
Não tenho certeza se isso se aplica ao Spring - sempre há um DAO personalizado que precisa ser criado para o modelo. Talvez sua declaração "quase nunca seja necessário escrever seu próprio DAO" se aplique especificamente aos contêineres EJB / servidor de aplicativos?
quer tocar hoje
11
É melhor escrever o seu próprio (DAO / DAOImpl), embora ele só seja mapeado para o EntityManager - Isso porque no futuro você poderá adicionar outra implementação do DAO sem precisar alterar o código da camada de serviço .
ahmednabil88
@YajliMaclo qual é a diferença o que mudar?
Alex78191
4

Normalmente, coloco todo o código específico do banco de dados (consultas) nos DAO, manipulação de transações e lógica de negócios nos serviços. Isso permite que os métodos de serviço invoquem métodos em vários dao's e mantenham tudo dentro da mesma transação. Na minha opinião, isso permite uma melhor reutilização de código entre os dao.

sbrattla
fonte
2

Eu descobri que a camada de serviço adiciona complexidade desnecessária na maioria dos casos. Em teoria, é evitar ter lógica de negócios na camada dao, mas, no final, isso apenas gera confusão, mesmo algumas pessoas desusaram de remover completamente a camada dao, porque acham que isso não agrega valor. http://ayende.com/blog/4784/architecting-in-the-pit-of-doom-the-evils-of-the-repository-abstraction-layer

Mas se você tiver várias lógicas de negócios, então sim. É uma boa ideia. Quão essencial é criar uma camada de serviço?

Jesus
fonte
3
Eu li o post de Ayende várias vezes agora, e simplesmente não consigo abalar a sensação de que seu design (com o qual eu teria concordado em um ponto), embora fiel ao espírito de YAGNI, quase inevitavelmente custaria mais tempo de desenvolvimento, mesmo no médio prazo do que custaria para configurar a abstração de camadas em primeiro lugar. Gostaria de saber se ele mudou de opinião sobre o acoplamento rígido entre o aplicativo inteiro e o NHibernate, agora que é ainda mais comum um único aplicativo consultar várias fontes de dados SQL, NoSQL e API.
Sr. Cochese
@LennyGodber sim, eu sei o seu sentimento IMO é melhor ter a camada DAO / repositório porque, como ele tem mais vantagens do que desvantagens, porque como você estava dizendo que é muito comum ter várias fontes de dados
Jesus
-1

IMHO a camada de Serviço pode ser considerada como uma camada entre o controlador e a camada DAO. Essa camada de serviço é exatamente onde podemos adicionar lógica de negócios e até criar um objeto de retorno específico para o que precisa ser renderizado pela exibição.

compserve23
fonte