Estou trabalhando em uma arquitetura, ela oferecerá uma API de descanso para aplicativos da Web e aplicativos móveis. Estou usando o Spring (spring mvc, spring data jpa, ... etc). O modelo de domínio é codificado com a especificação JPA.
Estou tentando aplicar alguns conceitos de arquitetura limpa ( https://8thlight.com/blog/uncle-bob/2012/08/13/the-clean-architecture.html ). Nem todos, porque vou manter o modelo de domínio jpa.
O fluxo real através das camadas é o seguinte:
Front end <--> Serviço de API -> Serviço -> Repositório -> DB
- Front-end : cliente Web, aplicativos móveis
- Serviço API : Controladores Rest, aqui eu uso conversores e dto e serviços de chamada
- Serviço : faz interface com implementações e elas contêm lógica de negócios
- Repositório : O repositório faz interface com implementações automáticas (feitas pelo spring data jpa) que contêm operações CRUD e talvez algumas consultas sql
Minha dúvida: devo usar uma camada extra entre o serviço e o repositório?
Estou planejando esse novo fluxo:
Front end <--> Serviço de API -> Serviço -> Persistência -> Repositório -> DB
Por que usar essa camada de persistência? Como diz o artigo de arquitetura limpa, gostaria de ter uma implementação de serviço (lógica de negócios ou caso de uso) que acesse uma camada de persistência agnóstica. E não serão necessárias alterações se eu decidir usar outro padrão de "acesso a dados", por exemplo, se eu decidir parar de usar o repositório.
class ProductServiceImpl implements ProductService {
ProductRepository productRepository;
void save(Product product) {
// do business logic
productRepository.save(product)
}
}
Então, eu estou pensando em usar uma camada de persistência como esta:
class ProductServiceImpl implements ProductService {
ProductPersistence productPersistence;
void save(Product product) {
// do business logic
productPersistence.save(product)
}
}
e implementação da camada de persistência assim:
class ProductPersistenceImpl implements ProductPersistence {
ProductRepository productRepository;
void save(Product product) {
productRepository.save(product)
}
}
Então, eu só preciso alterar as implementações da camada de persistência, deixar o serviço sem alterações. Associado ao fato de que o Repositório está relacionado ao framework.
O que você acha? Obrigado.