[내배캠/TIL(6/16)]Data JPA 활용

손홍서·2022년 6월 15일
1

Spring

목록 보기
10/24

day38 TIL

@Query

public interface MemberRepository extends JpaRepository<Member, Long> {
    ...
    @Query("select m from Member m where m.username in :names")
    List<Member> findByNames(@Param("names") List<String> names);
}

@Query를 사용하면 메소드 이름을 깔끔하게 가지고 갈 수 있음

Paging

그 귀찮은 페이징을 data jpa를 활용하면 간단하게 할 수 있다.

public interface MemberRepository extends JpaRepository<Member, Long> {
	...
    Page<Member> findByAge(int age, Pageable pageable);
}
    @Test
    public void paging() {
        //given
        memberRepository.save(new Member("member1", 20));
        memberRepository.save(new Member("member2", 20));
        memberRepository.save(new Member("member3", 20));
        memberRepository.save(new Member("member4", 20));
        memberRepository.save(new Member("member5", 20));
        memberRepository.save(new Member("member6", 20));
        memberRepository.save(new Member("member7", 20));

        int age = 20;
        PageRequest page = PageRequest.of(0, 3, Sort.by(Sort.Direction.DESC, "username")); //중요!! 0부터 3개
        //when
        Page<Member> pageList = memberRepository.findByAge(age, page);

        //then
        List<Member> content = pageList.getContent();
        long totalElements = pageList.getTotalElements();

        for (Member member : content) {
            System.out.println("member = " + member);
        }

        assertThat(content.size()).isEqualTo(3);
        assertThat(totalElements).isEqualTo(7);
        assertThat(pageList.getNumber()).isEqualTo(0); //현재 페이지
        assertThat(pageList.getTotalPages()).isEqualTo(3); //전체 페이지
        assertThat(pageList.isFirst()).isTrue();
        assertThat(pageList.hasNext()).isTrue();

    }

Slice

  • count는 xxx: count는 무겁기때문에 성능 개선으로 좋다.
  • limit+1을 조회: 모바일에서 스크롤 내리면 추가되는 그 방식!
public interface MemberRepository extends JpaRepository<Member, Long> {
	...
    Slice<Member> findByAge(int age, Pageable pageable);
}
    @Test
    public void paging() {
        //given
        memberRepository.save(new Member("member1", 20));
        memberRepository.save(new Member("member2", 20));
        memberRepository.save(new Member("member3", 20));
        memberRepository.save(new Member("member4", 20));
        memberRepository.save(new Member("member5", 20));
        memberRepository.save(new Member("member6", 20));
        memberRepository.save(new Member("member7", 20));

        int age = 20;
        PageRequest page = PageRequest.of(0, 3, Sort.by(Sort.Direction.DESC, "username"));
        //when
        Slice<Member> pageList = memberRepository.findByAge(age, page); //Slice는 4개를 요청

        //then
        List<Member> content = pageList.getContent();
//        long totalElements = pageList.getTotalElements();

        for (Member member : content) {
            System.out.println("member = " + member);
        }

        assertThat(content.size()).isEqualTo(3);
//        assertThat(totalElements).isEqualTo(7);
        assertThat(pageList.getNumber()).isEqualTo(0);
//        assertThat(pageList.getTotalPages()).isEqualTo(3);
        assertThat(pageList.isFirst()).isTrue();
        assertThat(pageList.hasNext()).isTrue();

    }

dto로 반환!

사실 entity를 반환하면 안되기 때문에 꼭 map을 사용해 dto로 변경해 return하자~

public interface MemberRepository extends JpaRepository<Member, Long> {
    ...

    //성능 최적화를 위해 countQuery 분리 가능 특히 join한 모든 값을 다~~ 가져오면 안되니깐 분리
    //sorting도 복잡해지면 따로 query가능
    @Query(value = "select m from Member m left join m.tean t",
            countQuery = "select count(m) from Member m")
    Page<Member> findByAge(int age, Pageable pageable);
}
Page<Member> pageList = memberRepository.findByAge(age, page); 
Page<MemberDto> map = pageList.map(member -> new MemberDto(member.getId(), member.getUsername(), null));

@EntityGraph: data jpa fetch join

간단하게 fetch join을 할 수 있다.

public interface MemberRepository extends JpaRepository<Member, Long> {
	...
    // 1번
    @Query("select m from Member m left join fetch m.team")
    List<Member> findMemberFetchJoin();

	//1번과 같은 메소드
    @Override
    @EntityGraph(attributePaths = {"team"})
    List<Member> findAll();
}
profile
Hello World!!

0개의 댓글