728x90
본 포스팅에서 제공하는 방법은 Java의 정식 문법을 따르지 않고, spring-data-jpa에서 제공하는 방법을 다루고 있습니다.
본문에 앞서 주의 사항이 먼저 있습니다. 비즈니스의 핵심 로직을 다루는 리포지토리와 화면에 맞춘 정적 쿼리를 조회하는 리포지토리는 분리해야합니다. custom repository의 기능 사용해서 하나의 entity에 대해 하나의 repository만 사용하게 되면, 어떤 경우에 어떤 메서드를 사용해야하는지 파악하기 어렵게 됩니다. 그리고 비즈니스 핵심로직과 화면에 맞춘 쿼리는 변경주기가 다르다는 점도 고려해야합니다.
먼저 커스텀 메서드가 필요한 인터페이스를 생성합니다. 이를 구현한 클래스를 생성합니다. 이 때 클래스 이름의 postfix는 반드시 Impl이어야 합니다.
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();
}
}
다음으로 기존에 사용하던 EntityRepository의 implements에 CustomRepository를 추가합니다.
@Repository
public interface MemberRepository
extends JpaRepository<Member, Long>, MemberRepositoryCustom {
이렇게 하면 자바에는 없는 문법으로.. JPA가 동작합니다.
@Test
public void howToAddCustomRepository(){
//given
String name = "name";
String email = "email";
Member member = new Member(name, email, "pwd");
memberRepository.save(member);
// when
List<Member> memberCustom = memberRepository.findMemberCustom();
// then
Assertions.assertThat(memberCustom.size()).isEqualTo(1);
}
관련 내용은 아래 링크에서 찾을 수 있습니다.
728x90
'DEV > Spring Data JPA' 카테고리의 다른 글
Open Session In View (1) | 2024.03.18 |
---|---|
Entity의 Id를 직접 지정할 때 주의사항 (persist vs merge) (0) | 2023.09.27 |
QueryHint를 적용하기 전에 고려해볼 사항 (0) | 2023.09.24 |
@EntityGraph로 fetch join 쉽게 쓰기 (0) | 2023.09.24 |
Update 쿼리를 호출할 때 주의사항 2가지 (0) | 2023.09.24 |