Spring JPA를 사용할 때, 기본적으로 제공해주는 Repository들이 존재하지만, 그에 더불어 내가 customize한 함수를 사용하고자 할 때 Custom Repository를 생성하는 방법을 정리하고자 한다.
기본적으로 라이브러리에서 제공하는 Repository만을 사용한다면, 이러한 형태로 선언을 해서 사용한다. 예시에서는 JpaRepository를 사용한다.
@Entity
public class User {
@Id
@GeneratedValue
private long id;
private String name;
}
public interface UserRepository extends JpaRepository<User, Long> {
List<User> getTopByName(String name);
}
이런식으로 해당 Entity에 대한 JpaRepository를 생성해주면, 알아서 JpaRepository가 빈으로 등록되어 생성된다.
하지만, 기존 JpaRepository에서의 구현이 아닌, 나만의 구현을 사용하려면 다른 구조가 필요하다.
아래의 그림처럼 Repository 상속 구조를 만들면, DomainRepository의 이름으로 주입해
내가 커스터마이징 한 레포지토리의 기능을 사용할 수 있다.
이러한 상속 구조를 spring-data에서 제공해준다.
그럼 예시를 보도록 하자. 일단 내가 기본으로 구현한 UserRepository와는 별개로,
내가 새로 정의할 것들을 모아놓은 인터페이스를 생성하자.
이것에 대한 이름은 자유롭게 지을 수 있다.
public interface UserRepositoryCustom {
List<User> search();
}
그리고 이 인터페이스의 구현 클래스를 정의해준다.
public class UserRepositoryCustomImpl implements UserRepositoryCustom {
List<User> search() {
// implementation...
}
}