728x90
스프링 데이터 JPA 리포지토리는 인터페이스만 정의하고 구현체는 스프링이 자동 생성
스프링 데이터 JPA가 제공하는 인터페이스를 직접 구현하면 구현해야 하는 기능이 너무 많음
다양한 이유로 인터페이스의 메서드를 직접 구현하고 싶다면?
- JPA 직접 사용( EntityManager )
- 스프링 JDBC Template 사용
- MyBatis 사용
- 데이터베이스 커넥션 직접 사용 등등... Querydsl 사용
Custom interface 생성



- 규칙: 리포지토리 인터페이스 이름 + Impl
- 해당 규칙 말고 다른 이름으로 변경하고 싶다면 XML, JAVAConfig 설정을 하여 변경하면 된다.
- SpringDataJPA가 인식해서 스프링 빈으로 등록한다.
참고
실무에서는 주로 QueryDSL이나 SpringJdbcTemplate을 함께 사용할 때 사용자 정의 리포지토리 기능 자주 사용
항상 사용자 정의 리포지토리가 필요한 것은 아니다. 그냥 임의의 리포지토리를 만들어도 된다. 예를 들어 MemberQueryRepository를 인터페이스가 아닌 클래스로 만들고 스프링 빈으로 등록해서 그냥 직접 사용해도 된다. 물론 이 경우 스프링 데이터 JPA와는 아무런 관계없이 별도로 동작한다.
최신 방식을 사용자 정의 레포지토리 구현
@RequiredArgsConstructor
public class MemberRepositoryCustomImpl implements MemberRepositoryCustom {
private final EntityManager em;
@Override
public List<Member> findMemberCustom() {
return em.createQuery("select m from Member m")
.getResultList();
}
}
- 스프링 데이터 2.x부터는 사용자 정의 구현 클래스에 리포지토리 인터페이스 이름 + Impl을 적용하는 대신에 사용자 정의 인터페이스 명 + Impl 방식도 지원한다.
- 예를 들어서 위 예제의 MemberRepositoryImpl 대신에 MemberRepositoryCustomImpl 같이 구현해도 된다
- 기존 방식보다 이 방식이 사용자 정의 인터페이스 이름과 구현 클래스 이름이 비슷하므로 더 직관적이다.
- 추가로 여러 인터페이스를 분리해서 구현하는 것도 가능하기 때문에 새롭게 변경된 이 방식을 사용하는 것을 더 권장한다.
728x90
'실전! 스프링 데이터 JPA' 카테고리의 다른 글
| Ch04. 확장 기능 - Web 확장(도메인 클래스 컨버터, 페이징과 정렬) (0) | 2021.12.27 |
|---|---|
| Ch04. 확장 기능 - Auditing (0) | 2021.12.27 |
| Ch03. 쿼리 메소드 기능 - JPA Hint, Lock (0) | 2021.12.26 |
| Ch03. 쿼리 메소드 기능 - @EntityGraph (0) | 2021.12.26 |
| Ch03. 쿼리 메소드 기능 - 벌크성 수정 쿼리 (0) | 2021.12.26 |