복붙노트

[SPRING] 스프링 데이터의 이해 JPA @NoRepositoryBean 인터페이스

SPRING

스프링 데이터의 이해 JPA @NoRepositoryBean 인터페이스

스프링 데이터 문서를 읽는 동안 @NoRepositoryBean 인터페이스가 여러 번 발생했습니다.

설명서에서 인용하려면 다음을 수행하십시오.

그러나, 나는 아직도 그것을 언제 어디에서 사용할 지 확신하지 못한다. 누군가 제게 구체적인 사용 예를 알려주고 조언 해 줄 수 있습니까?

해결법

  1. ==============================

    1.이 주석은 repo 인터페이스의 기준과 실제로 일치하지만 의도적이지 않은 인터페이스에 대한 저장소 프록시 생성을 피하기 위해 사용됩니다. 기능을 사용하여 모든 저장소를 확장하기 시작하면 필요합니다. 내가 한 가지 예를 들어 보겠다.

    이 주석은 repo 인터페이스의 기준과 실제로 일치하지만 의도적이지 않은 인터페이스에 대한 저장소 프록시 생성을 피하기 위해 사용됩니다. 기능을 사용하여 모든 저장소를 확장하기 시작하면 필요합니다. 내가 한 가지 예를 들어 보겠다.

    모든 저장소에 foo () 메소드를 추가하려고한다고 가정하십시오. 다음과 같이 repo 인터페이스를 추가하면됩니다.

    public interface com.foobar.MyBaseInterface<…,…> extends CrudRepository<…,…> {
    
      void foo();
    }
    

    또한 구현 클래스, 팩토리 등을 추가 할 수 있습니다. 구체적인 저장소 인터페이스는 이제 해당 중간 인터페이스를 확장합니다.

    public interface com.foobar.CustomerRepository extends MyBaseInterface<Customer, Long> {
    
    }
    

    이제 스프링 데이터 JPA를 부트 스트랩으로 가정 해 봅시다.

    <jpa:repositories base-package="com.foobar" />
    

    동일한 패키지에 CustomerRepository가 있으므로 com.foobar를 사용합니다. Spring 데이터 인프라 스트럭처는 이제 MyBaseRepository가 구체적인 저장소 인터페이스가 아니라 오히려 추가 메쏘드를 노출하기위한 중간 레포 역할을한다는 것을 알 수있는 방법이 없습니다. 따라서 저장소 프록시 인스턴스를 만들어 실패를 시도합니다. @NoRepositoryBean을 사용하여이 중간 인터페이스에 주석을 달아 스프링 데이터를 본질적으로 알릴 수 있습니다.이 인터페이스에 대한 리포지토리 프록시 bean을 만들지 마십시오.

    이 시나리오는 CrudRepository와 PagingAndSortingRepository가이 주석을 전달하는 이유이기도합니다. 우연히 패키지 스캔이 우연히 발견되면 (우연히이 방법으로 구성했기 때문에) 부트 스트랩이 실패합니다.

    간단히 설명하면, 어노테이션을 사용하면 저장소 인터페이스가 저장소 빈 인스턴스로 끝날 수있는 후보로 선택되지 않도록 할 수 있습니다.

  2. from https://stackoverflow.com/questions/11576831/understanding-the-spring-data-jpa-norepositorybean-interface by cc-by-sa and MIT license