source

스프링 데이터 JPA @NoRepositoryBean 인터페이스에 대해서

ittop 2023. 3. 28. 22:35
반응형

스프링 데이터 JPA @NoRepositoryBean 인터페이스에 대해서

나는 그 일을 만났다.@NoRepositoryBean스프링 데이터 설명서를 읽는 동안 여러 번 인터페이스합니다.

매뉴얼에서 인용하는 방법:

Spring 네임스페이스를 사용하여 자동 저장소 인터페이스 검출을 사용하는 경우 인터페이스를 그대로 사용하면 Spring이 MyRepository 인스턴스를 생성하려고 합니다.이것은 물론 Repository와 각 엔티티에 대해 정의하려는 실제 리포지토리 인터페이스 사이의 중간 역할을 하기 때문에 바람직하지 않습니다.Repository 확장 인터페이스가 저장소 인스턴스로 인스턴스화되는 것을 제외하려면 다음과 같이 주석을 붙입니다.@NoRepositoryBean.

하지만 언제 어디서 사용해야 할지 아직 잘 모르겠어요.누가 구체적인 사용 예를 알려주시겠습니까?

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

메서드 foo()를 모든 저장소에 추가한다고 가정합니다.먼저 다음과 같은 repo 인터페이스를 추가합니다.

public interface com.foobar.MyBaseInterface<…,…> extends CrudRepository<…,…> {

  void foo();
}

또, 적절한 실장 클래스, 공장등을 추가합니다.구체적인 저장소 인터페이스가 중간 인터페이스를 확장하게 되었습니다.

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

}

이제 다음과 같이 부트스트랩(Spring Data JPA 등)을 실행한다고 가정합니다.

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

사용하다com.foobar네가 가지고 있기 때문이다.CustomerRepository같은 패키지에 넣어주세요.Spring Data 인프라스트럭처는 이제 데이터 보안에 대해MyBaseRepository는 구체적인 저장소 인터페이스가 아니라 추가 메서드를 공개하는 중간 보고서 역할을 합니다.따라서 저장소 프록시 인스턴스를 생성하려고 시도했다가 실패합니다.이제 를 사용할 수 있습니다.@NoRepositoryBean이 중간 인터페이스에 주석을 달아 Spring Data에 기본적으로 알립니다.이 인터페이스에 대해 저장소 프록시 빈을 생성하지 마십시오.

그 시나리오가 바로 그 이유이기도 하다.CrudRepository그리고.PagingAndSortingRepository이 주석도 첨부합니다.패키지 검사에서 실수로 이러한 항목이 검출된 경우(실수로 이렇게 구성되었기 때문에), 부트스트랩은 실패합니다.

요약하자면, 주석을 사용하여 저장소 인터페이스가 최종 저장소 빈 인스턴스로 선택되는 것을 방지합니다.

커스텀 방식으로서 새로운 인터페이스를 선언할 수 있습니다.

@NoRepositoryBean
public interface ExtendedRepository<T, ID extends Serializable> extends JpaRepository<T, ID> {
    List<T> findByAttributeContainsText(String attributeName, String text);
}

이 인터페이스는 JpaRepository 인터페이스를 확장하여 모든 표준 동작의 이점을 제공합니다.

또한 @NoRepositoryBean 주석이 추가되었습니다.그렇지 않은 경우 기본 스프링 동작은 Repository의 모든 하위 인터페이스에 대한 구현을 생성하기 때문에 이것이 필요합니다.

public interface ExtendedStudentRepository extends ExtendedRepository<Student, Long> {
}

언급URL : https://stackoverflow.com/questions/11576831/understanding-the-spring-data-jpa-norepositorybean-interface

반응형