코딩과 결혼합니다

[Spring Data JPA] 쿼리 메서드(2) 본문

2세/JPA

[Spring Data JPA] 쿼리 메서드(2)

코딩러버 2024. 2. 29. 12:54
728x90

파라미터 바인딩

@Query("select m from Member m where m.username in :names")
List<Member> findByNames(@Param("names") List<String> names);

쿼리 메서드는 복잡할수록 굉장히 길어진다. 그래서 위와 같이 파라미터 바인딩을 사용할 수 있는데, 

위치 기반, 이름 기반 등의 방법이 있다.

select m from Member m where m.username = ?0 //위치 기반
select m from Member m where m.username = :name //이름 기반

위치 기반의 경우에는 유지보수에 취약할 수 있기 때문에 이름 기반을 사용하도록 한다.


반환타입

List<Member> findListByUsername(String username); // 컬렉션

Member findMemberByUsername(String username); //단건

Optional<Member> findOptionalByUsername(String username);//단건 Optional
  • 컬렉션의 경우에는 결과가 없으면 빈 컬렉션을 반환해 준다.
  • 단건 조회의 경우에는 결과가 없으면 null  /  결과가 단건이 아닐 때에는 NonUniqueResultException이 발생한다.

Spring Data JPA 페이징과 정렬

org.springframework.data.domain.Sort //정렬 기능
org.springframework.data.domain.Pageable //페이징 기능(내부에 Sort 포함)

스프링 데이터 JPA는 페이징과 정렬을 어떠한 DB도 사용할 수 있도록 공통화를 시켰다.

 Page<자바 컬렉션> // 추가 count 쿼리 결과를 포함하는 페이징
 Slice<자바 컬렉션> // 추가 count 쿼리 없이 다음 페이지만 학인 가능
 List<자바 컬렉션> // 추가 count 쿼리 없이 결과만 반환

Slice의 경우에는 size을 3으로 하였을 때, 3개를 요청하지 않고 limit에 +1개 하여 4개를 요청한다. (토탈 카운트 사용 X)

그래서 다음 페이지 여부를 확인한다. (최근 모바일 리스트, 더보기나 다음 거를 미리 로딩하는 등)

 

*totalCount의 경우 결국에는 DB의 모든 데이터를 카운트를 해야 한다. DB 내 분에서 최적화를 할 수는 있지만 그래도 성능이 느리다. totalCount가 많아질 때 쿼리를 잘 짜야한다.

 

@Query(value = "select m from Member m left join m.team t",
        countQuery = "select count (m) from Member m")
Page<Member> findByAge(int age, Pageable pageable);

예시. 카운트쿼리를 따로 구현해주었다. count 를 그냥 m으로 하여 아주 단순하게 조회하도록 하여 최적화.

'2세 > JPA' 카테고리의 다른 글

[JPA] Join 문법  (2) 2024.03.08
[Spring Data JPA] 쿼리 메서드(3)  (0) 2024.03.03
[Spring Data JPA] 쿼리 메서드  (0) 2024.02.28
[Spring Data JPA] 순수 JPA와 Spring Data JPA  (0) 2024.02.27
[JPA] 컬렉션 조회 최적화(1)  (0) 2024.02.25