반응형
- 메소드 이름으로 쿼리 생성
- NameQuery
- @Query - 리포지토리 메소드에 쿼리 정의
- Parameter binding
- Return type
- 페이징과 정렬
- 벌크성 수정 쿼리
- @EntityGraph
쿼리 메소드에 대해서 3단계 시리즈 중 2번째 입니다.
이번 글에서는 메소드 이름으로 Parameter binding, Return type에 대해 알아보겠습니다.
4. Parameter binding
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. Return type
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이외에 다른 인프라에서도 예외를 통일시키기 위해서
- 결과 없음: null 반환
테스트 코드
@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, () -> { [예외가 발생하는 코드] });
"본 포스트는 작성자가 공부한 내용을 바탕으로 작성한 글입니다.
잘못된 내용이 있을 시 언제든 댓글로 피드백 부탁드리겠습니다.
항상 정확한 내용을 포스팅하도록 노력하겠습니다."
반응형
'Spring' 카테고리의 다른 글
Spring data JPA: save() 메소드 (0) | 2023.02.06 |
---|---|
Spring data JPA: 확장 기능 (0) | 2023.02.06 |
Spring data JPA: 쿼리 메소드 (3) (0) | 2023.02.06 |
Spring data JPA: 쿼리 메소드 (1) (0) | 2023.02.06 |
Spring data JPA: 공통 인터페이스 기능 (0) | 2023.02.06 |