[Spring Data JPA] 쿼리 생성 기능과 반환 타입

메소드 이름으로 쿼리 생성

Spring Data JPA는 메서드 이름을 통해 쿼리를 작성해주는 쿼리 기능을 제공한다.

(공식 문서 : Spring Data JPA - Reference Documentation)

List<Member> findByUsernameAndAgeGreaterThan(String username, int age);

위 메서드 이름을 통해 실행도니느 쿼리는 다음과 같다.

select m from Member m where m.username = :username and m.age > :age"

 

이 기능은 보통 파라미터 개수가 적을 때 사용한다.

( 파라미터 수가 많아지면 메서드 이름이 너무 길어져 가독성이 떨어짐 )

그리고 엔티티의 필드명이 변경되면 인터페이스에 정의한 메서드 이름도 꼭 함께 변경해야 한다.

그렇지 않으면 애플리케이션을 시작하는 시점에 오류가 발생한다.

 

사용 방법

findHelloBy, countNumberNy 처럼 ...에 식별하기 위한 설명이 들어가도 되고 생략해도 된다.


@Query - 쿼리 직접 정의

@Query를 사용해서 직접 쿼리를 정의하는 방법으로 아래 포스팅 내용으로 대체한다.

 

[JPA] 사용자 정의 쿼리 작성과 파라미터 바인딩(@Query, @Param)

@Query Spring Data JPA를 사용할 때, 개발자가 원하는 쿼리를 직접 짜야 한다면, @Query 어노테이션을 사용하여 직접 쿼리를 작성할 수 있다. @Query 안에서 작성한 JPQL에 오타가 있다면 애플리케이션 실

hstory0208.tistory.com

 


반환 타입

스프링 데이터 JPA는 유연한 반환 타입 지원한다.

(공식 문서 : https://docs.spring.io/spring-data/jpa/docs/current/reference/html/#repository-query-return-types)

List<Member> findByUsername(String name); //컬렉션
Member findByUsername(String name); //단건
Optional<Member> findByUsername(String name); //단건 Optional

 

null

컬렉션의 경우 반환 결과가 없다면 null이 아닌 빈 컬렉션을 반환한다.

하지만, 단건 조회의 경우 결과가 없으면 null, 중복된 결과가 있으면 javax.persistence.NonUniqueResultException 예외가 발생한다.

 

이를 예방하기 위해 단건 조회시 다음과 같이 결과가 없을 때 따로 처리하는 방법을 사용하도록 하자.

Member member = memberRepository.findById(10L).orElseThrow(() -> new CustomException("찾고자 하는 멤버가 없습니다."));