오봉이와 함께하는 개발 블로그

스프링 데이터 JPA - 사용자 정의 리포지토리 구현 본문

BE/JPA

스프링 데이터 JPA - 사용자 정의 리포지토리 구현

오봉봉이 2022. 9. 14. 00:51
728x90

사용자 정의 리포지토리 구현

스프링 데이터 JPA 리포지토리는 인터페이스만 정의하고 구현체는 스프링이 자동 생성한다.
스프링 데이터 JPA가 제공하는 인터페이스를 직접 구현하면 구현해야 하는 기능이 너무 많아서 문제가 생긴다.
다양한 이유로 인터페이스의 메서드를 직접 구현하고 싶다면 어떻게 해야 할까

  • 다양한 이유
    • JPA 직접 사용(EntityManager)
    • 스프링 JDBC Template 사용
    • MyBatis 사용
    • 데이터베이스 커넥션 직접 사용 등
    • Querydsl 사용

사용자 정의 인터페이스

public interface MemberRepositoryCustom {
    List<Member> findMemberCustom();
}
@RequiredArgsConstructor
public class MemberRepositoryImpl implements MemberRepositoryCustom {

    private final EntityManager em;

    @Override
    public List<Member> findMemberCustom() {
        return em.createQuery("select m from Member m", Member.class)
                .getResultList();
    }
}
public interface MemberRepository extends JpaRepository<Member, Long>, MemberRepositoryCustom {
    //........
}
// 호출
List<Member> result = memberRepository.findMemberCustom();

규칙은 스프링 데이터 JPA를 사용하는 리포지토리 인터페이스 이름 + Impl 이다.
인터페이스(MemberRepositoryCustom)는 아무 이름으로 만들어도 무방하다.
하지만, 구현체를 만들 때는 위 규칙을 지켜야 했다.
스프링 데이터 JPA를 사용하는 리포지토리 인터페이스 이름 = MemberRepository
사용자 정의 리포지토리 이름 = MemberRepositoryImpl

하지만, 스프링 2.x 부터는 위 규칙 대신에 사용자 정의 인터페이스 명 + Impl 방식도 지원한다.
즉, MemberRepositoryCustom + Impl도 지원하게 됐다.
기존 방식보다 이 방식이 사용자 정의 인터페이스 이름과 구현 클래스 이름이 비슷하므로 더 직관적이다.
추가로 여러 인터페이스를 분리해서 구현하는 것도 가능하기 때문에 새롭게 변경된 이 방식을 사용하는 것을 더 권장한다.

자바에서 지원하는 것이 아닌, 스프링 데이터 JPA가 인식해서 스프링 빈으로 등록한다.

Impl 대신 다른 이름으로 변경하고 싶으면?

XML 설정

<repositories base-package="study.datajpa.repository" repository-impl-postfix="Impl" />

JavaConfig 설정

@EnableJpaRepositories(basePackages = "study.datajpa.repository", repositoryImplementationPostfix = "Impl")

실무 팁

하지만 항상 사용자 정의 리포지토리가 필요한 것은 아니다.
그냥 임의의 리포지토리를 만들어서 사용해도 된다.
예를 들어 MemberQueryRepository를 인터페이스가 아닌 클래스로 만들고 스프링 빈으로 등록해서 그냥 직접 사용해도 된다.
물론 이 경우 스프링 데이터 JPA와는 아무런 관계 없이 별도로 동작한다.

핵심 비즈니스 로직과, 화면을 위한 로직을 분리해서 구현하듯 사용자 정의 리포지토리도 분리해서 구현하는 것이 가독성이나, 유지보수면에서 좋다.

실무에서는 주로 QueryDSL이나 SpringJdbcTemplate을 함께 사용할 때 사용자 정의 리포지토리 기능 자주 사용한다.

인프런 김영한 지식공유자님 강의 : 실전! 스프링 데이터 JPA
728x90
Comments