Repository
public interface MyRepository extends Repository<MyEntity, Long> {}
CrudRepository
save()
, findById()
, findAll()
, deleteById()
public interface MyCrudRepository extends CrudRepository<MyEntity, Long> {}
PagingAndSortingRepository
findAll(Pageable pageable)
, findAll(Sort sort)
public interface MyPagingAndSortingRepository extends PagingAndSortingRepository<MyEntity, Long> {}
ListCrudRepository, ListPagingAndSortingRepository
List
컬렉션에 특화된 CRUD 및 페이징/정렬 기능을 제공합니다.public interface MyListCrudRepository extends ListCrudRepository<MyEntity, Long> {}
QueryByExampleExecutor
findOne(Example<S> example)
, findAll(Example<S> example)
public interface MyQueryByExampleExecutor extends QueryByExampleExecutor<MyEntity> {}
@NoRepositoryBean
@NoRepositoryBean
어노테이션은 Spring Data JPA에서 특별한 용도로 사용된다.// BaseRepository.java
@NoRepositoryBean
public interface BaseRepository<T, ID extends Serializable> extends JpaRepository<T, ID> {
// 공통으로 사용할 메서드 정의
}
// UserRepository.java
@Repository
public interface UserRepository extends BaseRepository<User, Long> {
// User 도메인에 특화된 메서드 정의
}
설명
BaseRepository
인터페이스에는 공통으로 사용할 메서드를 정의한다.@NoRepositoryBean
어노테이션을 BaseRepository
에 붙여, 이 인터페이스가 빈으로 등록되지 않도록 한다.UserRepository
는 BaseRepository
를 상속받아 사용한다.UserRepository
에는 @Repository
어노테이션이 붙어 있으므로, 이 인터페이스만 Spring 컨테이너에 빈으로 등록된다.그림 설명
BaseRepository (Not a Bean)
^
|
|
UserRepository (Bean)
BaseRepository
는 빈으로 등록되지 않고, UserRepository
만 빈으로 등록되어 사용된다. 이를 통해 공통 로직을 재사용하면서도, Spring Data JPA의 자동 구성을 유지할 수 있다./**
* 공통 레포지토리 인터페이스
* @NoRepositoryBean 어노테이션을 사용하여 빈으로 등록되지 않게 함
*/
@NoRepositoryBean
public interface BaseRepository<T, ID extends Serializable> extends JpaRepository<T, ID> {
// ...
}
이렇게 @NoRepositoryBean
을 사용하면, 공통 로직을 가진 부모 레포지토리와 실제로 빈으로 등록되어야 하는 자식 레포지토리를 명확하게 구분할 수 있다.
@Indexed
@Entity
@Indexed
public class MyEntity {
// 필드와 메서드 정의
}
다이어그램의 연결 관계
@NoRepositoryBean
**은 **Repository
**와 **QueryByExampleExecutor
**를 제외한 모든 인터페이스에 점선으로 연결되어 있다. 이는 이 어노테이션을 이러한 인터페이스에 적용할 수 있음을 의미한다.@Indexed
**는 **Repository<T, ID>
**에 점선으로 연결되어 있다. 이는 이 어노테이션을 레포지토리가 관리하는 엔티티에 적용할 수 있음을 의미한다.