본문 바로가기
JPA/스프링 DATA JPA

Data JPA 10 사용자 정의 리포지토리 구현

by 킹차니 2022. 1. 8.

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

• 스프링 데이터 JPA 리포지토리는  인터페이스만 정의하고 구현체는 스프링이 자동 생성

• 스프링 데이터 JPA가 제공하는 인터페이스를 직접 구현하면 구현해야 하는 기능이 너무 많음

• 다양한 이유로 인터페이스의 메서드를 직접 구현하고 싶다면? (아래는 5가지 다양한 이유)

- 1. JPA 직접 사용 (EntityManager)

- 2. 스프링 JDBC Template 사용

- 3. MyBatis 사용

- 4. 데이터베이스 커넥션 직접 사용

- 5. Query dsl 사용 등등...

 

 

이렇게 사용자가 정의한 리포지토리를 사용하기 위해서는 아래와 같이 해준다.

 

1. 인터페이스를 만들고, 본인이 직접 구현하고 싶은 추상 메서드를 만든다. (이때 인터페이스명과 메서드명은 본인 마음대로 해도 된다.)

public interface MemberRepositoryCustom {

    List<Member> findMemberCustom();
}

 

2. 이제 위의 인터페이스를 구현하는 클래스를 만든다.

@RequiredArgsConstructor
public class MemberRepositoryCustomImpl implements MemberRepositoryCustom{

    private final EntityManager em;

    @Override
    public List<Member> findMemberCustom() {
        return em.createQuery("select m from Member m", Member.class)
                .getResultList();
    }
}

인터페이스명은 상관없지만 구현제에 MemberRepository와 Impl은 반드시 붙여줘야 한다. (아래의 data jpa 리포지토리의 이름이 MemberRepository이기 때문에 MemberRepository가 들어가야하는 것임)

 

 

3. data jpa 리퍼지토리에서 1에서 만든 인터페이스도 추가한다.

// MemberRepositoryCustom 추가                                          //여기
public interface MemberRepository extends JpaRepository<Member, Long>, MemberRepositoryCustom{

	//메서드들 생략...

}

이제 이를 사용해보자.

@Test
void callCustom() {

    memberRepository.save(new Member("member1", 10, null));
    memberRepository.save(new Member("member2", 20, null));

    List<Member> members = memberRepository.findMemberCustom();
}

 

아래와 같은 쿼리가 나가면서 잘 수행된 것을 알 수 있다.

    select
        member0_.member_id as member_i1_0_,
        member0_.created_by as created_2_0_,
        member0_.created_date as created_3_0_,
        member0_.last_modified_by as last_mod4_0_,
        member0_.last_modified_date as last_mod5_0_,
        member0_.age as age6_0_,
        member0_.team_id as team_id8_0_,
        member0_.username as username7_0_ 
    from
        member member0_

 

 

 

 

 

 

 

김영한님의 인프런 강의와 PDF를 바탕으로 정리하였습니다.