// 사용자 정의 인터페이스 선언!
public interface MemberRepositoryCustom {
List<Member> findMemberCustom();
}
//사용자 정의 인터페이스 구현!
@RequiredArgsConstructor
public class MemberRepositoryCustomImpl implements MemberRepositoryCustom {
private final EntityManager entityManager;
@Override
public List<Member> findMemberCustom() {
return entityManager.createQuery("select m from Member m",Member.class)
.getResultList();
}
}
// MemberRepositoryCustom이라는 [사용자 정의 인터페이스]를 상속받게 하면,
// Spring Data JPA가 [사용자 정의 인터페이스] 메서드를 클라이언트에서 호출하면, 제대로 동작하게 알아서 해준다.
// (사용자 정의 인터페이스는 JAVA가 실행시켜 주는 것이 아닌, Spring Data JPA가 동작을 시켜주는 것이다.)
public interface MemberReposiotry extends JpaRepository<Member,Long>, MemberRepositoryCustom {
//이하 생략
}
@Test@Transactional
public void callCustom(){
List<Member> memberCustom = repository.findMemberCustom();
}
그러나 사용자 정의 구현체에 대한 클래스 명 작성은 규칙에 따라야 한다.
스프링 부트 2.X.X에서부터는 구현체의 이름음 [Spring Data JPA의 인터페이스 명] + [Impl]과 더불어
[사용자 정의 인터페이스 명] + [Impl]도 지원을 한다.
그러나 스프링 부트 3.x.x부터는 후자만 지원을 한다.
Spring Data JPA의 쿼리 메서드 기능만으로 해결이 되면, 기존의 방법대로 사용하면 되는데,
만약 Querydsl을 사용하거나 해서, 복잡한 자바 코드를 이용하면 해야 한다면 위와 같이
사용자 정의 인터페이스를 사용하면 된다.
유지/보수가 편하다
'CS 잡지식' 카테고리의 다른 글
[도메인 엔티티]로 API를 개발이 허용되는 유일한 경우! (0) | 2023.05.13 |
---|---|
@Column(updateable , insertable .... ), @PrePersist, @PreUpdate (0) | 2023.05.13 |
Dirty Checking의 치명적인 Weakness(단점)(feat. hint,lock) (1) | 2023.05.12 |
SELECT ~~ FOR UPDATE(Feat. Concurrency Problem ) (0) | 2023.05.12 |
@EntityGraph(feat. Spring Data JPA가 제공하는 Fetch Join) (0) | 2023.05.12 |