springframework/Spring Data JPA

Spring Data Common : 공통 리포지토리 커스터마이징

Jungsoomin :) 2020. 11. 16. 20:18

모든 리포지토리에 공통적으로 추가할 기능이나 재정의할 기능을 정의한다.

  • 유지보수 관점에서의 이득을 보기위한 커스텀 리포지토리 생성 방법이다.
  • 즉, 직접 코드를 작성하여 리포지토리 메서드를 만드는 방법의 확장성을 증가시킨 방법이다.

 

  • JpaRepository 상속 인터페이스 정의, @NoRepositoryBean, 원하는 메서드 선언
@NoRepositoryBean
public interface MyCommonRepository<T, Id extends Serializable> extends JpaRepository<T, Id> {

    boolean contatins(T entity);

}
  • JPA 가장 아래 단에 있는 SimpleJpaRepository 를 상속하고 , JpaRepository 를 상속했던 인터페이스를 상속하는 구현 클래스 작성
  • super 클래스를 호출하는 생성자를 반드시 만들어야한다.
public class MyCommonRepositoryImpl<T, ID extends Serializable> extends SimpleJpaRepository<T, ID> implements MyCommonRepository<T, ID> {

    private EntityManager entityManager;

    public MyCommonRepositoryImpl(JpaEntityInformation<T, ?> entityInformation, EntityManager entityManager) {
        super(entityInformation, entityManager);
        this.entityManager = entityManager;
    }

    @Override
    public boolean contatins(T entity) {
        return entityManager.contains(entity);
    }
}
  • @EnableJpaRepositoryrepositoryBaseClass 속성에 구현 클래스 선언
@SpringBootApplication
@EnableJpaRepositories(repositoryBaseClass = MyCommonRepositoryImpl.class)
public class JpaApplication {

    public static void main(String[] args) {
        SpringApplication.run(JpaApplication.class, args);
    }

}
  • 이후 JpaRepository 를 상속했던 인터페이스를 구현하여 사용
public interface PostRepository extends MyCommonRepository<Post, Long> {
}
@Test
    @Rollback(false)
    public void crud(){
        Post post = new Post();
        post.setTitle("Hibernate");

        //Transient
        assertThat(postRepository.contatins(post)).isFalse();

        //Persistent
        postRepository.save(post);

        assertThat(postRepository.contatins(post)).isTrue();

        postRepository.delete(post);
    }