Spring Data Repositories - Pra que servem e como funcionam por baixo dos panos?
Tags: webdev, java, springboot, programming
Published: 2022-06-24 18:14:59

A manipulação de entidades no Spring é facilitada pela criação de uma interface chamada Repository. Isso facilita muito para o gerenciamento das entidades sem precisar de usar o EntityManager, de forma mais trabalhosa. Embora usemos essa interface usando Spring Data, nem sempre sabemos o que está acontecendo por baixo dos panos.

**Ok, Matheus, mas como que se usa esse tal de Spring Data Repository mesmo?**

O objetivo de se usar os repositories do Spring Data é reduzir a quantidade de código necessário para manusear as entidades de forma complexa. Para isso, criamos a interface **repository** extendendo outra interface como, por exemplo, a **CrudRepository**. O que essa extensão causa é o provisionamento de alguns métodos para performar um CRUD da entidade no banco de dados, isto é, Criar, Ler, Atualizar e Deletar dados. É possível estender algumas outras interfaces, como a **JpaRepository** com funcionalidades de listagem e paginação e, ainda, complementar as assinaturas dessas interfaces e usar anotações para a inserção de queries customizadas e coisas afins.

Um exemplo seria:

```
@Repository
public interface Repositorio extends CrudRepository<Pessoa, Integer> {
     Pessoa findByName(@Param("name") String name);
}
```

Dentro dos diamantes do CrudRepository há a entidade a ser manipulada e, em seguida, o tipo da Primary Key da entidade.

A assinatura do método entre as chaves significa um método customizado que desejo que a interface seja capaz de produzir, que foge do escopo do que **CrudRepository** fornece..

**Beleza, entendi, mas como que uma interface é capaz de realizar alguma ação, sendo que ela é só uma assinatura?**

É aí, meu querido, que surge a mágica embaixo dos panos.

Lembra que é criada uma interface estendendo as interfaces CrudRepository ou JpaRepository? Então, nesse momento o Spring implementa essa interface por baixo dos panos na classe **SimpleJpaRepository**, que fica responsável por manipular a entidade. Essa classe fornece um conjunto mais complexo do que o EntityManager e é possível encontrar a documentação [aqui.](https://docs.spring.io/spring-data/jpa/docs/current/api/org/springframework/data/jpa/repository/support/SimpleJpaRepository.html)

**Então é só isso que rola embaixo dos panos? Easy.**

Não é bem assim, meu jovem. 

Um exemplo de coisas mais aprofundadas a se inteirar seria o proxy, **JdkDynamicAopProxy**, que em linhas gerais é usado para gerenciar os métodos customizados criados em sua interface de repositório. Caso você use a interface com os métodos CRUD habilitados pela extensão de **CrudRepository**, o proxy simplesmente te leva até o **SimpleJpaRepository**. No entanto, se você utilizar os seus métodos customizados, o proxy te redirecionará para as outras estruturas Spring Data para que sua query específica seja alcançada. 

Então, no caso da nossa implementação repositorio, os métodos nativos de **CrudRepository** seriam redirecionados para o **SimpleJpaRepository**, enquanto o método **FindByName** seria redirecionado para outras estruturas de serviço do Spring Data.