Whiteship Spring JPA, Custom Default Repository

2020-12-19
  • jpa
  • spring
  • 기본 Repository 를 Customizing 하는 방법.

    JpaRepository interface 를 상속받는 Customizing interface 를 하나 만든다.
    @NoRepositoryBean 를 꼭 붙여서 spring 이 bean 으로 만들지 않도록 한다.

    아마 spring 이 bean 을 만들지 않고 jpa 쪽에서 bean 으로 만들기 때문이 아닐까?
    없는 기본함수들을 다 만들어 주는 것을 보면..

    @NoRepositoryBean
    public interface MyCustomDefaultRepository<T, ID> extends JpaRepository<T, ID> {
        boolean contains(T entity);
    }
    

    위에서 만든 interface 를 구현한다. JpaRepository 의 구현체는 SimpleJpaRepository 로 한다.

    //postfix 아님 그냥 Impl 쓴것
    public class MyCustomDefaultRepositoryImpl<T, ID> extends SimpleJpaRepository<T, ID> implements MyCustomDefaultRepository<T, ID> {
        Logger logger = LoggerFactory.getLogger(MyCustomDefaultRepositoryImpl.class);
        EntityManager entityManager;
        public MyCustomDefaultRepositoryImpl(JpaEntityInformation<T, ?> entityInformation, EntityManager entityManager) {
            super(entityInformation, entityManager);
            this.entityManager = entityManager;
        }
    
        //추가함수
        @Override
        public boolean contains(T entity) {
            return entityManager.contains(entity);
        }
    
        //변경함수
        @Override
        public List<T> findAll() {
            logger.debug("find all by my custom default repository");
            return super.findAll();
        }
    }
    

    @EnableJpaRepositories 의 repositoryBaseClass 설정으로 base class 를 알려준다.

    @SpringBootApplication
    @EnableJpaRepositories(repositoryBaseClass = MyCustomDefaultRepositoryImpl.class)
    public class MainApp {
        public static void main(String[] args) {
            SpringApplication.run(MainApp.class);
        }
    }
    

    그리고 customizing default repository 를 상속받은 interface 를 만들어서 사용하자.

    public interface PostRepository extends MyCustomDefaultRepository<Post, Long> {
    }
    

    끝.