쿼리 메소드 (2)

dongbin_Shin·2021년 7월 29일
2

스프링 데이터 JPA

목록 보기
3/6
post-thumbnail

  1. 메소드 이름으로 쿼리 생성
  2. NameQuery
  3. @Query - 리포지토리 메소드에 쿼리 정의
  4. 파라미터 바인딩
  5. 반환 타입
  6. 페이징과 정렬
  7. 벌크성 수정 쿼리
  8. @EntityGraph

4. 파라미터 바인딩

import org.springframework.data.repository.query.Param
public interface MemberRepository extends JpaRepository<Member, Long> {
	@Query("select m from Member m where m.username = :name")
	Member findMembers(@Param("name") String username);
}

컬렉션 파라미터 바인딩

Collection 타입으로 in절 지원

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

5. 반환 타입

Member findMemberByUsername(String username); //단건

List<Member> findListByUsername(String username); //리스트

Optional<Member> findOptionalByUsername(String username); //optional

지원하는 반환 타입: 스프링 데이터 JPA 공식 문서

조회 결과가 많거나 없을 때

  • 컬렉션
    • 결과 없음: 빈 컬렉션 반환 (null이 아님)
  • 단건 조회
    • 결과 없음: null 반환
      • Query.getSingleResult()메서드 호출, 조회 결과가 없으면 javax.persistence.NoResultException예외가 발생하는데 개발자가 다루기 불편하므로 스프링 데이터 JPA는 예외를 무시하고 null을 반환해준다.
    • 결과 2건 이상: javax.persistence.NonUniqueResultException 예외 발생
      • JPA는 NonUniqueResultException를 발생시키지만 스프링 데이터 JPA가 IncorrectResultSizeDataAccessException로 감싸서 예외 발생 시킴 -> JPA이외에 다른 인프라에서도 예외를 통일시키기 위해서

테스트 코드

@Test
    void testReturnType_abnormal_input(){
        Member memberA = new Member("dongbin",10);
        Member memberB = new Member("dongbin",20);
        Member memberC = new Member("ehdqls",20);

        memberRepository.save(memberA);
        memberRepository.save(memberB);
        memberRepository.save(memberC);

        List<Member> memberList = memberRepository.findListByUsername("1234");
        assertNotNull(memberList);
        assertThat(memberList.size()).isEqualTo(0);

        Member member = memberRepository.findMemberByUsername("1234");
        assertNull(member);

        assertThrows(IncorrectResultSizeDataAccessException.class, () -> {
            Optional<Member> memberOptional = memberRepository.findOptionalByUsername("dongbin");
        });
    }

예외 테스트 방법 (JUnit 5)

assertThrows([기대하는 예외].class, () -> {
            [예외가 발생하는 코드]
        });

"본 포스트는 작성자가 공부한 내용을 바탕으로 작성한 글입니다.
잘못된 내용이 있을 시 언제든 댓글로 피드백 부탁드리겠습니다.
항상 정확한 내용을 포스팅하도록 노력하겠습니다."

profile
멋있는 백엔드 개발자

0개의 댓글