모든 리포지토리에 공통적으로 추가할 기능이나 재정의할 기능을 정의한다.
- 유지보수 관점에서의 이득을 보기위한 커스텀 리포지토리 생성 방법이다.
- 즉, 직접 코드를 작성하여 리포지토리 메서드를 만드는 방법의 확장성을 증가시킨 방법이다.
- 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);
}
}
- @EnableJpaRepository 의 repositoryBaseClass 속성에 구현 클래스 선언
@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);
}
'springframework > Spring Data JPA' 카테고리의 다른 글
Spring Data Common : QueryDSL (0) | 2020.11.17 |
---|---|
Spring Data Common : Domain Event (0) | 2020.11.17 |
Spring Data Common : 커스텀 리포지토리 생성 (0) | 2020.11.16 |
Spring Data Common : Async Query Method (0) | 2020.11.16 |
Spring Data Common : 쿼리 작성 (0) | 2020.11.15 |